【发布时间】:2017-07-24 14:54:01
【问题描述】:
我使用的是 SQL Server 2012。
所以这里是表格
GroupCategoryType
(
GroupCategoryTypeID int identity(1,1) not null, --It is also a PK
GroupTypeID int,
id int,
GroupCategoryID int,
UserID int
)
-- Total Rows around 60,000
我正在此表上设置自定义聚集索引,因为 GroupCategoryTypeID 键上的现有聚集索引没有太大帮助(因为没有对此 PK 进行过滤/加入)。
我选择了(GroupCategoryID, GroupTypeID, ID),因为这三个是最常用的in ('join','where')
我在这里提到的顺序是按照它们的使用频率递减顺序。
关于这个(即将成为)聚集索引的几点需要注意的是:
GroupTypeID 可以是 1 或 2;它具有最少的唯一值频率,即 2
GroupCategoryId 具有中等频率的唯一值,即 2200 # 个唯一值 ID 具有最高频率的唯一值,即 30,000这些列的对或三联的可能组合都不是唯一的。
以下是一些统计数据:
- group by
GroupCategoryId,id返回 count(*) 从 2 到 1600,总共 55,000 行中有 700 行,其余 54,300 行是唯一的。
为了更清楚,我使用了select groupCategoryid,id,count(*) as total from GroupCategoryType group by groupCategoryid,id order by total desc,这返回了 55000 行。- group by
GroupCategoryId,GroupTypeID返回计数 (*) 范围为 2 到 3200,总共 2500 行中有 700 行,其余 1800 行是唯一的。- group by
GroupTypeID,ID返回计数 (*) 范围为 2 到 1600,总共 42000 行中有 6500 行,其余 40,400 行是唯一的。- group by
GroupCategoryid,grouptypeid,id(三元组)对于总共 52000 行中的 700 行返回从 2 到 1600 的计数 (*),其余 51,300 行是唯一的。
现在,我的问题是:
- 根据所有这些统计信息,最佳聚集索引应该是什么? (请记住,GroupTypeid 只有两个唯一值)
- 我知道 SQL Server 本身会添加一个唯一性来使行唯一,但它会将此键添加到所有行(甚至是那些已经唯一的行)还是只是重复的行?
- 考虑到上面的第 2 点,我是否应该将 GroupCategoryTypeID 添加到聚集索引中以使所有组合都唯一?
- 例如,如果在 where 子句中有一个仅使用 (col2,col3) 或 (col1,col3) 或仅 (col3) 的查询,是否仍会使用 (col1,col2,col3) 的聚集索引? 如果不是,是否应该在 (col2,col3) 或 (col1,col3) 上创建非聚集索引,并为 (col3) 单独创建此类情况的最佳解决方案?
【问题讨论】:
-
这完全取决于您使用的 SQL Server 版本,2016 年发布了一个非常高效的列存储索引 - 您需要查看版本特定的索引以及何时应该使用每个索引。
-
为什么要使用聚集索引?为什么不只是一个常规索引?
-
@jimmy8ball :我现在在最初的问题中提到了 SQL Server 2012。谢谢。
-
对于数据库,您的表很窄,60k 行很小。我会在 PK 上保留聚集索引,让它运行一周左右,然后检查数据库引擎优化顾问以查看它推荐的索引
-
此表
WHERE Col1 = @param1 AND ...的行的主要数据访问路径是什么?
标签: sql sql-server sql-server-2012