作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 SQL Server 中有这个查询,但由于 IN
子句,它需要很长时间。我该如何优化它?
DECLARE @PriorityIn TABLE ([PriorityId] [BIGINT] NOT NULL);
DECLARE @GatewayId BIGINT = 4;
INSERT INTO @PriorityIn
SELECT PriorityId
FROM PriorityProviders
WHERE ProviderId = @GatewayId AND Type = 0
SELECT COUNT(*)
FROM MessageIn
WHERE ScheduleDate < GetDate()
AND CurrentStatus IN (0, 3, 6)
AND ((ProviderId IS NULL
AND PriorityId IN (SELECT PriorityId FROM @PriorityIn))
OR ProviderId = @GatewayId);
当我查看这个查询时,它运行得非常快:
SELECT COUNT(*)
FROM MessageIn
WHERE ScheduleDate < GetDate()
AND CurrentStatus IN (0, 3, 6)
AND ((ProviderId IS NULL AND PriorityId IN (1, 2))
OR ProviderId = @GatewayId);
这是它的执行计划:
我该如何解决这个问题?
最佳答案
由于基数估计不佳(无统计数据)、序列化修改等原因,表变量的性能几乎总是比临时表差。有很多关于此的博客,here is one这是Brent Ozar discussing some differences .
因此,将其更改为临时表,看看它是否有助于开始。 @PriorityIn
中的行越多,就越有可能提供帮助。
我还将 @GatewayId
更改为 INT
除非 ProviderId
也是 BIGINT
。否则没有理由进行隐式转换。这也应该适用于 PriorityId
。
此外,here's a good blog post on kitchen sink queries and performance可以加快速度
关于SQL IN 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51326789/
我是一名优秀的程序员,十分优秀!