SQL查询中需要的帮助
下面是我的SQL查询,它针对30000000行运行,运行需要6分钟 将where子句中使用的所有列的索引定义为wll作为内部联接 请帮帮我SQL查询中需要的帮助,sql,sql-server,sql-server-2000,Sql,Sql Server,Sql Server 2000,下面是我的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%'
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预先您的查询非常密集,只需迭代一个大表,执行联接和嵌套查询 也许您可以使用嵌套sql的结果创建一个视图。在任何情况下,您都必须重写查询,而不使用这种复杂性 另一个解决方案是考虑将大表划分为若干个部分,或者使用一些OLAP方法聚合数据
您使用的是哪个数据库引擎?您的查询非常密集,只需迭代一个大表,执行联接和嵌套查询 也许您可以使用嵌套sql的结果创建一个视图。在任何情况下,您都必须重写查询,而不使用这种复杂性 另一个解决方案是考虑将大表划分为若干个部分,或者使用一些OLAP方法聚合数据
您使用的是哪个数据库引擎?您的
WHERE
子句(LIKE nstmp.noserietemp+'%
)和JOIN ON
子句(LIKE'91%')中都有LIKE
表达式。这总是比使用直接比较慢,而且我认为这也可能会影响你的索引是否能被有效地使用
是否可以修改表以包含可用于联接/筛选的字段?例如,您可以预计算
如'91%'
并将值存储在表中吗?在WHERE
子句(如nstmp.noserietemp+'%'
)和JOIN ON
子句(如'91%')中都有如表达式。这总是比使用直接比较慢,而且我认为这也可能会影响你的索引是否能被有效地使用
是否可以修改表以包含可用于联接/筛选的字段?例如,您能否预先计算如'91%'
并将值存储在表中?它最多只能像执行条件检查一样执行索引扫描(无法执行通常对性能最好的索引搜索)。对此您无能为力-只需检查执行计划,留意需要查看的表扫描(缺少索引)
可能将“Auditdata.id IN”子句更改为EXISTS条件可能会执行得更好(我假设id是Auditdata_temp1中的PK,因此不会有具有相同值的多个,在这种情况下EXISTS不会产生巨大的差异(如果有的话)
使用该数据量,您可能需要考虑对数据进行分区,这可以从SQL 2005开始,但您需要企业版,因此可能不是一个选项。有关信息,请参阅
覆盖索引-可能使用一个索引会获得更好的性能
实际上,我们需要看到执行计划,它可能会将其他东西加入到组合中。它最多只能像执行条件检查一样执行索引扫描(不能执行通常对性能最好的索引搜索)。对此您无能为力-只需检查执行计划,留意需要查看的表扫描(缺少索引)
可能将“Auditdata.id IN”子句更改为EXISTS条件可能会执行得更好(我假设id是Auditdata_temp1中的PK,因此不会有具有相同值的多个,在这种情况下EXISTS不会产生巨大的差异(如果有的话)
使用该数据量,您可能需要考虑对数据进行分区,这可以从SQL 2005开始,但您需要企业版,因此可能不是一个选项。有关信息,请参阅
覆盖索引-可能使用一个索引会获得更好的性能
实际上,我们需要查看执行计划,它可能会将其他内容加入到组合中。子查询
首先去掉子查询,改用联接,如下所示:
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,其中noseriesTemp类似于“91%”。改为在查询中使用此位值
看看如何改变这一点:
Auditdata.Callto like nstmp.NosereisTemp + '%'
使用类似的概念。在不知道数据的情况下,很难准确说出具体的查询方式。子查询
首先去掉子查询,改用联接,如下所示:
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,其中noseriesTemp类似于“91%”。改为在查询中使用此位值
看看如何改变这一点:
Auditdata.Callto like nstmp.NosereisTemp + '%'
使用类似的概念。在不知道数据的情况下,很难准确地说出如何进行连接。您应该在/WHERE条件上稍微转换一下连接条件,连接条件应该是关联两个表的谓词:
INNER JOIN NoSeriesMaster_temp nstmp
ON Auditdata.Callto like nstmp.NosereisTemp + '%
然后需要将以下谓词移动到查询的WHERE部分:
WHERE nstmp.NosereisTemp like '91%'
这可能有助于SQL server制定更合理的执行计划
如果这没有帮助,那么您应该研究如何预先计算nstmp.noseriestemp的值,比如“91%”
——SQL Server应该能够完美地处理此类查询