Ale*_*kiy 8 performance index sql-server clustered-index
我有一个包含一些日志信息的大数据库(200GB+)。我想加快SELECT查询和存储过程。我有一个带有GeneratedOnUtc 日期时间列的表,并且上面有一个非聚集索引。
我正在考虑将其更改为聚集索引。
的原因:
大量数据(约 4000 万行)
Column 用于多个Where子句 ( between, >, <)
列用于ROW_NUMBER() OVER (ORDER BY d.GeneratedOnUtc asc) AS Row查询
反对理由:
将表从堆更改为具有聚集索引应该会显着提高查询甚至插入的性能。一般来说,聚集索引应该是狭窄的、唯一的并且不断增加。使用不能保证唯一的日期时间并不理想,因为它是 8 个字节,并且由于它不是唯一的,sql 将为非唯一行添加一个四字节唯一标识符。您可能最好使用带有 int 的标识列作为聚集索引,因为这就是“row_number”查询真正追求的目标(一个不断增加的唯一数字),这可能是一个很好的方法,特别是如果您有一个已经有非聚集索引的数量(因为聚集索引被非聚集索引用作行指针,所以它增加了它们的大小)。40 亿个可用的 int 值可以让您获得数十年的增长。
我建议您制作数据库的测试副本,然后使用日期时间值上的聚集索引对其进行测试,并将其与在新标识列上使用聚集索引(以及日期时间上的非聚集索引)的测试进行对比。看看哪一个在您的查询负载方面表现更好。这两种情况都会优于堆。