回答

收藏

在SQL Server中对大型数据集进行慢速不同查询

技术问答 技术问答 229 人阅读 | 0 人回复 | 2023-09-14

我们正在使用SQL Server0 T3 J3 o0 @. k" [! P- e+ G0 t
2005跟踪相当数量的不断传入的数据(每秒5-15次更新)。我们注意到,在生产几个月之后,其中一个表开始花费大量的时间进行查询。/ ]3 K1 d8 t+ w- E
该表有3列:
& `7 u5 w# i) }! P/ ~6 Q5 Kid -自动编号(丛集). H6 K6 ]$ C) O4 ]" c; R7 O
typeUUID-在插入发生之前生成的GUID; 用于将类型分组在一起
# s! A1 }9 s7 ]typeName -类型名称(duh …)
/ G6 V+ B0 L; `9 E% N
' P7 P. f5 U1 T+ J' s) Q$ t. q
我们运行的查询之一是该typeName字段上的一个查询:# k" j) o, U$ O3 x
SELECT DISTINCT [typeName] FROM [types] WITH (nolock);
/ Q! c- X6 `! T0 \该typeName字段上具有非聚集,非唯一的升序索引。该表目前包含大约2亿条记录。当我们运行此查询时,该查询花了5m
& g5 e9 }& c: h* ^9 a58s返回!也许我们不了解索引的工作原理……但是我认为我们并没有对索引 有 太多误解。, B0 s  c; a0 j
为了进一步测试,我们运行了以下查询:" c" }! M0 c8 d# m, ~
SELECT DISTINCT [typeName] FROM (SELECT TOP 1000000 [typeName] FROM [types] WITH (nolock)) AS [subtbl]  `* [% w$ ~) ]) k
如我所料,此查询将在大约10秒钟内返回,它正在扫描表。3 ]9 g% ~  r* Y; N- z
这里有我们想念的东西吗?为什么第一个查询要花这么长时间?
3 j9 e6 P$ x2 h编辑: 抱歉,我的第一个查询返回了76条记录,谢谢您的支持。" K; Z2 \7 ?/ d3 C  T
跟进:
$ T+ }- d' C1 r4 k' t7 g谢谢大家的回答,现在对我来说更有意义(我不知道为什么以前没有……)。没有索引,它将对200M行进行表扫描,而对于索引,则将对200M行进行索引扫描…! b" b5 |# s! E
SQL
$ K2 u. e% x7 }) VServer确实更喜欢索引,并且确实提高了性能,但是没有什么令人兴奋的。重建索引确实使查询时间减少到刚刚超过3m,而不是6m,这是一个改进,但还不够。我只是向我的老板建议我们规范化表结构。8 V' o2 i0 n5 t, v; x( w
再次感谢大家的帮助!0 F! L) T: d: e" A9 F1 _, M
                0 P/ [& e8 {1 a. S+ d7 I3 {3 W6 m
解决方案:
+ {! I2 p  N- S5 P$ n; y               
( o; D  J9 y6 N6 e) g4 g" q7 @6 y( a$ g8 ]5 n: }, U

5 f7 z7 j2 D% g8 O" p                您确实误解了索引。即使它确实使用了索引,它仍将对200M个条目进行索引扫描。这将花费很长时间,加上执行DISTINCT所花费的时间(导致排序),而且运行起来很不好。在查询中看到DISTINCT总是会出现一个红色标记,并使我再次检查该查询。在这种情况下,也许您存在标准化问题?
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则