我有一張桌子,裏面有200萬個用戶帳戶,用於測試數據。我添加了兩列COL1 & COL2。
- COL1是NULL或具有「1」。有~75k「1」的值。
- COL2是「0」或「1」。有~75k「1」的值。
這是我如何設置它:
ALTER TABLE Profile.UserAccount ADD COL1 INT NULL
ALTER TABLE Profile.UserAccount ADD COL2 INT NOT NULL DEFAULT (0)
UPDATE Profile.UserAccount -- Update ~75k rows
SET COL1 = 1,
COL2 = 1
WHERE PasswordIsExpired = 'Y'
CREATE INDEX DELETE_ME1 ON Profile.UserAccount (COL1)
CREATE INDEX DELETE_ME2 ON Profile.UserAccount (COL2)
我然後把下面的查詢到SSMS跑他們,輸出查詢計劃。這給出了「相對於批處理的查詢成本」百分比。如果他們都回來了25%,這意味着他們都會有相同的成本(4個查詢x 25%=該批次的100%)。
我在每條語句旁邊添加了查詢代價。成本越低,查詢對其他查詢的效率越高:
-- Query Cost: 50%
SELECT COUNT(*) FROM Profile.UserAccount WHERE COL1 IS NULL
/*
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 12 ms, elapsed time = 12 ms.
Table 'UserAccount'. Scan count 1, logical reads 2634, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 250 ms, elapsed time = 481 ms.
*/
-- Query Cost: 3%
SELECT COUNT(*) FROM Profile.UserAccount WHERE COL1 IS NOT NULL
/*
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'UserAccount'. Scan count 1, logical reads 136, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 16 ms, elapsed time = 35 ms.
*/
-- Query Cost: 45%
SELECT COUNT(*) FROM Profile.UserAccount WHERE COL2 = 0
/*
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'UserAccount'. Scan count 1, logical reads 2068, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 250 ms, elapsed time = 441 ms.
*/
-- Query Cost: 2%
SELECT COUNT(*) FROM Profile.UserAccount WHERE COL2 != 0
/*
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'UserAccount'. Scan count 2, logical reads 113, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 31 ms, elapsed time = 159 ms.
*/
您的查詢不一樣。編寫查詢的第一條規則是他們應該返回所需的結果集;性能是次要考慮因素。 –
@GordonLinoff我編輯了這個問題。爲一個錯誤道歉。我的意思是datatable的結構優化,並展示了查詢它的例子。 – Khazratbek
你專注於微觀優化。最好集中精力解決問題,然後再處理性能問題。 –