下面是我的SQL查询,它运行30000000行,运行需要6分钟 索引被定义为where子句中使用的所有列,作为内连接 请帮帮我
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
提前thanx
答案 0 :(得分:1)
子查询
首先摆脱子查询并使用连接,如下所示:
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 + '%'
使用类似的概念。如果不知道你的数据就很难确切地说出来。
答案 1 :(得分:0)
您的查询非常密集,您可以迭代一个大表,进行连接和嵌套查询。
也许你可以使用嵌套sql的结果创建一个视图。在任何情况下,您都必须在不使用该复杂性的情况下重写查询。
另一种解决方案可能是考虑将大表分成片或使用一些OLAP方法聚合数据。
您使用的是哪个数据库引擎?
答案 2 :(得分:0)
您的LIKE
子句(WHERE
)和like nstmp.NosereisTemp + '%'
子句(如'91%')中都有JOIN ON
个表达式。这总是比使用直接比较慢,我认为它也可能影响你的索引是否可以有效使用。
是否可以修改表格以包含可用于加入/过滤的字段?例如,您是否可以预先计算like '91%'
并将值存储在表中?
答案 3 :(得分:0)
当你正在进行LIKE条件检查时,它将充其量地执行索引扫描(将无法进行通常最佳性能的索引搜索)。您无能为力 - 只需检查执行计划,留意需要查看的表扫描(缺失索引)
可能将“Auditdata.id IN”子句更改为EXISTS条件可能会表现得更好(我假设id是auditdata_temp1中的PK,因此不会有多个具有相同值的值,在这种情况下,EXISTS赢了'如果有的话,会产生巨大的差异。
使用该数据量,您可能需要考虑对数据进行分区,您可以从SQL 2005开始进行分区,但是您需要Enterprise Edition,因此可能无法选择。有关信息,请参阅here。
覆盖索引 - 可能会让你获得更好的表现。
真的,我们需要看到执行计划可能会把其他东西混合在一起。
答案 4 :(得分:0)
你应该稍微改变JOIN ON / WHERE标准,连接标准应该是与两个表相关的谓词:
INNER JOIN NoSeriesMaster_temp nstmp
ON Auditdata.Callto like nstmp.NosereisTemp + '%
然后,您需要将以下谓词移动到查询的WHERE部分:
WHERE nstmp.NosereisTemp like '91%'
这可能有助于SQL服务器提出更明智的执行计划。
如果这没有帮助那么你应该考虑预先计算nstmp.NosereisTemp like '91%'
的值 - SQL Server应该能够完全处理这种类型的查询,但它可能会对JOINS产生影响
不过没有执行计划就不可能说,但我可以肯定地说这不是你的子查询! :-)(随意尝试将其重写为JOIN,但如果删除子查询可以解决您的问题,我会非常惊讶)