Sql-Server

使用 where 子句和動態數據的高性能計數

  • December 3, 2020

我正在尋找一種高性能的方法來解決這個問題。

我在 SQL-Server 2019 上有一個表,有 316 列和幾百萬行。

對於此查詢,只有少數列是相關的。諸如日期欄位和金額欄位之類的東西(也可能是 id 欄位)。

現在我想知道在特定日期範圍(從現在到過去 X 天)中有多少條目的數量低於 Y。

我目前的方法(將請求分成兩個請求):

  1. 在日期欄位和 id 欄位上創建一個非聚集索引。
  2. 使用 where 子句進行第一次選擇以僅獲取相關日期範圍內的條目。(僅選擇 id)這會避免全表掃描嗎?
  3. 在 ids(可能還有數量欄位)上使用 where 子句進行第二次選擇(計數)。id-field 也是主鍵和聚集索引。

在第三步,我不確定是否可以將數量欄位放入 where 子句而不會造成任何性能損失。如果這是不可能的,也許我應該只選擇 ids 和 amount-field 並在我的應用程序中(在記憶體中)進行計數?如果可以避免這種情況,那就太好了。

此外,如果我將有 1,000,000 個 ID 將滿足第二步的條件,我不確定是否有必要在第三步拆分請求。

你覺得我的方法怎麼樣?我應該去,還是有更好的?

創建複合索引並僅使用一條SELECT語句。該索引將在(日期,金額)或(金額,日期)。您選擇哪一個取決於您的查詢和每列的選擇性。

想像一個老式(物理)電話簿。您可以按姓氏查找某些內容,然後繼續搜尋您想要的名字(Doe、John)。

當然,列儲存 indexex 可能很有用,但這也可能是矯枉過正。當您頻繁修改數據並且列儲存索引中沒有 SEEK 時,會出現特定的性能問題。

引用自:https://dba.stackexchange.com/questions/280736