मैं SQL सर्वर 2012 में दो प्रश्नों की तुलना कर रहा हूं। लक्ष्य सबसे अच्छा क्वेरी चुनते समय क्वेरी ऑप्टिमाइज़र से उपलब्ध प्रासंगिक जानकारी का उपयोग करना है । दोनों प्रश्न एक ही परिणाम उत्पन्न करते हैं; सभी ग्राहकों के लिए अधिकतम आर्डर।
FREEPROCCACHE और DROPCLEANBUFFERS के साथ प्रत्येक क्वेरी को निष्पादित करने से पहले बफ़र पूल को साफ़ किया गया था
नीचे दी गई जानकारी का उपयोग करते हुए, कौन सी क्वेरी बेहतर विकल्प है?
-- Query 1 - return the maximum order id for a customer
SELECT orderid, custid
FROM Sales.Orders AS O1
WHERE orderid = (SELECT MAX(O2.orderid)
FROM Sales.Orders AS O2
WHERE O2.custid = O1.custid);
-- Query 2 - return the maximum order id for a customer
SELECT MAX(orderid), custid
FROM Sales.Orders AS O1
group by custid
order by custid
सांख्यिकी समय
क्वेरी 1 सांख्यिकी समय: सीपीयू समय = 0ms, बीता समय = 24 एमएस
क्वेरी 2 सांख्यिकी समय: सीपीयू समय = 0 एमएस, बीता हुआ समय = 23 एमएस
सांख्यिकी IO
प्रश्न 1 सांख्यिकी IO: तालिका 'आदेश'। स्कैन काउंट 1, लॉजिकल रीड 5, फिजिकल रीड्स 2, रीड-फॉरवर्ड रीड्स 0, लॉब लॉजिकल रीड्स 0, लॉब फिजिकल रीड्स 0, लॉब रीड-फॉरवर्ड रीड्स 0।
क्वेरी 2 सांख्यिकी IO: तालिका 'आदेश'। स्कैन काउंट 1, लॉजिकल रीड 4, फिजिकल रीड्स 1, रीड-फॉरवर्ड रीड 8, लॉब लॉजिकल रीड्स 0, लॉब फिजिकल रीड्स 0, लॉब रीड-फॉरवर्ड रीड्स 0।
निष्पादन योजनाएं

चयन गुण क्वेरी 1

गुण का चयन करें क्वेरी 2

निष्कर्ष:
प्रश्न 1
- बैच लागत 48%
- तार्किक रीति ५
- शारीरिक प्रतिक्रिया २
- पढ़ें-आगे पढ़े: 0
- सीपीयू समय: 0ms
- बीता हुआ समय 24ms
- अनुमानित सबट्री लागत: 0.0050276
- CompileCPU: 2
- कम्पाइलमोरी: 384
- संकलन: २
प्रश्न २
- बैच की लागत 52%
- तार्किक रीति ४
- शारीरिक प्रतिक्रिया १
- पढ़ें-आगे पढ़ें: 8
- सीपीयू समय ०
- बीता हुआ समय 23ms
- अनुमानित सबट्री लागत: 0.0054782
- CompileCPU: 0
- कम्पाइलमोरी: 192
- संकलन समय: 0
व्यक्तिगत रूप से, भले ही क्वेरी 2 में चित्रमय योजना के अनुसार एक उच्च बैच लागत है, मुझे लगता है कि इसकी अधिक प्रभावशाली है कि क्वेरी 1। क्योंकि क्वेरी 2 के लिए कम तार्किक रीड की आवश्यकता होती है, थोड़ा कम समय व्यतीत होता है, संकलन, संकलन, और अनिवार्य जीवन मूल्य होते हैं। कम। 1-क्वेरी के लिए 2 और 0 के लिए रीड-फॉरवर्ड रीड 8 हैं।
अपडेट 12:03
क्लस्टर इंडेक्स परिभाषा
ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
(
[orderid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
गैर-संकुल सूचकांक idx_nc_custid
CREATE NONCLUSTERED INDEX [idx_nc_custid] ON [Sales].[Orders]
(
[custid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO