执行我的基本查询需要很长时间

Performing of my basic query taking long time

我使用 MsSQL。我有一个 "jobs" table,它有 140 列,其中包含超过 400 万条记录。 table 的列主要是 varchar 和 bit。

table 的 40 列与其他一些 table 相连。喜欢 "issuerid" 来自 "issuers" table,"fileid" 来自 "files"...

table 的索引仅在 "fileid" 上,非唯一且非聚集。

我的基本查询如下:

 select issuerid,count(id) as total , sum(case when X_Status=1 then 1 else 0 end) P_Count  
from jobs  where 1=1  and issuerid='1001' and  creationdate between '01/01/2019 12:00:01 AM' and '06/30/2019 11:59:59 PM' group by issuerid 

查询时长为:1分20秒(PC有SSD和4GB内存)

所以我尝试在 issuerid 上建立索引,但影响不大。

我的 asp 页面在这个 table 上有很多疑问。例如,总和的情况变化很大; sum(case when Y_Status=1 then 1 else 0 end) P_Count 像这样。

所以甚至尝试让 table 中的 2 列并执行此查询 select count(id) as, sum(case when X_Status=1 then 1 else 0 end) P_Count from newjobs where 1=1 这花了大约 30 秒。

我阅读了许多主题和文章来提高查询性能,但没有奏效。有没有人有什么想法可以分享一下?

谢谢。

以下应该适用于您的确切查询:

CREATE NONCLUSTERED INDEX IX_Jobs__IssuerID_CreationDate ON dbo.Jobs (IssuerID, CreationDate)
    INCLUDE (X_Status);

由于您对 IssuerID 和 CreationDate 的查询过滤器是关键列,因此我添加了 X_Status 作为非关键列,以便整个查询可以从该索引 运行 那里不可能进行书签查找或索引扫描。

顺便说一句,您当前的 where 子句将始终排除在第一天的第一秒和最后一天的最后一秒发生的事情(即在 00:00:0000:00:01 之间1 月 1 日,以及 06/30/2019 23:59:5907/01/2019 00:00:00)。这可能是故意的,但我怀疑不是。使用开放式日期范围通常更好,也更清楚您的意图。

WHERE   CreationDate > '20190101'
AND     CreationDate < '20190701'

或更有可能:

WHERE   CreationDate >= '20190101'
AND     CreationDate < '20190701'

我还切换到文化不变的日期时间格式,这样日期文字在每台机器上都被解释为相同的日期。如需更多阅读,请参阅: