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

क्वेरी दिनांक अभिव्यक्ति के साथ धीमी गति से चलती है, लेकिन स्ट्रिंग शाब्दिक के साथ तेज़ होती है

यह बेहतर काम कर सकता है:

Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)

जब तक आप ट्रेस फ्लैग 4199 के साथ नहीं चल रहे हैं, तब तक एक बग जो कार्डिनैलिटी अनुमानों को प्रभावित करता है। लिखते समय

SELECT DATEADD(m, DATEDIFF(m, getdate(), 0), 0), 
       DATEADD(m, DATEDIFF(m, 0, getdate()), 0)

रिटर्न

+-------------------------+-------------------------+
| 1786-06-01 00:00:00.000 | 2013-08-01 00:00:00.000 |
+-------------------------+-------------------------+

बग यह है कि प्रश्न में विधेय कार्डिनैलिटी अनुमान प्राप्त करते समय दूसरी के बजाय पहली तारीख का उपयोग करता है। तो निम्नलिखित सेटअप के लिए।

CREATE TABLE FK
(
ID INT IDENTITY PRIMARY KEY,
DT DATE,
Filler CHAR(1000) NULL,
UNIQUE (DT,ID)
)

INSERT INTO FK (DT)
SELECT TOP (1000000) DATEADD(m, DATEDIFF(m, getdate(), 0), 0)
FROM master..spt_values o1, master..spt_values o2
UNION ALL
SELECT               DATEADD(m, DATEDIFF(m, 0, getdate()), 0)

क्वेरी 1

SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)  

अनुमान है कि मेल खाने वाली पंक्तियों की संख्या 100,000 होगी। यह वह संख्या है जो दिनांक से मेल खाती है '1786-06-01'

लेकिन निम्नलिखित दोनों प्रश्न

SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(GETDATE() + 1 - DATEPART(DAY, GETDATE()) AS DATE)

SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)  
OPTION (QUERYTRACEON 4199)

यह योजना दें

अधिक सटीक कार्डिनैलिटी अनुमानों के कारण अब योजना पूर्ण स्कैन के बजाय केवल एक इंडेक्स की तलाश करती है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में दो तिथियों के बीच घंटों (दशमलव) में अंतर की गणना कैसे करें?

  2. जन्म तिथि और getDate () के आधार पर आयु (वर्षों में) की गणना कैसे करें

  3. SQL सर्वर सम्मिलित करें यदि मौजूद नहीं है तो सर्वोत्तम अभ्यास

  4. फ्लैट फ़ाइल में डेटा निर्यात करने वाला SSIS दोहरे उद्धरण चिह्नों को हेक्साडेसिमल वर्णों के रूप में प्रस्तुत करता है

  5. SQL Server 2008 R2 में सिस्टम दिनांक स्वरूप को dd/mm/yy में कैसे बदलें?