Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

क्या कोई दो प्रश्नों के बीच अंतर समझा सकता है?

getdate() एक रनटाइम है निरंतर कार्य और प्रति फ़ंक्शन संदर्भ में केवल एक बार मूल्यांकन किया जाता है, यही वजह है कि

SELECT GETDATE()
FROM SomeBigTable

क्वेरी चलाने में कितना भी समय लगे, सभी पंक्तियों के लिए समान परिणाम लौटाएगा।

हालांकि दोनों में अंतर है। जैसा कि पहला एक चर का उपयोग करता है और योजना को संकलित किया जाता है इससे पहले कि चर को SQL सर्वर को सौंपा जाए (एक पुनर्संकलन की अनुपस्थिति में) मान लें कि 30% पंक्तियों को वापस कर दिया जाएगा। इस अनुमान के कारण वह दूसरी क्वेरी से भिन्न योजना का उपयोग कर सकता है।

GETDATE() . का उपयोग करते समय ध्यान रखने योग्य बात सीधे एक फिल्टर में यह है कि यह GETDATE() . का मूल्यांकन करता है संकलन समय पर और उसके बाद चयनात्मकता नाटकीय रूप से बिना किसी क्वेरी या डेटा को बदलने के लिए एक पुन:संकलन को ट्रिगर करने के लिए बदलना संभव है। नीचे दिए गए उदाहरण में 1,000 पंक्ति तालिका के विरुद्ध एक चर का उपयोग करने वाली क्वेरी अनुमानित 300 पंक्तियों और एक पूर्ण तालिका स्कैन के साथ एक योजना की ओर ले जाती है जबकि फ़ंक्शन कॉल वाली क्वेरी 1 पंक्ति का अनुमान लगाती है और एक बुकमार्क लुकअप करती है। यह पहले रन पर सटीक है लेकिन दूसरे रन पर समय बीतने के कारण अब सभी पंक्तियाँ योग्य हो जाती हैं और यह 1,000 ऐसे यादृच्छिक लुकअप को समाप्त कर देती है।

USE tempdb;

CREATE TABLE [myTable]
(
CreatedDate datetime,
Filler char(8000) NULL
)

CREATE NONCLUSTERED INDEX ix ON [myTable](CreatedDate)

INSERT INTO [myTable](CreatedDate)
/*Insert 1 row that initially qualifies*/
SELECT DATEADD(D,-2001,getdate())
UNION ALL
/*And 999 rows that don't initially qualify*/
SELECT TOP 999 DATEADD(minute,1, DATEADD(D,-2000,getdate()))
FROM master..spt_values

EXEC('
DECLARE @myDate DATETIME = DATEADD(D,-2000,getdate())
SELECT * 
FROM [myTable]  
WHERE CreatedDate <= @myDate
')

EXEC('
SELECT * 
FROM [myTable]  
WHERE CreatedDate <= DATEADD(D,-2000,getdate())
')

RAISERROR ('Delay',0,1) WITH NOWAIT

WAITFOR DELAY '00:01:01'

EXEC('
DECLARE @myDate DATETIME = DATEADD(D,-2000,getdate())
SELECT * 
FROM [myTable]  
WHERE CreatedDate <= @myDate
')

EXEC('
SELECT * 
FROM [myTable]  
WHERE CreatedDate <= DATEADD(D,-2000,getdate())
')

DROP TABLE [myTable]


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं टी-एसक्यूएल में अल्पविराम के साथ किसी संख्या को कैसे प्रारूपित करूं?

  2. एक क्लिक में कई SQL सर्वर से कैसे जुड़ें (पंजीकृत सर्वर समूह) - SQL सर्वर / TSQL ट्यूटोरियल भाग 5

  3. एंटिटी फ्रेमवर्क में टेबल और व्यू के बीच संबंध कैसे बनाएं

  4. SQL सर्वर में एक पहचान कॉलम का मूल बीज लौटाएं

  5. क्या मुझे कैस्केड डिलीट नियम का उपयोग करना चाहिए?