Joh*_*dom 4 uniqueidentifier sql-server-2008-r2 index-tuning
例如,让我们说我有一个以这种方式构建的表格:
ID1 int
ID2 int
ID3 int
DTM datetime
Run Code Online (Sandbox Code Playgroud)
如果我包含 ID1、ID2 和 ID3(它们的组合或单独会导致重复行),我只能在表上创建唯一的聚集索引。
通过 ID1、ID2 和 ID3 创建聚集索引是否会更好的性能?或者只在 ID1 上创建一个聚集索引,并让 SQL Server 向索引添加一个唯一标识符以使每一行都是唯一的?
我知道 uniquifier 的大小为 4 个字节(整数相同),因此从技术上讲,如果我创建后一个索引,每行将节省 4 个字节,但我不确定这会如何影响我的查询。
就性能而言,聚集索引最重要的考虑因素之一是它会不断增加(或减少)而不是会改变(除非可能非常罕见)。聚集索引表示表的物理顺序。如果您不断地插入索引的中间,或者修改聚集索引的值,那么您将得到错误的页面拆分,其中 SQL 必须将部分数据从一页移动到另一页以腾出空间对于新数据。这些移动需要时间并导致碎片化,从而降低性能。
话虽如此,聚集索引的大小虽然很重要,但并不是您最关心的问题。我做了一些使用日期列(带有唯一标识符)与一个 int 列的实验,发现如果我的查询是基于日期的,我的性能仍然有很大的提升。
我对您的建议是,如果 ID1、ID2 和 ID3 不断增加(并且很少改变),那么将其用作聚集索引。如果不是,并且您仍然想要强制唯一性,那么要么使它们成为非聚集主键或非聚集唯一键。如果它们从未增加,那么您可以考虑您的日期列或仅为该表创建一个代理键。使用 int 数据类型并使其成为标识列。
如果您确实创建了代理键,那么您可以在 ID1 上创建一个非聚集索引以提高这些查询的性能,前提是您尚未为其创建唯一索引。如果您经常需要返回,比如 ID2 和 DTM,那么您可以在索引中包含它们以进一步提高您的性能。
| 归档时间: |
|
| 查看次数: |
1356 次 |
| 最近记录: |