SQL Server中大型数据集的慢速独特查询

Miq*_*lla 11 sql sql-server sql-server-2005

我们使用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米,这是一项改进,但还不够.我只是向老板推荐我们规范表格结构.

再一次,谢谢大家的帮助!!

Al *_*l W 9

你确实误解了索引.即使它确实使用了索引,它仍然会对200M条目进行索引扫描.这将需要很长时间,加上执行DISTINCT所需的时间(导致排序)并且运行起来是件坏事.在查询中看到DISTINCT总是会引发一个红色标记并导致我仔细检查查询.在这种情况下,也许你有一个规范化问题?


小智 5

使用关键字时 SQL Server 优化器存在问题DISTINCT。解决方案是通过单独分解不同的查询来强制它保持相同的查询计划。

因此我们接受了诸如以下的查询:

SELECT DISTINCT [typeName] FROM [types] WITH (nolock);
Run Code Online (Sandbox Code Playgroud)

并将其分为以下几部分:

SELECT typeName INTO #tempTable1 FROM types WITH (NOLOCK)
SELECT DISTINCT typeName FROM #tempTable1
Run Code Online (Sandbox Code Playgroud)

另一种解决方法是使用 a GROUP BY,它会得到不同的优化计划。

  • 最好添加一些有关这如何改变执行计划的更多信息。 (2认同)