الاستعلام الأمثل - لماذا هذه السرعة حتى الاستعلام؟

StackOverflow https://stackoverflow.com/questions/1347837

سؤال

وأنا باستخدام TOAD السعي لSQL Server على SQL خادم 2000 الخادم.

وهنا هو الاستعلام الخاص بي:

SELECT CASE SLCE.GroupName WHEN 'Other' THEN ARM.FBCOMPANY 
                           WHEN 'Inter Co.' THEN ARM.FBCOMPANY 
                           ELSE SLCE.GroupName END AS [Company Name], 
       ARM.fcustno AS [Cust No], 
       ARM.fbcompany AS [Cust Name], 
       ARM.fcinvoice AS [Invoice No], 
       ARM.fdgldate AS [Post Date], 
       year(arm.fdgldate) AS [Year Posted], 
       CASE ARM.fcsource WHEN 'S' THEN 'Shipper' 
                         WHEN 'O' THEN 'Sales Order' 
                         WHEN 'R' THEN 'Receiver' 
                         WHEN 'C' THEN 'Customer' 
                         ELSE ARM.fcsource END AS [Source Doc Type], 
       CASE ARM.fcstatus WHEN 'N' THEN 'New' 
                         WHEN 'U' THEN 'Unpaid' 
                         WHEN 'P' THEN 'Partially Paid' 
                         WHEN 'F' THEN 'Paid in Full' 
                         WHEN 'H' THEN 'Held' 
                         WHEN 'V' THEN 'Voided' 
                         ELSE ARM.fcstatus END AS [Invoice Status], 
       ARM.fpono AS [Cust PO No], 
       ARM.fsalespn AS [Sales Person], 
       ARI.fitem AS [Item No], 
       ARI.fprodcl AS [Prod Class], 
       ARI.fshipkey AS [Qty Invoiced], 
       ARI.ftotprice AS [Net Invoiced], 
       ARI.fpartno AS [Part No], 
       ARI.frev AS [Part Rev], 
       cast(ARI.fmdescript AS VARCHAR(20)) AS [Part Description], 
       ARM.fsono AS [Sales No], 
       ARI.fsokey AS [SO Rels Key], 
       ARI.fordqty AS [Qty Ordered], 
       RED.[YEAR] AS [Year], 
       RED.PERIOD AS [RF Period] 
  FROM dbo.armast ARM 
       INNER JOIN dbo.aritem ARI 
          ON ARM.FCINVOICE = ARI.FCINVOICE 
       INNER JOIN slcdpm SLC 
          ON SLC.fcustno = ARM.fcustno 
       LEFT OUTER JOIN slcdpm_ext SLCE 
         ON SLC.identity_column = SLCE.fkey_id 
       INNER JOIN REDFRIDAYDATES..TBLREDFRIDAYALLDATES RED 
          ON RED.date = CAST (FLOOR (CAST (ARM.fdgldate AS FLOAT)) AS DATETIME) 
 WHERE ARM.fcstatus <> 'V' 
   AND RED.[YEAR] = year(getdate()) 
   AND ari.frev = 'REP' 
   AND ARI.fsalesacc IN ('4010001', '4010002', '4010003', '4010004', '4010005', '4010006', '4010007', '4010008', '4010009', '4010010', '4010018', '4010019', '4010020', '4010021', '4010031', '4010050', '4022000', '4031000', '4045000', '4055000', '4057000', '4060000', '4070000')

وهنا هو الخيار الضفدع (مع وجود اختلافات الضوء) هو:

INNER JOIN dbo.aritem ARI 
          ON ARM.FCINVOICE = ***COALESCE (ARI.FCINVOICE , ARI.FCINVOICE)*** 
       INNER JOIN slcdpm SLC 
          ON SLC.fcustno = ARM.fcustno 
       LEFT OUTER JOIN slcdpm_ext SLCE 
         ON SLC.identity_column = SLCE.fkey_id 
       INNER JOIN REDFRIDAYDATES..TBLREDFRIDAYALLDATES RED 
          ON RED.date = CAST (FLOOR (CAST (ARM.fdgldate AS FLOAT)) AS DATETIME) 
 WHERE ARM.fcstatus <> 'V' 
   AND RED.[YEAR] = year(getdate()) 
   AND ari.frev = 'REP' 
   AND ARI.fsalesacc IN ('4010001', '4010002', '4010003', '4010004', '4010005', '4010006', '4010007', '4010008', '4010009', '4010010', '4010018', '4010019', '4010020', '4010021', '4010031', '4010050', '4022000', '4031000', '4045000', '4055000', '4057000', '4060000', '4070000') 
   ***AND ARI.[fpartno] >= CHAR(0)***

ويمكن للشخص من فضلك قل لي لماذا أن تتجمع وسرعة إضافية وبيان يصل هذا الاستعلام بنسبة تزيد عن 50٪؟

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

المحلول

هل اتخذت نظرة على خطط التنفيذ الفعلي. يجب أن تظهر هذه يجب المناهج المختلفة أن SQL Server أخذت في تنفيذ هذه الاستعلامات.

نصائح أخرى

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

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

وA المهرج الكامل:

وانا ذاهب الى اعتقد ان fpartno لديه حالة "غير فارغة" على ذلك (حتى التصفية وأضاف يمر دائما)، والتي العلجوم يحدث أن نعرف أن سيكلسرفير لا يكفي الذكية للكشف عن> = CHAR (0) غير دائما صحيح او صادق. ولذلك فإن هذا يشير إلى أن العلجوم هو محاولة لتوجيه وبطريقة مائلة جدا، ومحسن لاستخدام شيء له fpartno في ذلك. أن شيئا ما يمكن أن يكون مؤشر مركب على (fcinvoice، fpartno) .. هل لديك واحدة من تلك؟

وقال مثل الآخرين، وشرح خطة يجب أن يثبت مفيدة في شرح سر.

وأيا من هذه التغيرات لها أي تأثير على المعنى المنطقي للاستعلام (أي أنها "لا مكتب خدمات المشاريع")

والتأثير المادي فقط أن تتجمع على شرط ON ستكون لمنع محسن من محاولة استخدام فهرس لARI.FCINVOICE.

وبالمثل، فإن الأثر المادي فقط أن "> = CHAR (0)" يمكن أن يكون على محسن <م> قد يكون لهمز أنه في النظر في استخدام المسح نطاق مفهرسة (أو كما تسعى أ) على مؤشر الذي كان ARI. [fpartno] في ذلك.

وهكذا استنتاجي سيكون ذلك TOAD تحاول التلاعب محسن إلى استخدام مؤشر معين دون الواقع <م> إجبار لاستخدام هذا المؤشر مع تلميح صريح. في الواقع، وهذا النوع من ذكي كما أن المشكلة الحقيقية مع تلميحات محسن T-SQL هو تبعيات والهشاشة.

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