gpt4 book ai didi

SQL IN 查询优化

转载 作者:行者123 更新时间:2023-12-04 21:38:36 26 4
gpt4 key购买 nike

我在 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);

这是它的执行计划:

enter image description here

我该如何解决这个问题?

最佳答案

由于基数估计不佳(无统计数据)、序列化修改等原因,表变量的性能几乎总是比临时表差。有很多关于此的博客,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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com