سؤال

كنت أعمل مع استعلام كتبت اليوم كان لتغيير التعليمات البرمجية من WHERE شرط لاستخدام مرشح في(قائمة الأشياء) بدلا من استخدام شيء مثل

item_desc = 'item 1'
OR item_desc = 'item 2'
OR item_desc = 'item 3'
OR item_desc = 'item 4'

ركض ما سبق لمدة 15 دقيقة ولم يعيد شيئا ، لكن ما يلي أعطاني النتيجة المحددة في 1.5 دقيقة

item_desc IN (
'item 1'
,'item 2'
,'item 3'
,'item 4'
)

فعلت هذا في سكل وأنا أتساءل لماذا في (قائمة العناصر) أداء أسرع بكثير ثم البيان أو.

-- تحرير -- سكل سيرفر 2008 ، أعتذر عن عدم وضع هذا الشيء من المعلومات في المقام الأول.

هنا هو الاستعلام في مجمله باستخدام OR البيانات:

DECLARE @SD DATETIME
DECLARE @ED DATETIME
SET @SD = '2013-06-01';
SET @ED = '2013-06-15';

-- COLUMN SELECTION
SELECT PV.PtNo_Num AS 'VISIT ID'
, PV.Med_Rec_No AS 'MRN'
, PV.vst_start_dtime AS 'ADMIT'
, PV.vst_end_dtime AS 'DISC'
, PV.Days_Stay AS 'LOS'
, PV.pt_type AS 'PT TYPE'
, PV.hosp_svc AS 'HOSP SVC'
, SO.ord_no AS 'ORDER NUMBER'
--, SO.ent_dtime AS 'ORDER ENTRY TIME'
--, DATEDIFF(HOUR,PV.vst_start_dtime,SO.ent_dtime) AS 'ADM TO ENTRY HOURS'
, SO.svc_desc AS 'ORDER DESCRIPTION'
, OSM.ord_sts AS 'ORDER STATUS'
, SOS.prcs_dtime AS 'ORDER STATUS TIME'
, DATEDIFF(DAY,PV.vst_start_dtime,SOS.prcs_dtime) AS 'ADM TO ORD STS IN DAYS'

-- DB(S) USED
FROM smsdss.BMH_PLM_PtAcct_V PV
JOIN smsmir.sr_ord SO
ON PV.PtNo_Num = SO.episode_no
JOIN smsmir.sr_ord_sts_hist SOS
ON SO.ord_no = SOS.ord_no
JOIN smsmir.ord_sts_modf_mstr OSM
ON SOS.hist_sts = OSM.ord_sts_modf_cd

-- FILTER(S)
WHERE PV.Adm_Date BETWEEN @SD AND @ED
AND SO.svc_cd = 'PCO_REMFOLEY'
OR SO.svc_cd = 'PCO_INSRTFOLEY'
OR SO.svc_cd = 'PCO_INSTFOLEY'
OR SO.svc_cd = 'PCO_URIMETER'

AND SO.ord_no NOT IN (
    SELECT SO.ord_no
    FRROM smsdss.BMH_PLM_PtAcct_V PV
    JOIN smsmir.sr_ord SO
    ON PV.PtNo_Num = SO.episode_no
    JOIN smsmir.sr_ord_sts_hist SOS
    ON SO.ord_no = SOS.ord_no
    JOIN smsmir.ord_sts_modf_mstr OSM
    ON SOS.hist_sts = OSM.ord_sts_modf_cd
    WHERE OSM.ord_sts = 'DISCONTINUE'
    AND SO.svc_cd = 'PCO_REMFOLEY'
    OR SO.svc_cd = 'PCO_INSRTFOLEY'
    OR SO.svc_cd = 'PCO_INSTFOLEY'
    OR SO.svc_cd = 'PCO_URIMETER'
)
ORDER BY PV.PtNo_Num, SO.ord_no, SOS.prcs_dtime

يعطيكم الصّحة,

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

المحلول

إجابة أوليسكي غير صحيحة.ل سكل سيرفر 2008 ، و IN قائمة يحصل ريفاكتوريد إلى سلسلة من OR البيانات.قد يكون مختلفا في القول الخلية.

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

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

تحديث

من المحتمل أن يكون المصدر الفعلي للتباين هو الاستعلامات غير مكافئ.لديك اثنين مختلفة OR القوائم أدناه:

WHERE PV.Adm_Date BETWEEN @SD AND @ED
AND SO.svc_cd = 'PCO_REMFOLEY'
OR SO.svc_cd = 'PCO_INSRTFOLEY'
OR SO.svc_cd = 'PCO_INSTFOLEY'
OR SO.svc_cd = 'PCO_URIMETER'

و لاحقا

 WHERE OSM.ord_sts = 'DISCONTINUE'
    AND SO.svc_cd = 'PCO_REMFOLEY'
    OR SO.svc_cd = 'PCO_INSRTFOLEY'
    OR SO.svc_cd = 'PCO_INSTFOLEY'
    OR SO.svc_cd = 'PCO_URIMETER'

في كل من تلك WHERE الجمل ، أسبقية المشغل (حيث يتم التعامل معها من قبل أو) تعني أن المنطق الفعلي الذي يديره المحرك هو:

WHERE (ConditionA AND ConditionB)
OR ConditionC
OR ConditionD
OR ConditionE

إذا قمت باستبدال OR قوائم مع IN التعبير ، سيكون المنطق:

WHERE ConditionA
AND (ConditionB OR ConditionC OR ConditionD OR ConditionE)

وهو مختلف جذريا.

نصائح أخرى

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

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

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

عند استخدام IN, ، أنت تصنع جدولا مرتجلا وتصفية باستخدام تقنيات الجمع بين الجداول الأكثر كفاءة.

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

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