SQL 服务器查询效率低 table 具有高 I/O 操作

SQL Server query inefficient for table with high I/O operations

我正在尝试编写一个 sql 脚本,该脚本 returns 列表中的一个项目,如果可以在列表中找到该项目,如果没有,它 returns最近添加到列表中的项目。我想出了一个使用计数和 if-else 语句的解决方案。然而,我的 table 有非常频繁的 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 语句:

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

我只是对 SQL 不够熟练,无法理解。

你可以这样做:

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;

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

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

这将在 table 上以最少的通过次数来做到这一点。如果没有行 return 由 ItemIWant 编辑,它只会 return 顶行。没有条件逻辑,因此可以有效地编译和索引。