it-swarm.asia

هل يجب أن أستخدم العديد من فهارس الحقل الواحد ، بدلاً من فهارس محددة متعددة الأعمدة؟

هذا السؤال عن فعالية تقنية فهرسة SQL Server. أعتقد أنه يعرف باسم "تقاطع الفهرس".

أنا أعمل مع تطبيق SQL Server (2008) حالي يحتوي على عدد من مشكلات الأداء والاستقرار. قام المطورون ببعض الأشياء الغريبة في الفهرسة. لم أتمكن من الحصول على معايير قاطعة حول هذه القضايا ، ولا يمكنني العثور على أي وثائق جيدة حقًا على الإنترنت.

هناك العديد من الأعمدة القابلة للبحث في الجدول. قام المطورون بإنشاء فهرس عمود واحد على كل من الأعمدة القابلة للبحث. كانت النظرية هي أن SQL Server سيكون قادرًا على دمج (تقاطع) كل من هذه الفهارس للوصول بكفاءة إلى الجدول في معظم الظروف. فيما يلي مثال مبسط (يحتوي الجدول الحقيقي على المزيد من الحقول):

CREATE TABLE [dbo].[FatTable](
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [col1] [nchar](12) NOT NULL,
    [col2] [int] NOT NULL,
    [col3] [varchar](2000) NOT NULL, ...

CREATE NONCLUSTERED INDEX [IndexCol1] ON [dbo].[FatTable]  ( [col1] ASC )
CREATE NONCLUSTERED INDEX [IndexCol2] ON [dbo].[FatTable] ( [col2] ASC )

select * from fattable where col1 = '2004IN' 
select * from fattable where col1 = '2004IN' and col2 = 4

أعتقد أن فهارس الأعمدة المتعددة التي تستهدف معايير البحث أفضل بكثير ، ولكن قد أكون مخطئًا. لقد رأيت خطط استعلام تظهر أن SQL Server يقوم بمطابقة تجزئة على سعيي فهرس. ربما يكون هذا منطقيًا عندما لا تعرف كيف يتم البحث في الجدول؟ شكر.

36
RaoulRubin

ما تحتاجه هو تغطية الفهارس ، أي. الفهارس التي يمكن أن ترضي الاستعلام بمفردها. ولكن هناك مشكلة واحدة في مؤشر "التغطية": فهو يغطي استعلامًا محددًا . لذلك من أجل تطوير استراتيجية فهرسة جيدة ، تحتاج إلى فهم عبء عملك: ما الاستعلامات التي تصل إلى قاعدة البيانات ، أي منها حرج وأي منها لا ، كم مرة يتم تشغيل كل نوع من أنواع الاستعلام ، وما إلى ذلك ، إلخ وما إلى ذلك ، ثم تقوم بموازنة ذلك مقابل تكلفة الكتابة والتحديث لكل فهرس ، وهناك استراتيجية الفهرسة الخاصة بك. إذا بدا الأمر معقدًا ذلك لأنه معقد .

ومع ذلك ، يمكنك تطبيق بعض القواعد الأساسية. تغطي شبكة MSDN الأساسيات جيدًا:

هناك أيضًا عدد لا يحصى من المقالات التي ساهم بها المجتمع ، على سبيل المثال. تسجيل البث الشبكي - جوائز DBA Darwin: Index Edition .

وللإجابة عن سؤالك على وجه التحديد: فهارس منفصلة لكل عمود يمكن أن تعمل ، بشرط أن يكون لكل عمود انتقائية عالية (العديد من القيم المميزة ، تظهر كل قيم عدة مرات فقط في قاعدة البيانات). عادة ما تعمل خطة الوصول الناتجة باستخدام رابط التجزئة بين عمليتي فحص نطاق الفهرس بشكل جيد. الأعمدة ذات الانتقائية المنخفضة (عدد قليل من القيم المميزة ، تظهر كل قيمة عدة مرات في قاعدة البيانات) لا معنى لفهرستها من تلقاء نفسها ، سيتجاهلها محسن الاستعلام بكل بساطة. ومع ذلك ، فإن أعمدة الانتقائية المنخفضة مرات عديدة تجعل المفاتيح مركبة جيدة عندما يتم إقرانها بعمود انتقائي مرتفع.

39
Remus Rusanu