【问题标题】:Which of these queries are faster, when used with SQL Server?与 SQL Server 一起使用时,哪些查询更快?
【发布时间】:2014-02-26 04:51:49
【问题描述】:

我想检查一个表是否包含一行。哪个更快?

IF EXISTS(SELECT * FROM TABLE)

IF EXISTS(SELECT TOP 1 * FROM TABLE)

【问题讨论】:

标签: sql sql-server


【解决方案1】:

查询之间没有区别!

选择中的列不会被评估。 如果您回忆一下逻辑查询处理,首先执行 from 子句。 select 子句在最后一步执行(实际上 Order By 是,但这是一个装饰性的东西)。

因此,当 from 子句执行时,无论列名如何,都会返回行。 您必须添加列名,否则会出现语法错误

【讨论】:

    【解决方案2】:
    IF EXISTS(SELECT 1 FROM TABLE)
    

    更快

    还有一些建议

    IF EXISTS(SELECT null FROM TABLE)
    

    【讨论】:

    • 不是真的 - 这是一个神话 - IF EXISTS (SELECT * FROM dbo.Table)IF EXISTS (SELECT 1 FROM dbo.Table) 之间没有没有区别IF EXISTS only 检查是否存在 - 它实际上并不返回任何数据,因此无论您使用 SELECT * 还是 SELECT 1 都完全不相关......
    • @HbV2,你能解释说这个查询更快的原因吗?无论如何查询具有相同的执行计划,IO 统计也相似......
    • 这很有趣,marc_s。自 V7 以来,我一直在使用 T-SQL,并且我一直被告知/听说 SELECT 1 在执行存在时也比 SELECT * 更好。您所说的实际上是有道理的,我只是认为引擎必须在执行检查之前先填充字段,这就是为什么 * 会比 1 慢。
    • optimization-tips 请检查..
    • @Stuart:这样想是很常见的错误。但实际上:两者之间没有没有的区别!要点是:没有数据被返回 - 不需要找到任何列或任何东西 - SQL Server 只是真正检查是否至少有一行符合 WHERE 标准 - 如果有,它就停在那里(除了SELECT COUNT(*) ... 一直到表的末尾 - 即使您只想找出是否存在一行)
    【解决方案3】:

    显然 SELECT TOP 1 * FROM TABLE 更快。

    由于索引扫描减少到一,返回的行数是一并且 估计运营成本也少很多。

    但如果表中只有一行,则两个查询将显示相同的操作成本。

    SELECT * 
    FROM (SELECT top 1 * 
          FROM ms_data)  temp  
    SELECT TOP 1 * 
    FROM ms_data
    

    上述两个查询的操作成本相同。

    【讨论】:

    • 并非如此 - 这是一个神话IF EXISTS (SELECT * FROM dbo.Table)IF EXISTS (SELECT 1 FROM dbo.Table) 之间没有没有区别IF EXISTS 检查是否存在 - 它实际上并不返回任何数据,因此无论您使用SELECT * 还是SELECT 1 都完全不相关......
    • 你看执行计划了吗?在任何情况下(超过 1 行,无行)它们确实具有相同的执行计划 + IO 统计信息
    猜你喜欢
    • 2018-06-16
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多