[英]Performance Issues with Count(*) in SQL Server
我在SQL Server 2008中運行的查詢存在一些性能問題。我有以下查詢:
查詢1:
SELECT GroupID, COUNT(*) AS TotalRows FROM Table1
INNER JOIN (
SELECT Column1 FROM Table2 WHERE GroupID = @GroupID
) AS Table2
ON Table2.Column1 = Table1.Column1
WHERE CONTAINS(Table1.*, @Word) GROUP BY GroupID
Table1包含約500,000行。 表2包含約50,000,但最終將包含數百萬。 在處理查詢時,我發現按以下方式重新編寫查詢將使查詢的執行時間減少到1秒以下。
查詢2:
SELECT GroupID FROM Table1
INNER JOIN (
SELECT Column1 FROM Table2 WHERE GroupID = @GroupID
) AS Table2 ON Table2.Column1 = Table1.Column1
WHERE CONTAINS(Table1.*, @Word)
我不明白的是它是一個簡單的計數查詢。 如果我在表1上執行以下查詢,則它在<1 s內返回:
查詢3:
SELECT Count(*) FROM Table1
此查詢返回的結果約50萬。
但是,即使簡單地刪除GROUP BY(查詢2)將執行時間減少到<1s,上面提到的原始查詢(查詢1)也只返回50,000的計數並需要3 s來執行。
我不認為這是索引問題,因為我已經在適當的列上建立了索引。 任何幫助將不勝感激。
執行簡單的COUNT(*) FROM table
可以對聚集索引進行更有效的掃描,因為它不必關心任何過濾,聯接,分組等操作。查詢包括全文搜索謂詞和神秘查詢子查詢必須做更多的工作。 計數不是那里最昂貴的部分-我敢打賭,如果您不考慮計數但將分組留在里面,它們仍然相對較慢,例如:
SELECT GroupID FROM Table1
INNER JOIN (
SELECT Column1 FROM Table2 WHERE GroupID = @GroupID
) AS Table2 ON Table2.Column1 = Table1.Column1
WHERE CONTAINS(Table1.*, @Word)
GROUP BY GroupID;
在免費的SQL Sentry Plan Explorer *中查看提供的實際執行計划 ,我看到了:
和這個:
這使我相信您應該:
Inventory
和A001_Store_Inventory
上的統計信息,以便優化程序可以獲得更好的行計數估計(這可能會導致更好的計划形狀)。 Inventory.ItemNumber
和A001_Store_Inventory.ItemNumber
是相同的數據類型,以避免隱式轉換。 (*) 免責聲明:我為SQL Sentry工作。
您應該查看查詢計划,以了解SQL Server在做什么以檢索您請求的數據。 另外,我認為這將是更好地重寫原始查詢,如下所示:
SELECT
Table1.GroupID -- When you use JOINs, it's always better to specify Table (or Alias) names
,COUNT(Table1.GroupID) AS TotalRows
FROM
Table1
INNER JOIN
Table2 ON
(Table2.Column1 = Table1.Column1) AND
(Table2.GroupID = @GroupID)
WHERE
CONTAINS(Table1.*, @Word)
GROUP BY
Table1.GroupID
另外,請記住,簡單的COUNT和帶有JOIN和GROUP BY的COUNT並非同一個人。 在一種情況下,只需要遍歷一個索引並進行計數,而在另一種情況下,還涉及其他表和分組,這可能會很耗時,具體取決於多個因素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.