क्या ये दोनों प्रश्न तार्किक रूप से समतुल्य हैं?


10

क्या ये दोनों प्रश्न तार्किक रूप से समतुल्य हैं?

DECLARE @DateTime DATETIME = GETDATE()

प्रश्न 1

SELECT *
FROM   MyTable
WHERE  Datediff(DAY, LogInsertTime, @DateTime) > 7   

प्रश्न २

SELECT *
FROM   MyTable
WHERE  LogInsertTime < @DateTime - 7 

यदि वे तार्किक रूप से समतुल्य नहीं हैं, तो क्या आप मुझे पहली क्वेरी के तार्किक समकक्ष दे सकते हैं ताकि WHERE क्लॉज प्रभावी रूप से एक इंडेक्स (यानी फंक्शन रैपिंग को खत्म कर सके) का उपयोग कर सके?


किस प्रकार का LogInsertTimeहै?
dezso

1
एक नज़र रखना knowdotnet.com/articles/getdatereturn.html
a1ex07

LogInsertTime एक DATETIME
Alf47

जवाबों:


15

क्या आपके द्वारा पोस्ट किए गए दो प्रश्न तार्किक रूप से समान हैं, अप्रासंगिक हैं; आपको उनमें से किसी का भी उपयोग नहीं करना चाहिए। मैं आपको कुछ चीजों से दूर करने की कोशिश करूंगा:

  1. जब भी संभव हो, स्तंभों पर फ़ंक्शन लागू करने से बचने का प्रयास करें। यह हमेशा के रूप में अच्छा है, और ज्यादातर बेहतर है, स्थिरांक और स्तंभों के खिलाफ उन गणनाओं को रखने के लिए - यह SARGability को नष्ट कर सकता है और उन स्तंभों पर अनुक्रमित बेकार कर सकता है। इस मामले में, मैं क्वेरी 2 को अधिक पसंद करता हूं, खासकर यदि LogDateTimeअनुक्रमित (या कभी भी हो सकता है)।
  2. मुझे शॉर्टहैंड डेट गणित पसंद नहीं है और मैं इसके खिलाफ सलाह देता हूं। ज़रूर, यह टाइप करने के लिए तेज़ है, लेकिन कोशिश करें कि DATEडेटा प्रकार के साथ और आपको एक बदसूरत त्रुटि मिलेगी। इसे वर्तनी के लिए बहुत बेहतर है, जैसे:

    WHERE LogInsertTime < DATEADD(DAY, -7, @DateTime);

मैं सहमत हूं, मेरा लक्ष्य क्वेरी 1 को क्वेरी 2 के समान कुछ में बदलना था ताकि सूचकांक को प्रभावी ढंग से उपयोग किया जा सके। आपकी मदद के लिए धन्यवाद
15:47 पर Alf47

8

मैं निम्नलिखित व्यंग्यात्मक क्वेरी का उपयोग करूंगा:

SELECT * FROM MyTable WHERE LogInsertTime < DATEADD(DAY, -7, @DateTime)

कारण: मेरा मानना ​​है कि @ DateTime-7 का परिणाम प्रलेखित नहीं है। यहां तक ​​कि अगर यह सिर्फ DATEADD (DAY, -7, @ डेटाइम) के बराबर होता है, तो यह बाद के रिलीज में टूट सकता है।


महान वही है जो मैं देख रहा था, धन्यवाद
Alf47

2
यह है वास्तव में, दस्तावेज और अच्छी तरह से परिभाषित : - (Subtract): Subtracts two numbers (an arithmetic subtraction operator). Can also subtract a number, in days, from a date.। फिर भी, मैं मानता हूँ कि स्पष्ट तिथि कार्यों का उपयोग करने से परिणामी क्वेरी "अंकगणितीय ऑपरेटर जादू" की तुलना में अधिक पठनीय और बनाए रखने योग्य हो जाती है।
हिनजी

6

वे समकक्ष नहीं हैं। रिकॉर्ड जो 7 दिन पहले के हैं, लेकिन दिन के वर्तमान समय से पहले - केवल क्वेरी # 2 में वापस कर दिए जाएंगे:

DATEADDफ़ंक्शन का उपयोग करते हुए दिनों की तुलना करते समय , यह समय के भाग को ध्यान में नहीं रखता है । रविवार और सोमवार की तुलना करते समय फ़ंक्शन 1 वापस आ जाएगा, समय की परवाह किए बिना।

डेमो:

DECLARE @MyTable TABLE(pk INT, LogInsertTime DATETIME);

INSERT @MyTable
VALUES (1, DATEADD(HOUR, 1, CAST(DATEADD(DAY, -7, CAST (GETDATE() AS DATE))AS DATETIME))),
(2, DATEADD(HOUR, 23, CAST(DATEADD(DAY, -7, CAST (GETDATE() AS DATE)) AS DATETIME)));

DECLARE @DateTime DATETIME = GETDATE();

SELECT *
FROM @MyTable
WHERE DATEDIFF(DAY, LogInsertTime, @DateTime) > 7;

-- 0 records.

SELECT *
FROM @MyTable
WHERE LogInsertTime < @DateTime - 7;
-- 1 record.

पहली क्वेरी का तार्किक समतुल्य जो संभावित अनुक्रमणिका उपयोग को सक्षम करेगा, या तो समय के भाग को हटाने @DateTimeया समय निर्धारित करने के लिए है 0:00:00:

SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);

पहली क्वेरी किसी सूचकांक का उपयोग नहीं कर पाने LogInsertTimeका कारण यह है कि कॉलम किसी फ़ंक्शन के भीतर दफन है। क्वेरी # 2 कॉलम की तुलना निरंतर मान से करता है जो ऑप्टिमाइज़र को एक इंडेक्स चुनने में सक्षम बनाता है LogInsertTime

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.