c00*_*0fd 1 sql t-sql sql-server indexing select
我正在创建一个可能包含数百万条记录的SQL Server 2008数据库,我想知道是否需要将以下内容定义为索引:
TINYINT列可能只包含0和1?
TINYINT列可能只包含:0,5和6?
PS.这两列都将在WHERE子句中用于选择.
不,基本上永远不会使用这些列的索引.
但是这种低选择性键是复合键的理想选择,它们被放置在索引中最左边的列中.Eg.say TINYINT (0,1)(为什么不使用bitbtw?)是deleted专栏.您经常查询谓词WHERE deleted=0 AND ....将此作为聚集索引中最左侧的列添加通常是正确的方法.或者,如果谓词是,WHERE name = '...' AND deleted=0那么你应该创建一个非聚集的index on (deleted, name).
另一种选择是使用过滤索引:create index .. on (name) where (deleted=0)但是这并不能掩盖你那里的情况是感兴趣的deleted=1.
对于具有很少不同值的type列(例如,列)也是如此.再次,使它成为复合索引中最左边的键通常很有意义.
但请注意,如果在索引中添加低选择性键作为最左侧的键,并且未在谓词中指定此列(例如,无WHERE name='...'添加任何条件deleted),则不能使用索引,只能使用索引on (name)(或on (name, ...))可以使用,即.哪里name是最左边的钥匙.
为什么不把它作为最关键的?例如.index on (name, deleted)?因为通常没有任何好处,只有当您想要强制执行唯一约束时.只有0或1可以选择一个index on (name)或index on (name, deleted)基本上提供相同的性能(如果可以使用).将低选择性键置于左侧可启用某些范围扫描方案(例如WHERE type=5).
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |