TOP 1 或 EXISTS - 哪个更快?

Posted

技术标签:

【中文标题】TOP 1 或 EXISTS - 哪个更快?【英文标题】:TOP 1 or EXISTS - Which is faster? 【发布时间】:2014-04-14 13:57:19 【问题描述】:

我在数据库中有一个表,其中包含近 200 万条记录。我需要确定是否有超过 1 条记录可供客户使用。我有以下两个脚本:

SELECT TOP 1 ex.exceptionId
FROM exception AS ex
WHERE ex.customerId='1BF87745-DE00-47FF-9AC0-430BAF87679A'
AND ex.loanId IS NULL
AND ex.statusType = 'required'
AND ex.exceptionState <> 'N'

SELECT (CASE WHEN EXISTS ( SELECT ex.exceptionId FROM exception AS ex
WHERE ex.customerId = '1BF87745-DE00-47FF-9AC0-430BAF87679A'
AND ex.loanId IS NULL
AND ex.statusType = 'required'
AND ex.exceptionState <> 'N') THEN 1 ELSE 0
END) AS CustomerExceptionCount

哪个会更快,为什么..?

非常感谢..!

【问题讨论】:

第一个查询不会回答您关于有多少条记录的问题吗? 这些是用作子查询吗?因为他们看起来都不会告诉你你想要什么。 您是否尝试将查询与服务器查询分析器进行比较? 您已经编写了两个查询。为什么不试试看呢?您可以查看执行计划以找出原因。 这些查询都没有回答more than 1 record 的问题。他们都只回答1 or more records 【参考方案1】:

你不想要类似的东西,

DECLARE @MoreThanOne Bit;

SELECT @MoreThanOne = CASE WHEN count(*) > 1 THEN 1 ELSE 0 END
FROM
(
    SELECT TOP 2 1
    FROM [exception]
    WHERE [customerId] ='1BF87745-DE00-47FF-9AC0-430BAF87679A'
       AND [loanId] IS NULL
       AND [statusType] = 'required'
       AND [exceptionState] <> 'N'
) [FirstTwo]

【讨论】:

【参考方案2】:

尝试运行这些查询,您将获得查询所花费的时间

SET STATISTICS TIME ON
SELECT TOP 1 ex.exceptionId
FROM exception AS ex
WHERE ex.customerId='1BF87745-DE00-47FF-9AC0-430BAF87679A'
AND ex.loanId IS NULL
AND ex.statusType = 'required'
AND ex.exceptionState <> 'N'
SET STATISTICS TIME OFF
GO
SET STATISTICS TIME ON
SELECT (CASE WHEN EXISTS ( SELECT ex.exceptionId FROM exception AS ex
WHERE ex.customerId = '1BF87745-DE00-47FF-9AC0-430BAF87679A'
AND ex.loanId IS NULL
AND ex.statusType = 'required'
AND ex.exceptionState <> 'N') THEN 1 ELSE 0
END) AS CustomerExceptionCount
SET STATISTICS TIME OFF

【讨论】:

以上是关于TOP 1 或 EXISTS - 哪个更快?的主要内容,如果未能解决你的问题,请参考以下文章

哪个查询更快:在 Amazon Redshift 中使用 order by 时 top X 或 limit X

使用 Exists 或 Select 将此值设置为位变量哪个更好?

哪个更快: char(1) 或 tinyint(1) ?为啥?

哪个更快: glob() 或 opendir()

JOIN 或 Correlated 子查询与 exists 子句,哪个更好

哪个更快?组合或多个查询?