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 顶行。没有条件逻辑,因此可以有效地编译和索引。
我正在尝试编写一个 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 顶行。没有条件逻辑,因此可以有效地编译和索引。