Различаются после объединения или подзапроса с различными, а затем присоединиться - PullRequest
0 голосов
/ 04 декабря 2018

Во время написания процедуры я столкнулся с ситуацией, когда мне нужно было ввести 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 голосов
/ 04 декабря 2018

Если вы заботитесь о производительности, избегайте 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...