连接后不同或具有不同然后再连接的子查询

时间:2018-12-04 01:41:52

标签: sql sql-server performance tsql query-performance

在编写过程时,遇到一种情况,我必须在查询中放入DISTINCT。这有点类似于我的表架构

CREATE TABLE T1
(
     ID         INT,
     TypeID     INT,
     SubTypeID  INT,
     Name       VARCHAR(50)
);
GO

CREATE TABLE T2
(
     TypeID     INT,
     SubTypeID  INT,
     TypeName   VARCHAR(50)
);
GO

INSERT INTO T2 (TypeID, SubTypeID, TypeName)
VALUES (1, 1, 'AAA'), (1, 2, 'AAA'),
       (2, 1, 'BBB'), (2, 2, 'BBB'),
       (3, 1, 'CCC'), (3, 2, 'CCC');

INSERT INTO T1 (ID, TypeID, SubTypeID, Name)
VALUES (1, 1, 1, 'ABC'), (2, 2, 2, 'BCD'),
       (3, 3, 2, 'CDE'), (4, 1, 1, 'DEF'),
       (5, 2, 2, 'EFG'), (6, 3, 0, 'FGH');    -- Sub Type not detected yet.
GO

在这种情况下,用户可以提供SubType或让系统进行检测。

现在,在这种情况下,我有2个查询选项。

选项1

SELECT DISTINCT t1.ID, t1.Name, t2.TypeName
FROM T1
JOIN T2 ON T1.TypeID = T2.TypeID;

和选项2

SELECT t1.ID, t1.Name, t2.TypeName
FROM T1
JOIN (SELECT DISTINCT  TypeID, TypeName FROM T2) AS T2 ON T1.TypeID = T2.TypeID;

在两种情况下结果都是相同的,但我想知道哪个应该是首选。表T1中可能有数百万行,而表T2中可能有数千行。

我认为,我应该使用第一个选项来避免子查询。

但仍要与社区确认,因为它可能会对性能产生一些或主要影响,尚不为人所知。

1 个答案:

答案 0 :(得分:1)

如果您关心性能,请在外部查询中避免使用select distinct。我会尝试的:

SELECT t1.ID, t1.Name, t2.TypeName
FROM T1 CROSS APPLY
     (SELECT DISTINCT T2.TypeName
      FROM T2
      WHERE T1.TypeID = T2.TypeID
     ) T2;