我们使用 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/