我有2个类似的查询
select *
from dbo.employee
where employee.name = 'lucas'
and employee.age = 36
and employee.address = 'street 6'
第二个查询如下所示
select *
from dbo.employee
where employee.name = 'lucas'
and employee.address = 'street 6'
我创建了一个包含多个列的索引,如下所示
CREATE NONCLUSTERED INDEX [IX_EMPLOYEE]
ON dbo.employee (name, age, address)
此索引对于第一个查询的工作和性能是快速的,但是第二个查询花费了更长的时间。
如何重现此问题?
我期望用同一列创建多个索引将改善第二个查询,但没有不同的相同花费更长的时间
1条答案
按热度按时间gr8qqesn1#
使用这样的索引:
请注意列的顺序,以及name + address覆盖了第二个查询的
WHERE
子句(因此将使其成为 seekable,这是快速的),并且此索引在第一个查询中也可用。如果列的顺序是
(address, name, age)
,它也会工作得很好。对于这些查询,从这两个查询中选择具有最多唯一值的一个(用SELECT COUNT(DISTINCT address) FROM dbo.employee
检查它,或者如果还没有数据,尝试预测)。如果在最坏的情况下,同一地址的同名同姓的人不多,你可以考虑从索引中删除“年龄”列。它将查找名字+地址,然后 * 范围扫描 *“street 6”上的所有“卢卡斯”,以查找是否有匹配年龄的人。如果数据模型允许,这将是一个合理的更改。然而,“年龄”列可能很窄,因此,与包含更多数据的“address”列(但需要是第一或第二列,以便这些查询可查找)相比,节省的空间不会很大。