SQL Server 同一列有多个索引

mepcadol  于 2023-02-03  发布在  其他
关注(0)|答案(1)|浏览(161)

我有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)

此索引对于第一个查询的工作和性能是快速的,但是第二个查询花费了更长的时间。
如何重现此问题?
我期望用同一列创建多个索引将改善第二个查询,但没有不同的相同花费更长的时间

gr8qqesn

gr8qqesn1#

使用这样的索引:

CREATE NONCLUSTERED INDEX [IX_EMPLOYEE] 
ON dbo.employee (name, address, age)

请注意列的顺序,以及name + address覆盖了第二个查询的WHERE子句(因此将使其成为 seekable,这是快速的),并且此索引在第一个查询中也可用。
如果列的顺序是(address, name, age),它也会工作得很好。对于这些查询,从这两个查询中选择具有最多唯一值的一个(用SELECT COUNT(DISTINCT address) FROM dbo.employee检查它,或者如果还没有数据,尝试预测)。
如果在最坏的情况下,同一地址的同名同姓的人不多,你可以考虑从索引中删除“年龄”列。它将查找名字+地址,然后 * 范围扫描 *“street 6”上的所有“卢卡斯”,以查找是否有匹配年龄的人。如果数据模型允许,这将是一个合理的更改。然而,“年龄”列可能很窄,因此,与包含更多数据的“address”列(但需要是第一或第二列,以便这些查询可查找)相比,节省的空间不会很大。

相关问题