简体   繁体   English

需要帮助提高 SQL 查询的查询性能

[英]Need help in improving query performance of SQL Query

The stored procedure is taking too long to return the results and I want to improve the performance of the stored procedure.存储过程返回结果的时间太长,我想提高存储过程的性能。 But I am not sure where exactly the issue is occurring.但我不确定问题到底发生在哪里。 Can anyone help by rewriting the subquery after EXISTS clause.任何人都可以通过在 EXISTS 子句之后重写子查询来提供帮助。

Just for your information, the tables have hundreds of thousands of records仅供参考,这些表有数十万条记录

DECLARE @InvNo VARCHAR(MAX) = NULL,

SELECT @InvNo='123'

DECLARE @tblInv TABLE (RowID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
                         InvNo VARCHAR(MAX))

IF @InvNo IS NOT NULL
    INSERT INTO @tblInv(InvNo)
    SELECT value
      FROM STRING_SPLIT(@InvNo,',')

 
select * from table1 t
where (@InvNo IS NULL
           OR EXISTS (SELECT 1
                          FROM @tblInv i
                    INNER JOIN table2 inv   
                            ON inv.inv_no = i.InvNo OR ISNULL(inv.alt_inv_no,'@@') = i.InvNo                                
                    INNER JOIN table3 isp
                            ON isp.inv_no = inv.inv_no
                    INNER JOIN table4 ic
                            ON ic.inv_no = inv.inv_no                                               
                         WHERE isp.bl_no = t.bl_no
                           AND ic.cust_code = t.cust_code) 
                )

Without having any additional information, I would suggests splitting the exists into two separate conditions:在没有任何其他信息的情况下,我建议将exists拆分为两个单独的条件:

select *
from table1 t
where @InvNo IS NULL OR
      EXISTS (SELECT 1
              FROM @tblInv i JOIN
                   table2 inv   
                   ON inv.inv_no = i.InvNo JOIN                              
                   table3 isp
                   ON isp.inv_no = inv.inv_no JOIN
                   table4 ic
                   ON ic.inv_no = inv.inv_no                                               
              WHERE isp.bl_no = t.bl_no AND ic.cust_code = t.cust_code 
             ) OR
     EXISTS (SELECT 1
              FROM @tblInv i JOIN
                   table2 inv   
                   ON inv.alt_inv_no = i.InvNo JOIN                              
                   table3 isp
                   ON isp.inv_no = inv.inv_no JOIN
                   table4 ic
                   ON ic.inv_no = inv.inv_no                                               
              WHERE isp.bl_no = t.bl_no AND ic.cust_code = t.cust_code 
             );

OR usually kills the performance of JOIN s. OR通常会破坏JOIN的性能。

Then be sure you have indexes on all the JOIN keys.然后确保您对所有JOIN键都有索引。

Try the below query, Major issue with EXISTS clause and OR clause尝试以下查询,EXISTS 子句和 OR 子句的主要问题

As one of the condition in OR clause is with variable we can divide code into two parts and No need to have both IS NULL and exists logics in the same query.由于 OR 子句中的条件之一是变量,我们可以将代码分为两部分,不需要同时具有 IS NULL 并且在同一个查询中存在逻辑。 It would be good to load the joining columns from exists clause into temp table and inner join with major table might give better performance.将存在子句中的连接列加载到临时表中会很好,并且与主表的内部连接可能会提供更好的性能。

SELECT @InvNo='123'

DECLARE @tblInv TABLE 
(RowID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, InvNo VARCHAR(MAX))
     
IF @InvNo IS NULL
BEGIN
    select * from table1 t
END
ELSE
BEGIN
    INSERT INTO @tblInv(InvNo)
    SELECT value FROM STRING_SPLIT(@InvNo,',')
    
SELECT DISTINCT isp.bl_no,ic.cust_code INTO #T
      FROM @tblInv i
    INNER JOIN table2 inv   
            ON inv.inv_no = i.InvNo                              
    INNER JOIN table3 isp
            ON isp.inv_no = inv.inv_no
    INNER JOIN table4 ic
            ON ic.inv_no = inv.inv_no
UNION
SELECT DISTINCT isp.bl_no,ic.cust_code
      FROM @tblInv i
    INNER JOIN table2 inv   
            ON ISNULL(inv.alt_inv_no,'@@') = i.InvNo                                
    INNER JOIN table3 isp
            ON isp.inv_no = inv.inv_no
    INNER JOIN table4 ic
            ON ic.inv_no = inv.inv_no

    select * from table1 t
    INNER JOIN #T T2 ON T2.bl_no = t.bl_no AND T2.cust_code = t.cust_code
END

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM