【发布时间】:2009-04-10 19:11:57
【问题描述】:
我有一个表,在应用程序的生命周期内可能有 10,000 到 1000 万行。此表包含 NACSZ 信息等,我需要编写一个查询来检查匹配的 NACSZ,如下所示:
select
*
from
Profiles
where
FirstName = 'chris' and
LastName = 'test' and
Address1 = '123 main st' and
City = 'chicago' and
State = 'il' and
Zip = '11111'
我正在尝试优化此查询的表,该查询将在“if exists()”构造中运行,但运气不佳。没有索引和大约 110,000 行测试数据,我得到:
表“配置文件”。扫描计数 1, 逻辑读取 2021,物理读取 0, read-ahead 读取 0,lob 逻辑读取 0, lob 物理读取 0, lob 预读为 0。
(受影响的 1 行)
SQL Server 执行时间:CPU 时间 = 16 毫秒,经过的时间 = 70 毫秒。
SQL Server 执行时间:CPU 时间 = 0 毫秒,经过的时间 = 1 毫秒。
执行计划指示对主键进行聚集索引扫描。我考虑为所有值添加一个索引,但这会创建一个相当大的键,如果可能的话,我想尽量避免这种情况。我的下一个想法是对行之间存在合理差异的内容进行索引,因此我尝试对名字进行索引(尽管我可以使用地址第 1 行或 zip,例如),所以我创建了索引:
create index ix_profiles_firstName on profiles(FirstName)
现在,当我运行相同的查询时,我得到了
表“配置文件”。扫描计数 1, 逻辑读取 171,物理读取 0, read-ahead 读取 0,lob 逻辑读取 0, lob 物理读取 0, lob 预读为 0。
(受影响的 1 行)
SQL Server 执行时间:CPU 时间 = 0 毫秒,经过的时间 = 52 毫秒。
SQL Server 执行时间:CPU 时间 = 0 毫秒,经过的时间 = 1 毫秒。
显然,索引名字有很大的不同。我的问题是,我如何决定是否应该索引名字、姓氏、地址和邮政编码?是否有一个命令我可以运行我的示例数据来告诉我每个字段中值的唯一性?我的理解是我应该尝试索引具有最大唯一性的列,以使索引工作得最好,对吗?
【问题讨论】:
标签: sql sql-server