سؤال

لدي عرض مفهرس بسيط.عندما أستفسر عنه، يكون الأمر بطيئًا جدًا.أولاً سأعرض لك المخطط والفهارس.ثم الاستفسارات البسيطة.وأخيرا شاشة خطة الاستعلام.

تحديث:إثبات الحل في أسفل هذا المنشور.

مخطط

وهذا هو ما يبدو :-

CREATE view [dbo].[PostsCleanSubjectView] with SCHEMABINDING AS
    SELECT PostId, PostTypeId, 
        [dbo].[ToUriCleanText]([Subject]) AS CleanedSubject
    FROM [dbo].[Posts]

بلدي الجبهة ToUriCleanText فقط يستبدل الأحرف المختلفة بحرف فارغ.على سبيل المثال.يستبدل جميع الأحرف "#" بـ "".

ثم أضفت فهرسين على هذا:-

الفهارس

فهرس المفتاح الأساسي (أي.الفهرس المجمع)

CREATE UNIQUE CLUSTERED INDEX [PK_PostCleanSubjectView] ON 
    [dbo].[PostsCleanSubjectView] 
(
    [PostId] ASC
)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
      SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF,
      ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

ومؤشر غير متفاوت

CREATE NONCLUSTERED INDEX [IX_PostCleanSubjectView_PostTypeId_Subject] ON 
    [dbo].[PostsCleanSubjectView] 
(
    [CleanedSubject] ASC,
    [PostTypeId] ASC
)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
      SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF,
      ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

الآن، يحتوي هذا على حوالي 25 ألف صف.لا شيء كبير على الإطلاق.

عندما أقوم بالاستعلامات التالية، يستغرق كلاهما حوالي 4 ثوانٍ فردية.ماهذا الهراء؟هذا ينبغي أن يكون..فورية في الأساس!

الاستعلام 1

SELECT a.PostId
FROM PostsCleanSubjectView a 
WHERE a.CleanedSubject = 'Just-out-of-town'

الاستعلام 2 (تمت إضافة عنصر بند آخر)

SELECT a.PostId
FROM PostsCleanSubjectView a 
WHERE a.CleanedSubject = 'Just-out-of-town' AND a.PostTypeId = 1

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

فيما يلي شاشة لخطة الاستعلام، إذا كان ذلك يساعد: -alt text

لاحظ أيضًا الفهرس الذي يستخدمه؟لماذا يستخدم هذا الفهرس؟

ذلك الفهرس ...

CREATE NONCLUSTERED INDEX [IX_Posts_PostTypeId_Subject] ON [dbo].[Posts] 
(
    [PostTypeId] ASC,
    [Subject] ASC
)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
      SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, 
      ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

لذا نعم، أي أفكار الناس؟

التحديث 1:تمت إضافة مخطط لـ udf.

CREATE FUNCTION [dbo].[ToUriCleanText]
(
    @Subject NVARCHAR(300)
)
RETURNS NVARCHAR(350) WITH SCHEMABINDING
AS 
BEGIN
   <snip>
   // Nothing insteresting in here. 
   //Just lots of SET @foo = REPLACE(@foo, '$', ''), etc.
END

التحديث 2:حل

نعم، كان ذلك لأنني لم أكن أستخدم الفهرس في العرض وكان علي التأكد يدويًا من عدم توسيع العرض.الخادم هو Sql Server 2008 Standard Edition.الجواب الكامل أدناه.وإليكم الدليل، WITH (NOEXPAND) alt text

أشكركم جميعا على مساعدتي في حل هذه المشكلة :)

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

المحلول

وماذا طبعة من SQL Server؟ وأعتقد أن المؤسسة فقط وطبعة المطور سوف تستخدم طرق العرض المفهرسة تلقائيا، بينما تدعم الآخرين باستخدام تلميحات الاستعلام.

SELECT a.PostId
FROM PostsCleanSubjectView a WITH (NOEXPAND)
WHERE a.CleanedSubject = 'Just-out-of-town' AND a.PostTypeId = 1

href="http://msdn.microsoft.com/en-us/library/ms181714.aspx" تلميحات استعلام (عمليات SQL) على MSDN :

<اقتباس فقرة>   

وليس توسيع عرض مفهرسة إلا إذا المشار إليها وجهة النظر مباشرة في الجزء SELECT من الاستعلام ومع (NOEXPAND) أو مع (NOEXPAND، INDEX (index_value [... ن])) غير محددة.

نصائح أخرى

أرى علامة @ في رمز الاستعلام في خطة التنفيذ الخاصة بك.هناك متغير سلسلة المعنية.

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


لقد اكتشف سيمون ذلك - ولكن إليك المزيد من التفاصيل المفيدة: http://msdn.microsoft.com/en-us/library/ms187373.aspx

إذا كان الاستعلام يحتوي على مراجع إلى أعمدة موجودة في طريقة العرض المفهرسة والجداول الأساسية، وحدد مُحسِّن الاستعلام أن استخدام طريقة العرض المفهرسة يوفر أفضل طريقة لتنفيذ الاستعلام، فإن مُحسِّن الاستعلام يستخدم الفهرس الموجود في طريقة العرض.تسمى هذه الوظيفة مطابقة العرض المفهرسة, ، وهو مدعوم فقط في إصدارات SQL Server Enterprise وDeveloper.

ومع ذلك، لكي يأخذ المُحسِّن في الاعتبار طرق العرض المفهرسة للمطابقة أو استخدام طريقة عرض مفهرسة يتم الرجوع إليها باستخدام تلميح NOEXPAND، يجب تعيين خيارات SET التالية على ON:

إذن، ما يحدث هنا هو ذلك مطابقة العرض المفهرسة لا يعمل.تأكد من أنك تستخدم إصدارات Enterprise أو Developer من Sql Server (على الأرجح).ثم تحقق من خيارات SET الخاصة بك وفقًا للمقال.

وأنا في الآونة الأخيرة بنيت على قاعدة بيانات كبيرة تحتوي على مئات الملايين من سجلات التفصيل الدعوة، وهناك بعض الوظائف كنت تستخدم في الاستفسارات والآراء التي والتفت إلى الأعمدة المحسوبة استمرت. هذا وعملت أفضل بكثير لأنني يمكن أن فهرس على عمود محسوب.

وكنت لا تستخدم SQL المؤسسة على الرغم من ذلك لم أحصل على الفرصة لاستخدام طرق العرض المفهرسة. هو عرض مفهرسة من المفترض أن تكون قادرة على مؤشر نتائج حتمية للUDF؟

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

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

هل تقييمها منطق الاستعلام نفسه مع الفهارس القياسية؟

وخلط في المنطق UDF يسبب بلبلة الامور اكثر.

وإذا كان كل ما أريده هو أن تستمر قيمة الإرجاع من UDF، والنظر في عمود محسوب استمر بدلا من طريقة عرض مفهرسة.

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