【发布时间】:2022-01-06 12:16:00
【问题描述】:
我正在做一些性能测试,StackOverflow2010 DB 非常适合。
在这里测试多列连接SQL WHERE.. IN clause multiple columns
StackOverflow 数据库可在此处获得:https://www.brentozar.com/archive/2015/10/how-to-download-the-stack-overflow-database-via-bittorrent/
我正在尝试查询特定用户的帖子评论:
-- get users id < 5
SELECT *
FROM [Users]
WHERE Id < 5;
-- get posts for those users
SELECT *
FROM [Posts]
WHERE [OwnerUserId] IN (SELECT [Id] FROM [Users] WHERE Id < 5);
-- get comments for these posts
SELECT *
FROM [Comments]
WHERE [PostId] IN (SELECT [Id]
FROM [Posts]
WHERE [OwnerUserId] IN (SELECT [Id] FROM [Users] WHERE Id < 5))
AND [UserId] IN (SELECT [OwnerUserId]
FROM [Posts]
WHERE [OwnerUserId] IN (SELECT [Id] FROM [Users] WHERE Id < 5));
-- THIS version seems to select ALL comments and takes forever!
SELECT *
FROM [Comments]
WHERE EXISTS (SELECT *
FROM [Posts]
WHERE [OwnerUserId] IN (SELECT [Id] FROM [Users] WHERE Id < 5));
IN 查询有效,但它选择了一些 OwnerUserId 没有创建的评论(孤儿)。
EXISTS 查询(这似乎是正确的方法)似乎选择了 ALL cmets 并且需要永远!
有什么想法吗?原因在这里解释:https://sproket.github.io/Persism/n+1.html
【问题讨论】:
-
EXISTS中的子查询不相关。因此,它将返回表Comments中的每一行,因为EXISTS中的查询将找到至少一行存在。事实上,没有一个子查询是相关的。 -
您是否尝试过执行实际的 JOIN 而不是 EXISTS/IN 查询?另外,为什么
AND [UserId] IN (<double nested subquery>)而不是AND [UserId] < 5? -
@Larnu 我添加了一个链接来解释推理。这一切都适用于单列连接。
-
如果信息与问题相关,请将其放在问题中,@sproketboy 。不要要求用户访问 Git 存储库的链接才能理解问题。
-
@Larnu 好的,我会再次询问这个问题并提供更多信息。
标签: sql-server database