【问题标题】:Select count Distinct Slow MSSQL选择计数不同的慢 MSSQL
【发布时间】:2021-12-24 19:07:21
【问题描述】:

您好,我在这里得到了一个简单的查询,但速度很慢,大约需要 40 秒才能取回数据,我尝试了不同的 SQL,但似乎仍然无法使其工作,任何建议都将不胜感激

select
  count (Distinct s.ExternalCustomerID) as PlayerCount,
  s.League  as Extra
from Q_Net_Ml_SportsDetailsActivity_monthly s with (nolock)
where  s.MerchantID = 584
  and s.WagerCount > 0
  and s.Year = 2021
group by League

计划: https://www.brentozar.com/pastetheplan/?id=HJ1bL0ivY

我试过这个:子查询

SELECT
    COUNT(ExternalCustomerID) AS Playercount,
    League AS extra
FROM (
    SELECT DISTINCT
      ExternalCustomerID,
      League
    FROM Q_Net_Ml_SportsDetailsActivity_monthly s with (nolock, INDEX(NCSI_Q_Net_Ml_SportsDetailsActivity_monthly))
    Where  s.MerchantID = 584
      and s.WagerCount > 0
      and s.Year = 2021
) dt
GROUP BY League

似乎仍然很慢 https://www.brentozar.com/pastetheplan/?id=HkAHjCswY

【问题讨论】:

  • NOLOCK 不是一个更快的开关,它是一个不正确的结果开关,除非你真的知道你在做什么,否则不要使用它。请在您的查询中添加索引定义。猜测一下,您需要一个索引(MerchantID, Year, League, ExternalCustomerID) INCLUDE (WagerCount ),但很难确定
  • @HoneyBadger 我认为它们是:第一个查询返回不同 ExternalCustomerID per League 的计数,第二个查询首先组成不同对的列表,然后每个 League 的计数相同

标签: sql sql-server azure-sql-database sql-execution-plan


【解决方案1】:

可能会尝试在您的表“Q_Net_Ml_SportsDetailsActivity_monthly”中放置一些索引,这些索引位于选择语句中使用的列中。然后尝试再次运行查询。

【讨论】:

  • 在测试端添加新索引似乎更快,我将添加到生产端看看是否有区别,我们使用列存储索引,通常不需要其他索引
  • 什么索引?就像(MerchantID, Year, Wager) INCLUDE (...) 上的覆盖索引一样?
  • 创建非聚类索引 [NCI_Q_Net_Ml_SportsDetailsActivity_monthly_3] ON [dbo]。[Q_Net_Ml_SportsDetailsActivity_monthly](MerchantID、Year、League、ExternalCustomerID)包括(WagerCount)
  • 在生产中应用索引并且仍然很慢我还能做些什么,我猜这是 azure SQL 上的资源问题,我们在 HS core 2 上,如果我选择所有 id 有 3300 万行。
猜你喜欢
  • 2022-01-18
  • 2016-08-21
  • 2013-03-20
  • 2013-11-11
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多