我们使用SQL Server 2005来跟踪相当数量的不断传入的数据(每秒5-15次更新).我们注意到它已经生产了几个月后,其中一个表开始花费大量的时间来查询.
该表有3列:
id - 自动编号(群集)typeUUID - 插入发生之前生成的GUID; 用于将类型组合在一起typeName - 类型名称(duh ......)我们运行的查询之一是该typeName领域的一个独特的:
SELECT DISTINCT [typeName] FROM [types] WITH (nolock);
Run Code Online (Sandbox Code Playgroud)
该typeName字段上有一个非clusted,非唯一的升序索引.该表目前包含大约200M条记录.当我们运行此查询时,查询需要5米58秒才能返回!或许我们不理解的指标是如何工作的.但我不认为我们错误地理解它们是多少.
为了进一步测试,我们运行了以下查询:
SELECT DISTINCT [typeName] FROM (SELECT TOP 1000000 [typeName] FROM [types] WITH (nolock)) AS [subtbl]
Run Code Online (Sandbox Code Playgroud)
这个查询在大约10秒内返回,正如我所料,它正在扫描表格.
我们在这里缺少什么?为什么第一个查询需要这么长时间?
编辑:啊,我的道歉,第一个查询返回76条记录,谢谢你ninesided.
跟进:谢谢大家的回答,现在对我来说更有意义(我不知道为什么之前没有......).没有索引,它正在对200M行进行表扫描,带有索引,它正在对200M行进行索引扫描......
SQL Server确实更喜欢索引,它确实提供了一点性能提升,但没什么好兴奋的.重建索引确实将查询时间缩短到超过3米而不是6米,这是一项改进,但还不够.我只是向老板推荐我们规范表格结构.
再一次,谢谢大家的帮助!!