繁体   English   中英

SQL查询中需要的帮助

[英]Help Needed in SQL Query

以下是我的SQL查询,该查询针对30000000行,要花6分钟才能运行,索引被定义为where子句中使用的所有列,如wll作为内部联接请帮助我

SELECT auditData.id,nstmp.ProviderMaster_ID as CDRComment,Auditdata.Calltypetag  
from    Auditdata AuditData
inner join NoSeriesMaster_temp nstmp  on nstmp.NosereisTemp like '91%'
where  Auditdata.id in (select id from auditdata_temp1 where tatcalltype is  null)  
    and AuditData.CallTolen=12 and  Auditdata.Callto like nstmp.NosereisTemp + '%' and       AuditData.AuditMaster_ID=74

预先感谢

子查询

首先,摆脱子查询并改为使用联接,如下所示:

SELECT 
auditData.id, nstmp.ProviderMaster_ID as CDRComment, Auditdata.Calltypetag  

FROM Auditdata AuditData

INNER JOIN NoSeriesMaster_temp nstmp  
ON Auditdata.Callto like nstmp.NosereisTemp + '%' 
AND nstmp.NosereisTemp like '91%'

INNER JOIN auditdata_temp1 adt
ON Auditdata.id = adt.id
AND adt.tatcalltype is  null

WHERE AuditData.CallTolen = 12
AND AuditData.AuditMaster_ID = 74

这会有所帮助。

使用like子句的联接

  1. 由于值更改运行时,优化器无法计算最佳搜索路径,因此这将使您的执行计划混乱。
  2. 这是一个文本搜索,将对AuditData的每一行进行评估...不好!

将一列添加到NoSeriesMaster并按计划将其更新,以将未更新的条目更新为1其中NosereisTemp类似于“ 91%”。 而是在查询中使用此位值。

查看更改此内容:

Auditdata.Callto like nstmp.NosereisTemp + '%' 

使用类似的概念。 在不知道您的数据的情况下很难说出确切的方法。

您的查询非常密集,除了迭代大表之外,还执行联接和嵌套查询。

也许您可以使用嵌套sql的结果创建视图。 无论如何,您都必须重新编写查询,而不必使用这种复杂性。

另一个解决方案可能是考虑使用一些OLAP方法将大表划分为片或聚合数据。

您正在使用哪个数据库引擎?

您的WHERE子句( like nstmp.NosereisTemp + '%' )和JOIN ON子句(例如'91%')都具有LIKE表达式。 这总是比使用直接比较要慢,而且我认为这也可能影响您所拥有的索引是否可以得到有效利用。

是否可以修改表以包含可用于联接/过滤的字段? 例如,您可以预先计算“ like '91%'like '91%'的值并将其存储在表中吗?

在执行LIKE条件检查时,充其量只能进行索引扫描(通常无法进行性能最佳的索引查找)。 您对此无能为力-仅检查执行计划,留意需要检查的表扫描(丢失索引)

可能将“ Auditdata.id IN”子句更改为EXISTS条件可能会执行得更好(我假设id是auditdata_temp1中的PK,因此不会有多个具有相同值的情况,在这种情况下EXISTS不会巨大的差异,如果有的话)。

拥有如此大量的数据,您可能要考虑对数据进行分区,这可以从SQL 2005开始进行,但是您需要Enterprise Edition,因此可能不是一个选择。 有关信息,请参见此处

覆盖索引-可能会使您获得更好的性能。

确实,我们需要查看执行计划,该计划可能会将其他内容混入其中。

您应该在JOIN ON / WHERE条件附近稍微移动一下,连接条件应该是关联两个表的谓词:

INNER JOIN NoSeriesMaster_temp nstmp
ON Auditdata.Callto like nstmp.NosereisTemp + '%

然后,您需要将以下谓词移至查询的WHERE部分:

WHERE nstmp.NosereisTemp like '91%'

这可能有助于SQL Server提出更明智的执行计划。

如果这样做没有帮助,那么您应该考虑预先计算nstmp.NosereisTemp like '91%'的值, nstmp.NosereisTemp like '91%' -SQL Server应该能够很好地处理这种查询,但是可能会对JOINS产生影响

除此之外,没有执行计划就无法说清楚,但是我可以肯定地说这不是您的子查询! :-)(随时尝试将其重写为JOIN,但是如果删除子查询能解决您的问题,我将感到非常惊讶)

暂无
暂无

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

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