SQL查询需要帮助

时间:2009-07-28 08:58:04

标签: sql sql-server sql-server-2000

下面是我的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

5 个答案:

答案 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子句的连接

  1. 这会弄乱您的执行计划,因为当值更改运行时,优化程序无法计算最佳搜索路径。
  2. 这是一个文本搜索,将对AuditData的每一行进行评估......不太好!
  3. <强>解决方案

    向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,但如果删除子查询可以解决您的问题,我会非常惊讶)