Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Скорость LEFT OUTER JOIN  [new]
Saidumar Khodjaev
Member

Откуда:
Сообщений: 6
Добрый день!

Есть две таблицы:

Goods:
Good_ID
Good_Name

Transactions:
Trans_ID
Trans_Date
Trans_Good_ID
Trans_Amount


Первая маленькая, вторая больше (порядка 50000 записей) и постоянно растет

Простейший запрос на обединение
SELECT 
  dbo.Goods.Good_Name,
  SUM(dbo.Transactions.Trans_Amount) AS Good_Rest
FROM
  dbo.Transactions
  LEFT OUTER JOIN dbo.Goods ON (dbo.Transactions.Trans_Good_ID = dbo.Goods.Good_ID)
WHERE
  dbo.Transactions.Trans_Date <= '2020/01/01' AND 
  dbo.Transactions.Trans_Good_ID > 1
GROUP BY
  dbo.Goods.Good_Name


выполняется мгновенно но не включает товары по которым не било поступлений,
если получить их с помощью обратного объединения
RIGHT OUTER JOIN
то запрос выполняется намного дольше.

не подскажете как этого избежать?
11 апр 18, 18:34    [21330869]     Ответить | Цитировать Сообщить модератору
 Re: Скорость LEFT OUTER JOIN  [new]
fumitox
Member

Откуда:
Сообщений: 36
Saidumar Khodjaev,

  
SELECT 
  dbo.Goods.Good_Name,
  SUM(dbo.Transactions.Trans_Amount) AS Good_Rest
FROM
dbo.Goods  
  LEFT OUTER JOIN dbo.Transactions ON (dbo.Transactions.Trans_Good_ID = dbo.Goods.Good_ID) and dbo.Transactions.Trans_Date <= '2020/01/01' AND   dbo.Transactions.Trans_Good_ID > 1
GROUP BY
  dbo.Goods.Good_Name
11 апр 18, 18:57    [21330938]     Ответить | Цитировать Сообщить модератору
 Re: Скорость LEFT OUTER JOIN  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 308
Saidumar Khodjaev,

dbo.Transactions.Trans_Good_ID > 1
как бы подразумевает, что у вас в таблице Goods есть соотв. запись, не так ли?
К чему тогда Left outer ?
11 апр 18, 19:01    [21330951]     Ответить | Цитировать Сообщить модератору
 Re: Скорость LEFT OUTER JOIN  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
делай inner join - оптимизитор его сможет развернуть и lookup-ить по индексу товары сканя транзакции (или хэш джоин с пробами в меньшей) и будет так же быстро как и транзакции лефт товары
12 апр 18, 12:34    [21332860]     Ответить | Цитировать Сообщить модератору
 Re: Скорость LEFT OUTER JOIN  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Ivan Durak
делай inner join - оптимизитор его сможет развернуть и lookup-ить по индексу товары сканя транзакции (или хэш джоин с пробами в меньшей) и будет так же быстро как и транзакции лефт товары

не важно на результат, просто делай INNER JOIN
12 апр 18, 12:39    [21332878]     Ответить | Цитировать Сообщить модератору
 Re: Скорость LEFT OUTER JOIN  [new]
aleks222
Member

Откуда:
Сообщений: 952
TaPaK
Ivan Durak
делай inner join - оптимизитор его сможет развернуть и lookup-ить по индексу товары сканя транзакции (или хэш джоин с пробами в меньшей) и будет так же быстро как и транзакции лефт товары

не важно на результат, просто делай INNER JOIN


Не надо соединение совать под группировку.
with t as ( select * from dbo.Transactions WHERE Trans_Date <= '20200101' AND Trans_Good_ID > 1 ) 
    , g as ( select * from dbo.Goods )
    , x as ( select Trans_Good_ID,  SUM(Trans_Amount) AS Good_Rest from t group by Trans_Good_ID )
  select *
     from g left outer join x on  x.Trans_Good_ID = g.Good_ID
;


Если будет и так медленно - x надо засунуть во времянку.
12 апр 18, 16:44    [21334091]     Ответить | Цитировать Сообщить модератору
 Re: Скорость LEFT OUTER JOIN  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
думаешь хэш груп при гуппировке делается быстрее чем при хэш джоине?????
с чего бы???
12 апр 18, 16:58    [21334153]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить