Sql-Server

列儲存索引和低選擇性列

  • October 14, 2020

我有一張幾乎有 1T 行的表。

create table bigtable (
 K1 int, K2 date, -- PK columns
 C1 ..., C8 ...., -- columns with various data types like float, date, varchar, ...
 B1 bit, B2 bit, ......, B10 bit -- 10 or so bit columns
 primary key (K1, K2)
)

我想使用列儲存來提高查詢性能。有以下選項。

  1. 創建集群列儲存索引
  2. 為所有列創建非集群列儲存索引
  3. 為除這些位列和其他低選擇性列之外的所有列創建較小的非集群列儲存索引?

使用者將自己編寫查詢。很多查詢將是聚合查詢。選項 3 的執行速度是否與其他兩個尺寸較小的選項一樣快?

我正在使用 SQL Server 2014。在我的情況下,我可以定期刪除/重新創建非聚集列儲存索引,因為數據不會經常更新。

列儲存索引的一個優點是只讀取必要的列(與讀取整行的行儲存不同)。

因此,如果您在非聚集索引中包含所有列,則創建索引將花費更長的時間,但不會對任何查詢產生不利影響(並且將使使用這些列的任何查詢受益)。

您需要問自己的問題是:我需要在單行上工作嗎?看起來你沒有。在這種情況下,只需放置一個聚集列儲存索引(您的選項 1)。這將發生:

  • 您的表格將被壓縮
  • 聚合查詢會更快
  • 您無需考慮使用者將使用哪些列(與創建非聚集索引不同)。

歸結為:我是否有一個應用程序只想讀取或更新一行,並且會經常發生嗎?如果發生這種情況,您始終可以為該用途添加非聚集行儲存索引。

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