sql - SQL Server 中对大型数据集的不同查询速度缓慢

标签 sql sql-server sql-server-2005

我们使用 SQL Server 2005 来跟踪大量不断传入的数据(每秒 5-15 次更新)。我们注意到,在它投入生产几个月后,其中一个表开始花费大量时间来查询。

该表有 3 列:

  • id -- 自动编号(集群)
  • typeUUID -- 在插入发生之前生成的 GUID;用于将类型分组在一起
  • typeName -- 类型名称(废话...)

我们运行的查询之一在 typeName 字段上是不同的:

SELECT DISTINCT [typeName] FROM [types] WITH (nolock);

typeName 字段具有非聚集、非唯一的升序索引。该表目前包含大约 200M 记录。当我们运行这个查询时,查询花了 5m 58s 才返回!也许我们不理解索引是如何工作的...但我认为我们对它们的理解并没有那么严重。

为了进一步测试这一点,我们运行了以下查询:

SELECT DISTINCT [typeName] FROM (SELECT TOP 1000000 [typeName] FROM [types] WITH (nolock)) AS [subtbl]

正如我所料,此查询将在大约 10 秒内返回,它正在扫描表。

我们是否遗漏了什么?为什么第一个查询需要这么长时间?

编辑:啊,抱歉,第一个查询返回76条记录,谢谢nineside。

跟进:谢谢大家的回答,现在对我来说更有意义(我不知道为什么以前没有......)。没有索引,它会跨 200M 行进行表扫描,如果有索引,它会跨 200M 行进行索引扫描...

SQL Server 确实更喜欢索引,它确实带来了一点性能提升,但没什么值得兴奋的。重建索引确实将查询时间从 6m 降到了 3m 多一点,这是一个改进,但还不够。我只是要向我的老板建议我们规范化表结构。

再次感谢大家的帮助!!

最佳答案

您确实误解了索引。即使它确实使用了索引,它仍然会对 200M 条目进行索引扫描。这将花费很长时间,加上执行 DISTINCT (导致排序)所需的时间,并且运行起来是一件坏事。在查询中看到 DISTINCT 总是会引发危险信号,并导致我仔细检查查询。在这种情况下,也许您遇到标准化问题?

关于sql - SQL Server 中对大型数据集的不同查询速度缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/754957/

相关文章:

sql-server - 如何消除 SQL 生成的 XML 中多余的 namespace 声明?

c# - 从外部文件读取连接字符串

sql-server - SSRS 中的 "Enable remote error"

sql - 在 SQL Server 中使用 STRING_AGG 获取唯一值

sql - 相同的查询使用不同的索引?

c# - 操作数类型冲突 : int is incompatible with uniqueidentifier

php - 一个 URL 中有两个单独的 ID?

java - 将 SQL 查询文本中的参数替换为 XXXXX

sql - 如何将 Sql Int 值拆分为多行

java - Flyway 迁移在 MS SQL Server 中成功,但在 H2 数据库中失败