【问题标题】:SQL Server query inefficient for table with high I/O operations对于具有高 I/O 操作的表,SQL Server 查询效率低下
【发布时间】:2018-08-25 14:37:27
【问题描述】:

我正在尝试编写一个 sql 脚本,它从列表中返回一个项目,如果该项目可以在列表中找到,如果没有,它返回最近添加到列表中的项目。我想出了一个使用 count 和 if-else 语句的解决方案。但是我的表有非常频繁的 I/O 操作,我认为这个解决方案效率低下。有没有人可以优化此解决方案或更好的方法。

这是我的解决方案:

DECLARE @result_set INT
SET @result_set = (
    SELECT COUNT(*) FROM
    ( SELECT *
        FROM notification p 
        WHERE p.code = @code 
            AND p.reference = @reference 
            AND p.response ='00'
    ) x
)

IF(@result_set > 0)
    BEGIN
        SELECT * 
        FROM notification p 
        WHERE p.code = @code 
            AND p.reference = @reference 
            AND p.response ='00'
    END
ELSE
    BEGIN
        SELECT
        TOP 1  p.*
        FROM notification p (nolock) 
        WHERE p.code = @code 
            AND p.reference = @reference
        ORDER BY p.id DESC
    END

我也认为应该有办法绕过重复这个选择语句:

SELECT *
    FROM notification p 
    WHERE p.code = @code 
        AND p.reference = @reference 
        AND p.response ='00'

我只是不够精通 SQL,无法弄清楚。

【问题讨论】:

  • 我不明白您的代码中的任何内容与“最新”有何关系。
  • 在“else”语句中,当结果按 id 降序排列时,它返回第一个条目。最大的 id 通常是表中的最新条目,或者该结果集中的最新条目

标签: sql sql-server io query-performance sqlperformance


【解决方案1】:

你可以这样做:

SELECT TOP (1) n.*
FROM notification n 
WHERE p.code = @code  AND p.reference = @reference 
ORDER BY (CASE WHEN p.response ='00' THEN 1 ELSE 2 END), id DESC;

这将首先返回响应为'00' 的行,然后返回任何其他行。我希望 ORDER BY 的另一列可以处理新近度,但您的示例代码没有提供任何线索说明这可能是什么。

【讨论】:

  • 谢谢。这真的很有帮助。但是要求是,如果它不能返回响应为 '00' 的行,则返回具有最高 id 的行。
  • @Mimi.O 。 . .这很容易通过添加id DESC 作为ORDER BY 键来解决。这个要求在问题中并不是特别清楚。
  • 谢谢!很抱歉造成混乱
【解决方案2】:
WITH ItemIWant AS (
SELECT *
        FROM notification p 
        WHERE p.code = @code 
            AND p.reference = @reference 
            AND p.response ='00'
),
SELECT *
FROM ItemIWant
UNION ALL
SELECT TOP 1 *
FROM notification p 
WHERE p.code = @code 
    AND p.reference = @reference 
    AND NOT EXISTS (SELECT * FROM ItemIWant)
ORDER BY id desc

这将在桌子上以最少的通行证做到这一点。如果没有 ItemIWant 返回的行,它将仅返回顶行。没有条件逻辑,因此可以有效地编译和索引。

【讨论】:

  • ORDER BY 语句抛出“无法绑定此多部分标识符 p.id”错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2023-03-07
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多