Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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
带有datediff函数的慢速T-SQL查询_Sql_Sql Server_Tsql - Fatal编程技术网

带有datediff函数的慢速T-SQL查询

带有datediff函数的慢速T-SQL查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个查询,当date子句和datediffday,con2.DT_dateinclude,'2017-01-01'这基本上是您的查询时,它运行得很快: 这是您的查询: select distinct top 10 ID_Contact, NO_CodCompany from tblContacts con1 where ID_Contact in (select top 2 ID_Contact from tblContacts con2 inner

我有一个查询,当date子句和datediffday,con2.DT_dateinclude,'2017-01-01'这基本上是您的查询时,它运行得很快: 这是您的查询:

select distinct top 10 ID_Contact, NO_CodCompany
from tblContacts con1
where ID_Contact in (select top 2 ID_Contact
                     from tblContacts con2 inner join
                          tblCompanies cp
                          on con2.NO_CodCompany = cp.ID_Company
                     where con2.NO_CodCompany = con1.NO_CodCompany and
                           datediff(day, con2.DT_DateIncluded), '2017-01-01') <= 0
                    );
然后,我将删除子查询中的联接。我不能100%确定这是否完全等同,因为这可能取决于数据中的细微差别:

select distinct top 10 ID_Contact, NO_CodCompany
from tblContacts con1
where con1.ID_Contact in (select top 2 con2.ID_Contact
                          from tblCompanies cp
                          where con1.NO_CodCompany = cp.ID_Company and
                                con1.DT_DateIncluded < '2017-01-02' 
                         );
然后,如果可以在最外层的查询中删除select distinct,则应执行此操作。

请尝试以下操作:

con2.DT_DateIncluded < '20170102'
APPLY的工作方式有点像嵌套SELECT查询上的连接,其中没有on子句;连接条件作为WHERE子句的一部分包含在嵌套的SELECT语句中

注意十字架的用法。这将排除完全没有联系人的公司。如果您想包括这些公司,请将其更改为OUTER


您还应该看看您定义了哪些索引。tblContacts表上的一个索引,用于查看顺序中包含的NO_CodCompany和DT_Date!对于这个查询可能会产生奇迹,特别是如果它在INCLUDES子句中也有ID\u Contact。然后,您可以完全从索引中完成查询的tblContacts部分。

而不是“DATEDIFF<0”,请尝试使用:

and con2.DT_DateIncluded <= '2017-01-01' 
另外,确保“DT_DateIncluded”列上有索引

DATEDIFF运行缓慢的原因是,使用它执行计算需要一些时间,查询优化器可能会对整个表运行它,并且可能没有索引来帮助它选择所需的行


当您删除该子句时,查询运行得更快,但这可能是因为您只选择了内部查询中的前两行和外部查询中的十行,这样就可以充分执行表扫描

嗨,戈登·林诺夫,谢谢你的快速回复。虽然我不得不说,在这些建议的更改之后,它一直运行缓慢,但我会将它们保留在代码中,因为它们可能会增加一些性能。。。干杯DATEDIFF'2017-01-01 11:59:50','2017-01-01'的值仍然为0。等效代码应为DT_DateIncluded<'20170102',而不是DT_DateIncluded<'20170101'@JoelCoehoorn。不清楚名为DateIncluded的字段是否有时间组件——尽管如果dt前缀意味着datetime,这是相当合理的。我更新了答案。大家好,大家发表了评论。添加建议的更改后,仍然没有乐趣…我使用此查询的目标是从公司获取联系人,但在我用作示例的查询中,每个公司的联系人数量限制为n个,n=2。我作为示例发布的查询做得非常好,但是当我在其中添加date子句时,它的速度变得非常慢。此日期字段已编制索引,我已将datediff表达式更改为简单的DT_DateIncluded>='20170101'。但仍然没有乐趣…我会很高兴有一个不同的查询,它正常执行日期子句或没有它。@Claudio.hz查看我的更新答案。如果这有帮助的话,我会很高兴听到之前和之后的消息。谢谢Phylyp的帮助。我认为,根据您的评论和上面的其他评论,datediff函数最好用比较子句代替。
con2.DT_DateIncluded < '20170102'
SELECT TOP 10 ct.ID_Contact, ct.NO_CodCompany
FROM tblCompanies cp
CROSS APPLY (
    SELECT TOP 2 ID_Contact, NO_CodCompany
    FROM tblContacs 
    WHERE NO_CodCompany = cp.ID_Company
        AND DT_DateIncluded < '20170102'
    ORDER BY DT_DateIncluded DESC
) ct
and con2.DT_DateIncluded <= '2017-01-01'