如何优化存储过程中具有相似连接和条件的多个 SQL 查询?

问题描述 投票:0回答:1

我目前正在 SQL Server 中处理大型数据集,我需要执行三个不同的

SELECT
查询,每个查询的条件略有不同:

-- Query 1
SELECT * FROM Customers
WHERE CustomerID > 80;

-- Query 2
SELECT * FROM Customers
WHERE CustomerID = 1;

-- Query 3
SELECT * FROM Customers
WHERE Country = 'Mexico';

每个查询都使用相同的一组

JOIN
子句和附加条件,如下所示:

FROM Customers C
LEFT JOIN Orders O ON C.CustomerID = O.CustomerID
LEFT JOIN OtherTables OT ON C.SomeID = OT.SomeID
WHERE C.Active = 1 -- Common condition
AND O.OrderStatus = 'Completed'

我目前的方法

我正在使用一个存储过程,其中我依次执行所有三个查询,并且每个结果都使用

SET
:

存储在不同的变量中
SET @result1 = (/* Query 1 with common joins and conditions */);
SET @result2 = (/* Query 2 with common joins and conditions */);
SET @result3 = (/* Query 3 with common joins and conditions */);

但是,由于数据量较大,执行这些查询需要花费大量时间,有时甚至会杀死会话,导致没有输出。

我需要什么帮助

  1. 优化:如何优化这个存储过程以减少执行时间并防止会话被杀死?
  2. 有效使用联接:有没有办法避免为每个查询重复常见的
    JOIN
    WHERE
    条件,同时仍将结果存储在单独的变量中?
  3. 最佳实践:在 SQL Server 中是否有处理具有类似联接和条件的多个查询的最佳实践?

我尝试使用 CTE 来减少重复,但 CTE 只允许跟随一个 SELECT 语句,这不适用于我将多个结果存储到不同变量中的要求。

任何有关如何优化这些查询或存储过程本身的建议将不胜感激!

sql sql-server join stored-procedures query-optimization
1个回答
0
投票

好的,您提出的问题太宽泛,因为您在一个问题中提出了太多问题。然而,当您要求使用具有不同

WHERE
子句的类似结果集时,这里有一种最小化处理的方法:

-- Query 1
WITH cte AS (
    SELECT Id, 1 AS Criteria1, 0 AS  Criteria2, 0 AS  Criteria3  
    FROM Customers
    WHERE CustomerID > 80;

    UNION ALL

    -- Query 2
    SELECT id, 0, 1, 0
    FROM Customers
    WHERE CustomerID = 1;

    UNION ALL

    -- Query 3
    SELECT id, 0, 0, 1
    FROM Customers
    WHERE Country = 'Mexico'
)
SELECT Id, MAX(Criteria1) Criteria1, MAX(Criteria2) Criteria2, MAX(Criteria3) Criteria3
INTO #temp_table1
FROM cte
GROUP BY Id;

SELECT Id, Criteria1, Criteria2, Criteria3 -- and other required columns
INTO #temp_table2
FROM #temp_table1
-- JOIN table1
-- JOIN table2
-- etc

SELECT *
FROM #temp_table2
WHERE Criteria1 = 1;

SELECT *
FROM #temp_table2
WHERE Criteria1 = 2;

SELECT *
FROM #temp_table2
WHERE Criteria1 = 3;
© www.soinside.com 2019 - 2024. All rights reserved.