Tôi đã làm việc với một truy vấn mà tôi đã viết hôm nay phải thay đổi mã từ WHERE
mệnh đề để sử dụng bộ lọc IN (danh sách các công cụ) thay vì sử dụng một cái gì đó như
item_desc = 'item 1'
OR item_desc = 'item 2'
OR item_desc = 'item 3'
OR item_desc = 'item 4'
Ở trên chạy trong 15 phút và không trả lại gì, nhưng sau đây đã cho tôi kết quả của tôi được đặt trong 1,5 phút
item_desc IN (
'item 1'
,'item 2'
,'item 3'
,'item 4'
)
Tôi đã làm điều này trong SQL và tự hỏi tại sao IN (danh sách các mục) thực hiện nhanh hơn nhiều so với câu lệnh OR.
- EDIT - SQL Server 2008, tôi xin lỗi vì đã không đưa thông tin này vào vị trí đầu tiên.
Đây là toàn bộ Truy vấn bằng cách sử dụng các OR
câu lệnh:
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
Cảm ơn bạn,
OR
như bạn làm trong truy vấn thực tế ở trên, bạn cho phép động cơ ngắn mạch. WHERE A AND B OR C
sẽ đánh giá là đúng ngay cả khi A VÀ B sai, nếu C đúng. Nếu bạn nói WHERE A and B OR C OR D OR E OR F
như bạn làm ở trên, AND
có thể được bao gồm. Logic tương đương thực tế sẽ gói gọn các OR
chuỗi ở trên trong ngoặc đơn để chúng được coi là một tập hợp : WHERE A AND (B OR C OR D OR E)
. Đây là cách an IN
được điều trị.
AND
được xử lý trước đó OR
, vì vậy truy vấn của bạn ở trên tương đương với 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'
điều kiện có nghĩa là nếu bất kỳ điều kiện nào trong 3 điều kiện cuối cùng là đúng thì nó sẽ có thể làm ngắn mạch phần còn lại của đánh giá.