【问题标题】:Is there a way to rewrite the SQL query efficiently有没有办法有效地重写 SQL 查询
【发布时间】:2010-04-22 20:48:35
【问题描述】:

我有两个具有以下定义的表

    TableA                                          TableB
ID1   ID2   ID3  Value1 Value                      ID1 Value1
 C1    P1   S1                                     S1
 C1    P1   S2                                     S2
 C1    P1   S3                                     S3
 C1    P1   S5                                     S4
                                                   S5

这些值只是表中的示例。 TableA 有一个聚集的主键 ID1、ID2 和 ID3,而 TableB 有 p.k。 ID1 我需要根据 TableB 创建一个 TableA 中缺少记录的表 我尝试创建的选择查询应提供以下输出

C1  P1  S4

为此,我有以下 SQL 查询

    SELECT
    DISTINCT TableA.ID1, TableA.ID2, TableB.ID1
    FROM TableA a, TableB b 
    WHERE TableB.ID1 NOT IN 
    ( 
      SELECT DISTINCT [ID3] 
      FROM TableA aa
      WHERE a.ID1 == aa.ID1 
        AND a.ID2 == aa.ID2 
    )

虽然这个查询有效,但它的性能很差,我的最终 TableA 可能有多达 1M 条记录。 有没有办法更有效地重写它。

感谢您的帮助, 贾维德

【问题讨论】:

  • Value1Value的目的是什么?
  • 我从您的标签中假设您使用的是 SQL Server 2005?您可以发布包括索引在内的完整表定义吗?
  • 值 1 和值 2 是不是主键列的列。这些值用于其他查询。对于 TableA,聚集的主键是 ID1、ID2 和 ID3,对于 TableB,唯一的主键是 ID1
  • == 在 SQL Server 中不起作用。此外,您应该学习如何实际使用连接,并且永远不要再次使用该隐式连接。它们的编程技术很差,容易出错并且已经过时了 18 年。

标签: sql sql-server-2005 performance


【解决方案1】:

试试这个:

SELECT T1.ID1, T1.ID2, T2.ID1 FROM (
    SELECT ID1, ID2
    FROM TableA
    GROUP BY ID1, ID2
) T1
CROSS JOIN TableB T2
LEFT JOIN TableA T3
ON T1.ID1 = T3.ID1 AND T1.ID2 = T3.ID2 AND T2.ID1 = T3.ID3
WHERE T3.ID1 IS NULL

【讨论】:

    【解决方案2】:

    假设 TableA 是一个连接表,您需要使用交叉连接生成可能值的列表,这可能会杀死您...

    select TableC.ID1 as C, TableP.ID1 as P, TableB.ID1 as B
    from TableC 
        cross join TableP
        cross join TableB
    

    (这是一个很大的假设,这些都是相对较小的表)

    然后你可以像这样加入这个查询

    select ID1, ID2, ID3
    from TableA A
        left outer join 
            (select TableC.ID1 as C, TableP.ID1 as P, TableB.ID1 as B
             from TableC 
                 cross join TableP
                 cross join TableB) X on A.ID1 = X.C and A.ID2 = X.P and A.ID3 = X.B
    where X.ID3 is null
    

    【讨论】:

      【解决方案3】:

      感谢大家分享您的想法。 我从 INNER 选择查询中删除了 DISTINCT 关键字,并且能够获得一些性能。此外,我对查询进行了更多修改并获得了更多性能。我想和大家分享我的解决方案

      Select c.*
      FROM TAbleA a
      RIGHT JOIN
      ( SELECT DISTINCT ID1, ID2, b.ID1 
        FROM TableA, 
        ( SELECT ID1 FROM TableB ) b 
      ) c
      ON a.[ID1] = c.[ID1] AND a.[ID2] = c.[ID2] AND a.[ID3] = c.[ID3]
      WHERE a.[ID3] IS NULL
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        • 2019-12-25
        • 2016-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多