Sql-Server

快速查詢4億條記錄的表

  • August 31, 2020
  • 表:客戶數據
  • 行數:4 億
  • 索引:非集群(根據查詢)

問題:大多數查詢都會發生索引掃描,4 億次掃描需要很長時間才能完成

需要有關如何解決上述問題的建議:

  1. 對錶進行分區YEAR有助於提高性能還是分區僅有助於數據管理?
  2. 如何將 Index Scan 轉換為 Seek(大多數報告使用不同的列、過濾器和聚合)
  3. 或簡單的方法:將目前年份保存在一張表中,其餘全部存檔在歷史表中是最好的
  4. SQL Server 2019 中的任何其他功能都可以在具有此類大數據的查詢可以更快地返回記錄時使用。

按 YEAR 對錶進行分區有助於提高性能還是分區僅有助於數據管理?

是的。如果您的查詢具有日期過濾器,則分區消除將允許查詢忽略某些分區。

如何將 Index Scan 轉換為 Seek(大多數報告使用不同的列、過濾器和聚合)

你真的不想要那個。通過索引、過濾索引、包含列的索引和索引視圖的巧妙組合,可以為許多不同的查詢類型提供優化的查詢計劃。但它昂貴、耗時,並且通常無法占到 100% 的查詢。最好能夠支持掃描,這給我們帶來了:

SQL Server 2019 中的任何其他功能都可以在具有此類大數據的查詢可以更快地返回記錄時使用。

是的。絕對地。對於具有掃描和聚合大量行的各種查詢的大型表,您應該使用列儲存設計而不是預設的面向行的聚集索引或堆。

要切換到列儲存,只需在表上創建一個聚集列儲存索引。它專為這種情況而設計,提供:

  • 最快的掃描速度。
  • 最高壓縮率。
  • 查詢只能掃描他們需要的列。
  • 數據以更大的塊從磁碟儲存和獲取。
  • 未使用的列不會從磁碟中獲取或記憶體在 RAM 中。
  • 如果需要,可以與非聚集索引和分區結合使用。

一旦你可以足夠快地掃描,你就不需要很多其他索引了。

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