Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询中需要的帮助_Sql_Sql Server_Sql Server 2000 - Fatal编程技术网

SQL查询中需要的帮助

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%'

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

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应该能够完美地处理此类查询