【问题标题】:Performing of my basic query taking long time执行我的基本查询需要很长时间
【发布时间】:2019-12-28 11:45:58
【问题描述】:

我使用 MsSQL。我有一个“工作”表,它有 140 列,其中包含超过 400 万条记录。该表的列主要是 varchar 和 bit。

该表的 40 列连接到其他一些表。就像“issuers”表中的“issuerid”,“files”中的“fileid”......

表的索引只在“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 页面的表的查询。例如,总和情况发生了很大变化; sum(case when Y_Status=1 then 1 else 0 end) P_Count 像这样。

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

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

谢谢。

【问题讨论】:

  • id、X_Status、创建日期都应用了哪些索引? issuerid='1001' 也是这个数字吗?如果它是一个 int 会更好,然后你可以过滤一个更快的 int。我提到的所有列都将受益于索引
  • 包括表和它的索引 DDL,查询执行计划会很棒。使用brentozar.com/pastetheplan
  • @jimmy8ball 首先,ID 已经是主键,我在 fileid 上有。我尝试将所有内容分别索引到creationdate、issuerid 和X_Status。但不影响。我在没有创建日期条件的情况下运行查询,但仍然需要很长时间。 issuerid 是“bigint” 感谢您的关注。
  • 你的 issuerid 是 int 吗?
  • 如果 isserid 是 int 则不要使用单引号,只需 issuerid=1001 会更快。使用单引号会强制在文本中处理它

标签: sql sql-server sql-server-2008 ssms ssms-2014


【解决方案1】:

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

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

由于您在 IssuerID 和 CreationDate 上的查询过滤器是关键列,因此我已将 X_Status 添加为非关键列,以便可以从此索引运行整个查询,并且没有书签查找或索引的机会扫描。

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

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

或者更有可能:

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

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

【讨论】:

  • 这是一个很好且很有启发性的答案。我非常感谢你加雷斯。我有最后一个问题。正如我告诉你的,我有很多状态栏代表另一件事。所以你认为像你所做的那样根据这个状态创建不同的索引,对我来说是个好方法吗?还是像这样创建 5-6 个索引会产生负面影响?
  • 每个额外的非聚集索引都会在写入操作期间带来性能成本,因此在确定读取操作期间获得的收益是否超过此成本之间始终是一种平衡行为。我无法回答这个问题,因为我不知道您多久会运行一次从该索引读取的查询,以及您多久会在表中添加/更新记录。
  • 好的,让我给你一些关于添加表格句点的简短信息。我在 6 个月内获得了 150 万条记录,但这可能会根据客户的行为而增加。所以我在这个表上执行不同类型的查询,它就像我的主表,你可以从列数中理解。我通常每月运行一次您帮助我的查询。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 2016-04-22
  • 2019-12-29
  • 2021-12-25
相关资源
最近更新 更多