এসকিউএল ইন () বনাম ওআর


23

আমি আজকে লিখেছি এমন একটি প্রশ্নের সাথে কাজ করছি যেটির WHEREমতো কিছু ব্যবহার না করে একটি আইএন (স্টাফের তালিকা) ফিল্টার ব্যবহারের জন্য ধারাটি থেকে কোডটি পরিবর্তন করতে হয়েছিল had

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'
)

আমি এসকিউএল-এ এটি করেছি এবং অবাক হয়েছি কেন আইআর (আইটেমের তালিকা) তারপরে ওয়ান স্টেটমেন্টের পরে এত দ্রুত সঞ্চালিত হয়েছিল।

- সম্পাদনা - এসকিউএল সার্ভার ২০০৮, আমি এই বিটটিকে প্রথম স্থানে না রাখার জন্য ক্ষমা চাইছি।

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

ধন্যবাদ,


10
আপনি কি জিজ্ঞাসা পরিকল্পনা তাকান?

1
এটি অত্যন্ত বাস্তবায়ন নির্দিষ্ট। আপনি কোন ডিবিএমএস ব্যবহার করছেন?
জেমস অ্যান্ডারসন

আমি ক্যোয়ারী পরিকল্পনার দিকে নজর দিইনি, আমি জানতাম না যে এটি কোয়েরি সুনির্দিষ্ট ছিল কিনা বা এটি আসলে কোনও বিষয় ছিল, যেমন এটি সর্বদা এই ফ্যাশনে কাজ করবে।
এমসিপি_ইন ফিল্টার

3
@ এমসিপি_ইনফিল্টর সুতরাং কার্যকর করার পরিকল্পনাগুলি সমতুল্য হবে না কারণ যুক্তিটি সমতুল্য নয়। ORউপরের প্রকৃত ক্যোয়ারিতে আপনি যেমন করেন তেমন ব্যবহার করার সময় আপনি ইঞ্জিনকে শর্ট সার্কিটের অনুমতি দিন। WHERE A AND B OR CA এবং B মিথ্যা হলেও সি-কে সত্য বলে মূল্যায়ন করবে। আপনি যদি WHERE A and B OR C OR D OR E OR Fউপরে বলেন যে আপনি বলেন , তবে AND এটি ফ্যাক্টর আউট করা যেতে পারে। প্রকৃত সমতুল্য যুক্তিবিজ্ঞান encapsulate হবে ORপ্রথম বন্ধনী উপরে সিরিজ তাই তারা একটি সেট হিসাবে গণ্য করা হয়: WHERE A AND (B OR C OR D OR E)। এইভাবে INএকজনকে চিকিত্সা করা হয়।
জেএনকে

5
এসকিউএল সার্ভারে অপারেটর নজিরটি নির্দিষ্ট করা হয়েছে যা ANDআগে পরিচালিত হয় OR, সুতরাং উপরের আপনার জিজ্ঞাসার সমতুল্য 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'যার অর্থ শেষ 3 শর্তগুলির মধ্যে যদি সত্য হয় তবে এটি বাকী মূল্যায়ন শর্ট সার্কিট করতে সক্ষম হবে।
জেএনকে

উত্তর:


28

ওলেস্কির উত্তরটি ভুল। এসকিউএল সার্ভার ২০০৮-এর জন্য, একটি 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)

যা মূলত আলাদা।


2
@ এমসিপি_ইনফিল্টর ভাল ধারণা অনুমান করার ক্ষেত্রে এটিই সমস্যা: আপনার উভয়ের জন্য সত্যিকারের এক্সিকিউটিভ পরিকল্পনা নেওয়া উচিত এবং কোনও পার্থক্য আছে কিনা তা দেখুন, আমার মনে হয় না সেখানে হবে।
জেএনকে

4
ঠিক আছে যদি আপনার কাছে ডিবি প্রশ্নে উন্নত থাকে, আপনি ডেটাবেস অ্যাডমিনিস্ট্রেটরদের কাছেও জানতে চাইতে পারেন - সম্পূর্ণ প্রকাশ, আমি সেখানে একজন পরিচালক, তবে এটি যদি একটি উন্নত এসকিউএল বা এসকিউএল অপ্টিমাইজেশন প্রশ্ন থাকে তবে আমাদের বিশেষত এসকিউএল সার্ভারের জন্য একাধিক বিশেষজ্ঞ রয়েছে
জেএনকে

1
আমি কেবল দুটি কার্যকর করার পরিকল্পনা দেখেছি এবং সেগুলি ভিন্ন। ওআর স্টেটমেন্টগুলির সাথে ক্যোয়ারী ক্লাস্টারড ইনডেক্স স্ক্যানের ব্যয়ের %৮% গ্রহণ করে, যেখানে আইএন স্টেটমেন্টটি ২%%, সাথে সাথে কম প্রয়োগের পদক্ষেপ বলে মনে হয়।
এমসিপি_ইন ফিল্টার

3
@ এমসিপি_আইন ফিল্টার প্রয়োজন নেই, শীর্ষে আপনার মূল পোস্টে আমার মন্তব্য দেখুন। প্রকৃত ক্যোয়ারিতে আপনার ধারাটিতে থাকা অন্যান্য শর্তের কারণে INউপরেরগুলির সমতুল্য নয় । মূলত প্রশ্নগুলি বিভিন্ন ফলাফল প্রদান করবে। ORWHERE
জেএনকে

3
@ এমসিপি_ইন্টিলেটর ডিবিএ.এসইতে অভিন্ন প্রশ্ন পোস্ট করার দরকার নেই, জেএনকে উত্তর দিয়েছে (এবং আপনিও সেখানে অনুরূপ উত্তর পেয়ে যাবেন।) আপনি যদি সেখানে ("স্থানান্তরিত") স্থানান্তর করতে চান তবে আপনি সর্বদা এটি পতাকাঙ্কিত করতে পারেন (আপনার প্রশ্ন) আপনি কি চান মন্তব্য বাক্সে উল্লেখ। মোডগুলি যত্ন নেবে।
ypercubeᵀᴹ

7

বলার সর্বোত্তম উপায় হ'ল আসল কোয়েরি প্ল্যানটি এর মতো কিছু ব্যবহার করে দেখা EXPLAIN। এটি আপনাকে ডিবিএমএস ঠিক কী করছে তা বলতে হবে এবং তারপরে এটি আরও দক্ষ কেন আপনি আরও ভাল ধারণা পেতে পারেন।

এই বলে যে, দুটি টেবিলের (যেমন যোগ দেয়) এর মধ্যে অপারেশন করতে ডিবিএমএস সিস্টেমগুলি সত্যই ভাল। অপ্টিমাইজারের বেশিরভাগ সময় অনুসন্ধানগুলির এই অংশগুলিতে ব্যয় করা হয় কারণ এগুলি সাধারণত বেশি ব্যয়বহুল।

উদাহরণস্বরূপ, ডিবিএমএস সেই INতালিকাটিকে বাছাই করতে পারে এবং একটি সূচক ব্যবহার করে item_descখুব দ্রুত ফলাফলগুলি ফিল্টার করে। আপনি যখন প্রথম উদাহরণের মতো একগুচ্ছ নির্বাচনের তালিকা তৈরি করেন তখন আপনি সেই অপ্টিমাইজেশনটি করতে পারবেন না।

আপনি যখন ব্যবহার করবেন IN, আপনি এই আরও দক্ষ টেবিলের সমন্বয় কৌশলগুলি ব্যবহার করে একটি অনড় টেবিল তৈরি করছেন এবং ফিল্টারিং করছেন।

সম্পাদনা : ওপি নির্দিষ্ট ডিবিএমএস উল্লেখ করার আগে আমি এই উত্তরটি পোস্ট করেছি। এসকিউএল সার্ভার এই ক্যোয়ারির সাথে কী আচরণ করে তা প্রমাণিত হয় না, তবে অন্যান্য ডিবিএমএস সিস্টেমের ক্ষেত্রে এটি বৈধ হতে পারে। আরও নির্দিষ্ট, নির্ভুল উত্তরের জন্য জেএনকে-র উত্তর দেখুন answer


আমি কল্পনা করব যে কার্ডিনালিটির সাথে এর অনেক কিছুই আছে। এটি INএত দ্রুত হবে না যদি এটির মধ্যে 100 টি রেকর্ড, বা এক হাজার সহ সাব-সাবলেট হয়।
রবার্ট হার্ভে

পছন্দ করেছেন
ওলেক্সি

ধন্যবাদ @ ওলেকসী আমি জানতাম না যে ডিবিএমএস আইএন বিবৃতিটিকে একটি
অপ্রস্তুত

1
-1 - এসকিউএল সার্ভারে INবিবৃতিটি কোনও টেবিলে রূপান্তরিত হয় না, এটি একই ধরণের ORs এর সিরিজের সাথে বিবেচিত হয় ।
জেএনকে

2
@ কাতানা ৩১৪ যদি এসকিউএল সার্ভারের একটি কীওয়ার্ড হয় (যা ওপি ব্যবহার করছে) আমি আপনার সাথে একমত হব, তবে এটি তেমন প্রাসঙ্গিক নয়।
জেএনকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.