2016-02-05 34 views
-1

我google'd它,並找到很多答案類似的問題,但無法找到真正的好答案,這滿足了我的問題。DataTable的結構優化:「空」或者等於某個值

我在考慮與數據的大金額大表的查詢性能,以及有關的一些條件,從該表中選擇。

我想知道,在數值選擇的查詢中使用什麼更好(例如,select * from myTable where myNumericColumn ...)。什麼是更好地在這裏:爲空不爲空,或=值。我的意思是:

select * from myTable where myNumericColumn is null 
select * from myTable where myNumericColumn is not null 
select * from myTable where myNumericColumn != 0 
select * from myTable where myNumericColumn = 0 

我讀到SQL Server索引NULL值,因此使用它更有效。但是它是真正的答案還是隻是某些用戶的意見?

我需要了解SQL Server和Oracle(在我的問題的一個領域)。

在此先感謝。

編輯!我很抱歉有錯。我的意思是優化datatable的結構以在查詢時達到最佳查詢性能。我應該使用一些值而不是NULL值來達到更好的執行速度,或者我需要使用NULL,或者我只需要以正確的方式對錶進行索引。我知道這是基於意見的,但我需要專業人員的答案,他們致力於數據庫結構開發,優化和查詢的性能

+0

您的查詢不一樣。編寫查詢的第一條規則是他們應該返回所需的結果集;性能是次要考慮因素。 –

+0

@GordonLinoff我編輯了這個問題。爲一個錯誤道歉。我的意思是datatable的結構優化,並展示了查詢它的例子。 – Khazratbek

+0

你專注於微觀優化。最好集中精力解決問題,然後再處理性能問題。 –

回答

1

我想知道什麼是真正的問題,因爲您試圖比較不同的查詢除非表格是根據測試做好準備的。對於表演,有些東西可以產生不同的答案,如行數,每個值之間的比例。

通常你編寫查詢的方式,甚至無關緊要,因爲查詢優化器將重新排列查詢以獲得最好的結果與上表數據和索引acording。

所以最好的辦法是在測試和檢查QUERY PLAN

但是你要比較類似的事情

創建具有相同數量的NULL,而不是NULL一個表,你可以比較前兩個查詢。

然後創建具有相同數量的0<>0一張桌子和比較更流暢。

1

我有一張桌子,裏面有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. 
*/ 
+0

非常感謝!它是SQL Server,對嗎? – Khazratbek

+0

哦,對不起。 * SSMS * - 它完全是SQL Server :)對不起,我只是沒有注意到 – Khazratbek

+0

既然你已經準備好了測試用例,除了查看估計的查詢成本之外,你還可以測量實際性能嗎?添加'SET STATISTICS IO ON; SET COUNTISTICS TIME ON;'在你的COUNT(*)'查詢之前。然後檢查消息選項卡。 –