मुझे वास्तव में इन प्रकार के प्रश्न पसंद हैं क्योंकि आप प्रदर्शन विश्लेषण कर सकते हैं।
सबसे पहले, एक [यूआरएल] तालिका के साथ एक लाख यादृच्छिक रिकॉर्ड के साथ एक नमूना [परीक्षण] डेटाबेस बनाते हैं।
नीचे कोड देखें।
-- Switch databases
USE [master];
go
-- Create simple database
CREATE DATABASE [test];
go
-- Switch databases
USE [test];
go
-- Create simple table
CREATE TABLE [urls]
(
my_id INT IDENTITY(1, 1)
PRIMARY KEY ,
my_link VARCHAR(255) ,
my_status VARCHAR(15)
);
go
-- http://stackoverflow.com/questions/1393951/what-is-the-best-way-to-create-and-populate-a-numbers-table
-- Load table with 1M rows of data
;
WITH PASS0
AS (SELECT 1 AS C
UNION ALL
SELECT 1
), --2 rows
PASS1
AS (SELECT 1 AS C
FROM PASS0 AS A ,
PASS0 AS B
), --4 rows
PASS2
AS (SELECT 1 AS C
FROM PASS1 AS A ,
PASS1 AS B
), --16 rows
PASS3
AS (SELECT 1 AS C
FROM PASS2 AS A ,
PASS2 AS B
), --256 rows
PASS4
AS (SELECT 1 AS C
FROM PASS3 AS A ,
PASS3 AS B
), --65536 rows
PASS5
AS (SELECT 1 AS C
FROM PASS4 AS A ,
PASS4 AS B
), --4,294,967,296 rows
TALLY
AS (SELECT ROW_NUMBER() OVER (ORDER BY C) AS Number
FROM PASS5
)
INSERT INTO urls
(my_link ,
my_status
)
SELECT
-- top 10 search engines + me
CASE (Number % 11)
WHEN 0 THEN 'www.ask.com'
WHEN 1 THEN 'www.bing.com'
WHEN 2 THEN 'www.duckduckgo.com'
WHEN 3 THEN 'www.dogpile.com'
WHEN 4 THEN 'www.webopedia.com'
WHEN 5 THEN 'www.clusty.com'
WHEN 6 THEN 'www.archive.org'
WHEN 7 THEN 'www.mahalo.com'
WHEN 8 THEN 'www.google.com'
WHEN 9 THEN 'www.yahoo.com'
ELSE 'www.craftydba.com'
END AS my_link ,
-- ratings scale
CASE (Number % 5)
WHEN 0 THEN 'poor'
WHEN 1 THEN 'fair'
WHEN 2 THEN 'good'
WHEN 3 THEN 'very good'
ELSE 'excellent'
END AS my_status
FROM TALLY AS T
WHERE Number <= 1000000
go
दूसरा, हम अपने परीक्षण वातावरण में प्रदर्शन विश्लेषण करते समय हमेशा बफर और कैश को साफ़ करना चाहते हैं। इसके अलावा, हम परिणामों की तुलना करने के लिए सांख्यिकी I/O और समय चालू करना चाहते हैं।
नीचे कोड देखें।
-- Show time & i/o
SET STATISTICS TIME ON
SET STATISTICS IO ON
GO
-- Remove clean buffers & clear plan cache
CHECKPOINT
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
GO
तीसरा, हम पहले TSQL कथन का प्रयास करना चाहते हैं। निष्पादन योजना को देखें और आंकड़ों को कैप्चर करें।
-- Try 1
SELECT * FROM urls ORDER BY my_status
/*
Table 'urls'. Scan count 5, logical reads 4987, physical reads 1, read-ahead reads 4918, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 3166 ms, elapsed time = 8130 ms.
*/
चौथा, हम दूसरे TSQL बयान की कोशिश करना चाहते हैं। क्वेरी प्लान कैश और बफर साफ़ करने के लिए मत भूलना। यदि आप नहीं करते हैं, तो क्वेरी में 1 सेकंड से कम समय लगता है क्योंकि अधिकांश जानकारी स्मृति में होती है। निष्पादन योजना को देखें और आंकड़ों को कैप्चर करें।
-- Try 2
SELECT ROW_NUMBER() OVER (ORDER BY my_status) as my_rownum, * FROM urls
/*
Table 'urls'. Scan count 5, logical reads 4987, physical reads 1, read-ahead reads 4918, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 3276 ms, elapsed time = 8414 ms.
*/
इतना ही नहीं बल्कि, यहाँ मज़ा हिस्सा है, प्रदर्शन विश्लेषण है।
1 - हम देख सकते हैं कि दूसरी योजना पहले का एक सुपर सेट है। इसलिए दोनों योजनाएं क्लस्टर इंडेक्स को स्कैन करती हैं और डेटा को सॉर्ट करती हैं। परिणामों को एक साथ रखने के लिए समांतरता का उपयोग किया जाता है।
2 - दूसरी योजना/क्वेरी पंक्ति संख्या की गणना करने की आवश्यकता है। यह डेटा को विभाजित करता है और इस स्केलर की गणना करता है। इसलिए, हम योजना में दो और ऑपरेटरों के साथ खत्म हो जाते हैं।
यह आश्चर्य की बात नहीं है कि पहली योजना 8130 एमएस में चलती है और दूसरी योजना 8414 एमएस में चलती है।
हमेशा पूछताछ योजना देखें। अनुमानित और वास्तविक दोनों। वे आपको बताते हैं कि इंजन करना चाहता है और वास्तव में क्या करता है।
इस उदाहरण में, दो अलग-अलग टीएसक्यूएल स्टेटमेंट लगभग समान योजनाओं के साथ आते हैं।
निष्ठा से
जॉन
www.craftydba.com
1. संख्या 2. तंत्र एक जैसा है, लेकिन परिणाम अलग हो सकता है। अनियंत्रित पंक्तियों का वास्तविक वापसी आदेश क्वेरी अनुकूलक निर्णयों पर निर्भर करता है और डेटा/इंडेक्स भौतिक लेआउट। – Arvo