删除SQL中的内部查询

时间:2018-02-28 05:47:20

标签: sql sql-server sqlperformance

我们有一个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上创建了索引。有什么想法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这是我的谦虚帮助:

  1. 您已经可以准备和实现您的子查询1和子查询2(组BY col1或col2)&lt; - 它将减小表的大小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. 请务必拥有所有索引
  5. 至少如果它不具备性能,您可以尝试: 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
    
    ...
    

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

    此致 阿诺