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

Откуда:
Сообщений: 173
Добрый день!
Запрос умирает, пробовал через join, apply все тщетно.

Таблица А: (name_ varchar(50), dd_int int) около 500 000 записей.

Таблица В: (name_ varchar(50), dd_int int, amount numeric(20,2) ) Чуть меньше 3 миллиардов
В таблице В индекс:

CREATE CLUSTERED INDEX [ix_indexes_dd_name] ON B
(
[dd_int ] ASC,
[name_ ] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [DATA1]
GO



Вот вообщем к таблице А подтянуть поле amount из таблицы В просто беда. Часами висит запрос и ничего.


SELECT A.name_,A.dd_int, B.amount
FROM A A INNER JOIN B B ON A.name_ = B.name_ and A.dd_int = B.dd_int

Какие есть варианты? пс - как то изменить индексы в "В" возможности нет.
31 янв 18, 15:19    [21154634]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
assmsk
Member

Откуда:
Сообщений: 173
Вопрос решился, сервак лежал просто...)) За 15 минут выгрузил, но может есть все же варианты ускорить?
31 янв 18, 15:22    [21154644]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36926
План запроса покажите.
31 янв 18, 15:23    [21154657]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
assmsk,

а в A такой же индекс?
31 янв 18, 15:25    [21154664]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
assmsk
Member

Откуда:
Сообщений: 173
TaPaK
assmsk,

а в A такой же индекс?


Да
31 янв 18, 15:26    [21154668]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
assmsk,

ну тут план кончено... а так должно было merge поставить
31 янв 18, 15:27    [21154672]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
assmsk
Member

Откуда:
Сообщений: 173


К сообщению приложен файл. Размер - 56Kb
31 янв 18, 15:32    [21154699]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
assmsk,

а не кртинкой
31 янв 18, 15:33    [21154706]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
invm
Member

Откуда: Москва
Сообщений: 9285
assmsk
TaPaK
assmsk,

а в A такой же индекс?


Да
Судя по плану, таки нет.

Если на таблицах кластерные индексы с одинаковым первым столбцом dd_int, то, по крайней мере в теории, ускорить можно так:
select
 A.name_, A.dd_int, B.amount
from
 A join
 (
  (select min(dd_int), max(dd_int) from A) t(dd_min, dd_max) join
  B on B.dd_int between t.dd_min and t.dd_max
 ) on B.dd_int = A.dd_int and B.name_ = A.name_;
31 янв 18, 16:38    [21155028]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
там ещё и скаляр какой-то, из за него hash я так понимаю, так что не всё там однозначно с описанием
31 янв 18, 16:44    [21155052]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
Добрый Э - Эх
Guest
invm,

а почему ты решил, что 500000 записей из А не охватывают все записи из B ?
где автор сказал, что связь "один-к-одному"?
там, скорее всего, "один-ко-многим" по принципу мастер-детэйл.
никаких дополнительный условий фильтрации данных из таблицы А нет, поэтому условием по мин-макс ты никак не ограничишь объем данных, возвращаемых из таблицы B - всё одно, потянется весь её объем...
31 янв 18, 18:34    [21155427]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
invm
Member

Откуда: Москва
Сообщений: 9285
Добрый Э - Эх
а почему ты решил, что 500000 записей из А не охватывают все записи из B ?
где автор сказал, что связь "один-к-одному"?
там, скорее всего, "один-ко-многим" по принципу мастер-детэйл
Потому что если охватывают и это действительно мастер-детейл, то в запросе ТС таблица А не нужна.
31 янв 18, 18:47    [21155463]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7671
При такой селективности там по-любому будет просмотр и хэш. Копите деньги на ядра и память.
1 фев 18, 11:50    [21157064]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
assmsk
Добрый день!
Запрос умирает, пробовал через join, apply все тщетно.

Таблица А: (name_ varchar(50), dd_int int) около 500 000 записей.

Таблица В: (name_ varchar(50), dd_int int, amount numeric(20,2) ) Чуть меньше 3 миллиардов
В таблице В индекс:

CREATE CLUSTERED INDEX [ix_indexes_dd_name] ON B
(
[dd_int ] ASC,
[name_ ] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [DATA1]
GO



Вот вообщем к таблице А подтянуть поле amount из таблицы В просто беда. Часами висит запрос и ничего.


SELECT A.name_,A.dd_int, B.amount
FROM A A INNER JOIN B B ON A.name_ = B.name_ and A.dd_int = B.dd_int

Какие есть варианты? пс - как то изменить индексы в "В" возможности нет.


Ну вроде очевидно не?

create index ix1 on A (dd_int) include (name_)
1 фев 18, 14:37    [21157779]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33528
Блог
assmsk,

Доработать схему так, чтобы никаких текстовых полей в соединенях не участвовало
1 фев 18, 16:13    [21158215]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
nvv
Member

Откуда:
Сообщений: 54
Случайное выполнение просто селекта к таблице из 1,5 млрд на серваке с 48 ядрами (HT) и 200Гб озу (фикс для СУБД) сделало его недоступным для подключений на 5 минут ((( "а кто то сделал?" (С)
А вы хотите чтобы 3 млрд, да еще соединение, к тому же хэшматч, не еще не факт что строк останется 3 мдрд (вы про это не писали)
3 фев 18, 20:13    [21163308]     Ответить | Цитировать Сообщить модератору
 Re: Join маленькой таблицы с огромной  [new]
nvv
Member

Откуда:
Сообщений: 54
Критик, мержить будет когда вычислений над индексируемыми полями не будет. Текстовые поля тут погоду не портят. Да и мерж тоже.
Тут все упирается в отсутствие отборов и объем данных.
3 фев 18, 20:20    [21163312]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить