索引
(ProfileID, Text)
(按此顺序)是
ProfileID
也。
您可能仍然希望在
文件标识符
只是,如果你想要更大的
SELECT
对不涉及的查询的性能
Text
.
然而,这有两个缺点:
-
维护两个索引需要更多的资源和性能
DML
查询(
INSERT
,
UPDATE
,
DELETE
)可能会受苦
-
如果混合使用这两种类型的查询,则两个索引都将占用缓存,并且与单个索引相比,可能会有更多的缓存未命中。
如果您的表足够小,可以与两个索引一起放入缓存中,则这不是问题。
封面索引将是两列的散列(或者我误解了封面索引)?
一个真正的覆盖指数是这样创建的:
CREATE INDEX ix_mytable_profile__text ON mytable (ProfileID) INCLUDE (Text)
这种方式,
只存储在索引的叶级节点中。
但是,既然你需要
UNIQUE
索引,两列都必须是键的一部分。节点按字典顺序排序。
文件标识符
然后
文本
.
我按顺序创建了索引(ProfileID,Text)。如果为了参数起见,有3列A、B和C,它们的封面索引覆盖了所有3列。只有当我们询问“A”或“A、B和C”,而不是“B”、“C”或“B和C”时,它才会受益吗?
CREATE INDEX ix_mytable_a_b_c ON mytable (a, b, c)
SELECT a, b, Ñ
FROM mytable
WHERE a = 1
-- Index lookup, no table lookup. a is leading
SELECT a, b, Ñ
FROM mytable
WHERE a = 1
AND b = 1
-- Index lookup, no table lookup. (a, b) are leading.
SELECT a, b, Ñ
FROM mytable
WHERE b = 1
-- Index full scan (`b` is not leading), no table lookup
SELECT a, b, Ñ
FROM mytable
WHERE c = 1
-- Index full scan (`c` is not leading), no table lookup
SELECT a, b, Ñ, d
FROM mytable
WHERE a = 1
-- Index lookup, table tookup (d is not a part of the index).
SELECT a, b, Ñ, d
FROM mytable
WHERE b = 1
-- Table full scan (there is no point in using index at all, neither for lookup nor for covering).