जैसा कि टिप्पणियों में पहले से ही संकेत दिया गया है, जैसा कि आपको अपने आंकड़ों को अपडेट करने की आवश्यकता है।
पंक्तियों की अनुमानित संख्या बीच में से जुड़ती है location
और testruns
दोनों योजनाओं के बीच बेहद भिन्न होती है।
योजना के अनुमानों में शामिल हों: 1
उप क्वेरी योजना का अनुमान: 8,748
जुड़ने से निकलने वाली पंक्तियों की वास्तविक संख्या 14,276 है।
बेशक, यह बिल्कुल सहज ज्ञान युक्त नहीं है कि जुड़ने वाले संस्करण का अनुमान होना चाहिए कि 3 पंक्तियों से आना चाहिए location
और एकल सम्मिलित पंक्ति का उत्पादन करना चाहिए, जबकि उप क्वेरी का अनुमान है कि उन पंक्तियों में से एक ही जोड़ से 8,748 का उत्पादन होगा, लेकिन फिर भी मैं सक्षम था इसे पुन: पेश करने के लिए।
ऐसा तब होता है जब आंकड़े बनने पर हिस्टोग्राम के बीच कोई क्रॉस ओवर नहीं होता है। शामिल होने के संस्करण में एक पंक्ति होती है। और उप क्वेरी की एकल समानता एक अज्ञात चर के खिलाफ समानता की तलाश के रूप में एक ही अनुमानित पंक्तियों को मानती है।
वृषण की कार्डिनैलिटी है 26244
। यह मानकर कि तीन अलग-अलग स्थान आईडी के साथ आबादी है, तो निम्नलिखित क्वेरी का अनुमान है कि 8,748
पंक्तियों को वापस कर दिया जाएगा ( 26244/3
)
declare @i int
SELECT *
FROM testruns AS tr
WHERE tr.location_id = @i
यह देखते हुए कि तालिका में locations
केवल 3 पंक्तियाँ हैं, यह आसान है (यदि हम कोई विदेशी कुंजी नहीं मानते हैं) ऐसी स्थिति को रोकने के लिए जहां आँकड़े बनाए जाते हैं और फिर डेटा को इस तरह से बदल दिया जाता है कि नाटकीय रूप से खोई गई पंक्तियों की वास्तविक संख्या पर प्रभाव पड़ता है लेकिन अपर्याप्त है आँकड़ों के स्वत: अद्यतन यात्रा और दहलीज recompile।
जैसे-जैसे SQL सर्वर को इससे निकलने वाली पंक्तियों की संख्या मिलती है, वैसे-वैसे जुड़ने की गलत योजना में अन्य सभी पंक्ति अनुमानों को बड़े पैमाने पर कम करके आंका जाता है। साथ ही अर्थ है कि आप एक सीरियल प्लान प्राप्त करते हैं, क्वेरी को एक अपर्याप्त मेमोरी अनुदान भी मिलता है और सॉर्ट और हैश स्पिल में शामिल हो जाता है tempdb
।
एक संभावित परिदृश्य जो आपकी योजना में दिखाई गई वास्तविक बनाम अनुमानित पंक्तियों को पुन: पेश करता है, नीचे है।
CREATE TABLE location
(
id INT CONSTRAINT locationpk PRIMARY KEY,
location VARCHAR(MAX) /*From the separate filter think you are using max?*/
)
/*Temporary ids these will be updated later*/
INSERT INTO location
VALUES (101, 'Coventry'),
(102, 'Nottingham'),
(103, 'Derby')
CREATE TABLE testruns
(
location_id INT
)
CREATE CLUSTERED INDEX IX ON testruns(location_id)
/*Add in 26244 rows of data split over three ids*/
INSERT INTO testruns
SELECT TOP (5984) 1
FROM master..spt_values v1, master..spt_values v2
UNION ALL
SELECT TOP (5984) 2
FROM master..spt_values v1, master..spt_values v2
UNION ALL
SELECT TOP (14276) 3
FROM master..spt_values v1, master..spt_values v2
/*Create statistics. The location_id histograms don't intersect at all*/
UPDATE STATISTICS location(locationpk) WITH FULLSCAN;
UPDATE STATISTICS testruns(IX) WITH FULLSCAN;
/* UPDATE location.id. Three row update is below recompile threshold*/
UPDATE location
SET id = id - 100
फिर निम्नलिखित प्रश्नों को चलाने से वास्तविक अनुमानित विसंगति के समान अनुमान मिलता है
SELECT *
FROM testruns AS tr
WHERE tr.location_id = (SELECT id
FROM location
WHERE location = 'Derby')
SELECT *
FROM testruns AS tr
JOIN location loc
ON tr.location_id = loc.id
WHERE loc.location = ( 'Derby' )