الاستعلام الأمثل - لماذا هذه السرعة حتى الاستعلام؟
-
20-09-2019 - |
سؤال
وأنا باستخدام 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 هو تبعيات والهشاشة.