从性能角度看,以下SQL是好还是坏?
两个查询,按公共列搜索:
CREATE INDEX tbl_idx ON tbl (a, b);
SELECT id, a, b
FROM tbl
WHERE a = @a
AND b = @b;
SELECT id, a, b
FROM tbl
WHERE b = @b;
答案 0 :(得分:2)
如果反转索引列顺序(b,a),则索引可能对两个查询都有用。此外,如果id
是作为聚簇索引实现的主键,则索引将涵盖两个查询,因为聚类键隐式包含在行定位器中。否则,可以明确地将id添加为包含列以提供最佳性能:
CREATE INDEX tbl_idx ON tbl (a, b)
INCLUDE(id);
答案 1 :(得分:2)
此索引
CREATE INDEX tbl_idx ON tbl (a, b);
对这些查询有用
where a= and b =
where a= and b>
where a like 'someval%' and b=
但对这些查询没有用处:
where b=
where a> and b=
where a like '%someval%' and b=
where isnull(a,'')= and b=
总之,在多列索引中,如果SQL Server能够在第一个键列上执行搜索,那么索引将是有用的。
提出您的问题,第一个查询将受益于您创建的索引,而第二个查询可能倾向于对此索引进行扫描..
有许多因素决定了搜索是好还是坏。在某些情况下,SQL Server可能倾向于不使用可用的索引,如书签查找成本超出限制。
参考文献: