删除SQL中的内部查询

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

我们有一个SQL查询,不是按照sql指南编写的。我们必须更改查询,但如果我们更改逻辑并删除内部查询,则需要花费很多时间来执行。以下是查询:

 select col1,
         col2,
         case
             when col1 <> '' then(select top 1
                                   col1
                                   from table1 as BP
                                   where bp.col1 = FD.col1 order by BP.col1)
             when col2 <> '' then(select top 1
                                     BP.col2
                                    from table1 as BP
                                    where BP.col2 = FD.col2 order by BP.col2)
             else ''
         end
  from table2 FD

上面的查询用于将数据插入临时表。 table1拥有近1亿个数据。有没有办法删除内联查询以及良好的性能。我们已经在table1上创建了索引。任何想法?

sql sql-server sqlperformance
2个回答
0
投票

试试这个

;WITH CTE
AS
(
SELECT
    RN = ROW_NUMBER() OVER(ORDER BY COALESCE(T2.col1,T2.col2)),
    T2.col1,
    T2.col2,
    T1Val = COALESCE(T2.col1,T2.col2,'')
    FROM table2 T2
       LEFT JOIN table1 T1
          ON
          (
             (
                ISNULL(T2.col1,'')<>'' AND T1.col1 = T2.col1
             )
             OR
             (
                ISNULL(T2.col2,'')<>'' AND T1.col2 = T2.col2
             )
          )
)
SELECT
    *
    FROM CTE
       WHERE RN = 1

0
投票

这是我的谦虚帮助:

  1. 您已经可以准备和实现子查询1和子查询2(组BY col1或col2)< - 它将减小表的大小1)
  2. 拆分主查询(从table2拆分为3个不同的查询) 1与SELECT .. FROM table2 WHERE col1 <> '' 1与SELECT .. FROM table2 WHERE col1 = '' AND col2 <> '' 1与SELECT .. FROM table2 WHERE col1 = '' AND col2 = ''使用INNER JOIN与您在第一点创建的表格。 (如果您使用SSIS,则可以//并使用内部联接表进行查找)
  3. 如果您的col1或col2使用NVARCHAR(MAX)或大尺寸,您应该查看HashFunction(例如MD5)并比较Hash。
  4. 一定要拥有所有索引

至少如果它不具备性能,你可以试试:OUTER APPLY (SELECT TOP 1 .. )

另一个想法应该是:

SELECT col1, col2, col1 AS yourNewCol 
  FROM table2 T2
 WHERE EXISTS( SELECT 1 FROM table1 T1 WHERE T1.col1 = T2.col1)

UNION ALL

SELECT col1, col2, col2 AS yourNewCol 
  FROM table2 T2
 WHERE 
      NOT EXISTS( SELECT 1 FROM table1 T1 WHERE T1.col1 = T2.col1)
  AND EXISTS( SELECT 1 FROM table1 T1 WHERE T1.col2 = T2.col2)

UNION ALL

...

我没有一个干净的解决方案,但有些想法。如果它对您有帮助,请告诉我。

此致,Arnaud

© www.soinside.com 2019 - 2024. All rights reserved.