[英]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子句的联接
解
将一列添加到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.