繁体   English   中英

在sql server 2008中对百万记录表进行简单但缓慢的查询

[英]Simple but slow query on million records table in sql server 2008

朋友您好,感谢您的帮助。

我正在执行一个简单的查询,执行两个表之间的连接:

SELECT
F5_CNOMBRE,
F5_CTD,
F5_CNUMSER,
F5_CNUMDOC,
F5_DFECDOC,
F5_NIMPORT,
CD_DFECCAN,
CD_CCODART
FROM ft1
INNER JOIN cc1
ON RTRIM(cc1.CD_CNRODOC) = RTRIM(ft1.F5_CNUMSER) + ft1.F5_CNUMDOC
WHERE F5_CGLOSA LIKE @varNroExpediente + '%'

表ft1有大约1百万条记录,表cc1大约有700 000条记录。

当没有人正在使用这些表时,查询会快速运行,但是当用户使用这些表时,查询大约需要30/50秒才能完成。

我正在考虑创建一个索引视图,索引字段ft1.F5_CNUMSER和ft1.F5_CNUMDOC。 我认为这会改善性能。 我也希望你对这个问题有所了解,如果我在视图上创建了索引,那么查询表有可能在操作中被损坏,那些对于实际系统来说是非常重要的表。

我很欣赏我能够在这个问题上获得的洞察力。

看到你的两个表总共有147列,但你“只”选择其中的8个(这是一件好事!),你可以通过在表上有两个索引来获得良好的性能提升:

  • 在表ft1 ,在F5_CGLOSA上创建一个索引(在WHERE子句中使用)并包含该表中的其他列:

     CREATE INDEX IX01_ft1 ON dbo.ft1 (F5_CGLOSA) INCLUDE(F5_CNOMBRE, F5_CTD, F5_CNUMSER, F5_CNUMDOC, F5_DFECDOC, F5_NIMPORT) 
  • 在另一个表上, cc1 ,在两列中较小的一列上创建索引(取决于它们的数据类型)并包含另一列 - 我只是“猜到”它可能是这样的:

     CREATE INDEX IX01_ft1 ON dbo.cc1(CD_DFECCAN) INCLUDE(CD_CCODART) 

这样,您的查询(它需要的所有列)被这两个索引“覆盖”,并且只能扫描这两个索引(并组合这些扫描的结果),而不必扫描整个表(这是更大,更多的列)可以带来显着的改进(希望!)。

当然,实现与索引视图连接可能很有用,因为连接非常糟糕。 索引对它无济于事。 创建视图时,使F5_CGLOSA成为第一个聚簇索引列,以便查询可以在其上进行搜索。

不确定这是否可行,但你可以a)更改连接列,这样你就不必加入功能结果并成为SARGable,b)找出该查询的并发用户导致阻塞的原因? 也许你可以通过打开快照隔离来解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM