سؤال

لقد قرأت للتو أن VARCHAR(MAX) نوع البيانات (والتي يمكن تخزين مقربة من 2GB من شار البيانات) هو المستحسن استبدال TEXT نوع البيانات في SQL Server 2005 التالي إصدارات SQL SERVER.

إذا كنت ترغب في البحث داخل عمود في أي سلسلة ، والتي العملية أسرع ؟

  1. باستخدام ال LIKE شرط ضد VARCHAR(MAX) عمود ؟

    WHERE COL1 LIKE '%search string%'

  2. باستخدام TEXT العمود ووضع فهرس النص الكامل/كتالوج على هذا العمود ، ثم البحث باستخدام CONTAINS الحدوث ؟

    WHERE CONTAINS (Col1, 'MyToken')

هل كانت مفيدة؟

المحلول

على VARCHAR(MAX) نوع بديل TEXT.الفرق الأساسي هو أن TEXT اكتب دائما تخزين البيانات في النقطة حين VARCHAR(MAX) نوع محاولة لتخزين البيانات مباشرة في الصف ما لم يكن يتجاوز 8k الحد عند هذه النقطة لأنه يخزن في فقاعة.

باستخدام مثل البيان متطابقة بين أنواع البيانات.وظائف إضافية VARCHAR(MAX) يعطيك أنها يمكن أن تستخدم أيضا مع = و GROUP BY مثل أي أخرى VARCHAR عمود يمكن أن يكون.ومع ذلك, إذا كان لديك الكثير من البيانات سيكون لديك مجموعة كبيرة مشكلة الأداء باستخدام هذه الأساليب.

فيما إذا كان يجب عليك استخدام LIKE إلى البحث ، أو إذا كان يجب عليك استخدام فهرسة نص كامل و CONTAINS.هذا السؤال هو نفسه بغض النظر عن VARCHAR(MAX) أو TEXT.

إذا كنت تبحث عن كميات كبيرة من النص والأداء هو المفتاح ثم يجب عليك استخدام فهرس النص الكامل.

LIKE هو أبسط لتنفيذ وغالبا ما مناسبة كميات صغيرة من البيانات ، ولكن له سيئة للغاية الأداء مع البيانات الكبيرة بسبب عدم قدرته على استخدام فهرس.

نصائح أخرى

عن نص كبير ، فهرس النص الكامل هو كثيرا بشكل أسرع.ولكن يمكنك فهرس النص الكامل varchar(max)وكذلك.

لا يمكنك البحث في حقل النص دون تحويله من نص إلى varchar.

declare @table table (a text)
insert into @table values ('a')
insert into @table values ('a')
insert into @table values ('b')
insert into @table values ('c')
insert into @table values ('d')


select *
from @table
where a ='a'

هذا خطأ:

The data types text and varchar are incompatible in the equal to operator.

Wheras هذا لا:

declare @table table (a varchar(max))

ومن المثير للاهتمام ، LIKE لا يزال يعمل ، أي

where a like '%a%'
  • التعريف الأساسي

TEXT و VarChar(MAX) هي Unicode كبيرة طول متغير نوع بيانات حرف ، والتي يمكن تخزين أقصى 2147483647 غير أحرف Unicode (أيأقصى سعة التخزين:2GB).

  • أي واحد للاستخدام ؟

كما في MSDN الرابط مايكروسوفت تلمح إلى تجنب استخدام النص نوع البيانات و سيتم إزالته في الإصدارات المستقبلية من Sql Server.Varchar(Max) هو اقترح نوع البيانات لتخزين سلسلة كبيرة القيم بدلا من نوع بيانات نص.

  • في الصف أو خارج الصف التخزين

بيانات Text نوع العمود يتم تخزينها خارج الصف في فصل لوب صفحات البيانات.صف في الجدول صفحة البيانات سوف يكون لها سوى 16 بايت مؤشر إلى البيانات LOB صفحة فيها البيانات الفعلية الحالية.في حين البيانات Varchar(max) نوع العمود يتم تخزينها في الصف إذا كان أقل من أو يساوي 8000 بايت.إذا Varchar(max) قيمة العمود هو عبور 8000 بايت ثم Varchar(max) عمود القيمة المخزنة في فصل البيانات LOB صفحات الصف سوف يكون فقط على 16 بايت مؤشر إلى البيانات LOB صفحة فيها البيانات الفعلية الحالية.لذلك In-Row Varchar(Max) هو جيد بالنسبة عمليات البحث والاسترجاع.

  • دعم/وظائف غير معتمد

بعض وظائف سلسلة شركات أو بنيات التي لا تعمل على نوع النص عمود ، ولكن يعملون على VarChar(Max) نوع العمود.

  1. = يساوي المشغل على VarChar(Max) نوع العمود
  2. مجموعة من شرط على VarChar(Max) نوع العمود

    • نظام IO الاعتبارات

كما نعلم أن VarChar(Max) نوع العمود يتم تخزين القيم الخروج من الصف إلا إذا كان طول القيمة المخزنة في أكثر من 8000 بايت أو لم تكن هناك مساحة كافية في الصف ، وإلا فإنه سيتم تخزينه في الصف.حتى لو كان أكثر من القيم المخزنة في VarChar(Max) عمود كبيرة وتخزينها خارج الصف ، استرجاع البيانات السلوك مماثلة تقريبا لتلك التي من نوع النص عمود.

ولكن إذا كان معظم القيم المخزنة في VarChar(Max) نوع الأعمدة هي صغيرة بما يكفي لتخزين في الصف.ثم استرجاع البيانات حيث لوب الأعمدة لا يتم تضمين يتطلب أكثر عدد من صفحات البيانات إلى قراءة مثل لوب عمود القيمة المخزنة في الصف في نفس صفحة البيانات فيها غير لوب عمود القيم المخزنة.ولكن إذا حدد الاستعلام يتضمن لوب عمود ثم أنه يتطلب أقل عدد من الصفحات على قراءة من أجل استرجاع البيانات بالمقارنة مع نوع النص الأعمدة.

الختام

استخدام VarChar(MAX) نوع البيانات بدلا من TEXT للحصول على أداء جيد.

المصدر

في حالة استخدام MS Access (وخاصة الإصدارات القديمة مثل 2003) كنت اضطر لاستخدام TEXT نوع البيانات في SQL Server مثل MS Access لا تعترف nvarchar(MAX) مثل حقل مذكرة في الوصول ، في حين TEXT يعتبر مذكرة الميدان.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top