簡體   English   中英

SQL Server中的Count(*)性能問題

[英]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 *中查看提供的實際執行計划 ,我看到了:

在此處輸入圖片說明

和這個:

在此處輸入圖片說明

這使我相信您應該:

  1. 更新InventoryA001_Store_Inventory上的統計信息,以便優化程序可以獲得更好的行計數估計(這可能會導致更好的計划形狀)。
  2. 確保Inventory.ItemNumberA001_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM