Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 что поделать с кучей соединений  [new]
vopros99
Guest
в первый раз мне достается чей-то запрос с 30 джойнами.
план посмотреть не могу из-за того что некоторые из них не таблицы а вью, и смотрят в другую базу,
в которой прав у меня вообще нет, т.е. мне написали, что отказано в SHOWPLAN на базу, которую вообще первый раз вижу.
надеялась в планах и посмотреть число строк везде, а раз не дают,
чего, писать 30 запросов и считать там строки?
помню доклад ДеКолореса, где он советует переставить вручную от таблиц с меньшим числом строк по возрастанию,
если соединений больше 8, это попробовать сделать или еще как-то можно улучшить ситуацию?
может вычленить тех, кто из соседней базы, их закомментировать, получить план на неполный запрос и там пытаться переставить?
23 фев 12, 11:42    [12141445]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
vopros99
в первый раз мне достается чей-то запрос с 30 джойнами.
план посмотреть не могу из-за того что некоторые из них не таблицы а вью, и смотрят в другую базу,
в которой прав у меня вообще нет, т.е. мне написали, что отказано в SHOWPLAN на базу, которую вообще первый раз вижу.
надеялась в планах и посмотреть число строк везде, а раз не дают,
чего, писать 30 запросов и считать там строки?
Вообще у человека, которому поручают сделать какую то работу, должны быть права на выполнение этой работы. Нужно стараться донести эту мысль.


vopros99
помню доклад ДеКолореса, где он советует переставить вручную от таблиц с меньшим числом строк по возрастанию,
если соединений больше 8, это попробовать сделать
Да, нужно. Сервер не может перебрать все варианты, поскольку их слишком много, а определённый порядок упрощает нахождение оптимального плана.
vopros99
или еще как-то можно улучшить ситуацию?
Зная распределение данных, можно пробовать переписать запрос на использование временных таблиц, подзапросов...
vopros99
чего, писать 30 запросов и считать там строки?
Ну да, не так это сложно, паст-копи...
23 фев 12, 11:57    [12141492]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
vopros99
Guest
alexeyvg
Вообще у человека, которому поручают сделать какую то работу, должны быть права на выполнение этой работы. Нужно стараться донести эту мысль.


вчера заслала прямо с картинкой в отказе всем, кому могла.
зная товарищей, скорее получится эту мысль донести, если через неделю им выставлю переделанный запрос
и скажу, что можно было с планом за сутки сделать.
и что если будет 50 соединений, то месяц переписывать.


alexeyvg
Зная распределение данных, можно пробовать переписать запрос на использование временных таблиц, подзапросов...

там абсолютно линейные соединения, собирают широченную таблицу, первые 5 inner join,
остальные left. нет никаких подзапросов и по какому принципу сохранить что-то во временную таблицу, если там ничего по 2 раза не используется?

К сообщению приложен файл. Размер - 27Kb
23 фев 12, 12:19    [12141603]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
Glory
Member

Откуда:
Сообщений: 104751
vopros99
нет никаких подзапросов и по какому принципу сохранить что-то во временную таблицу, если там ничего по 2 раза не используется?

По принципу уменьшения количества данных для следующих соединений
23 фев 12, 12:25    [12141629]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
vopros99
Guest
буду пробовать, спасибо.
может вообще вью, которое меня без плана оставляет,
выгрузить в таблицу в свою базу и смотреть план?
чего при этом можно потерять, только индексы, если были на исходной таблице?
23 фев 12, 12:49    [12141744]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Может быть, и хинт запроса OPTION(FORCE ORDER) попробовать (раз порядок джойнов задаёте самостоятельно).
23 фев 12, 16:44    [12142724]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
vopros99
alexeyvg
Зная распределение данных, можно пробовать переписать запрос на использование временных таблиц, подзапросов...

там абсолютно линейные соединения, собирают широченную таблицу, первые 5 inner join,
остальные left. нет никаких подзапросов и по какому принципу сохранить что-то во временную таблицу, если там ничего по 2 раза не используется?
Зависит от конкретного запроса.

Например, если первые 5 inner join дают мало полей и мало данных, то можно результат засовывать в временную таблицу.

Но вообще без планов тяжело.

Там элементарно может не быть какого то индекса, поэтому и медленно. Может, из за этого тормозит один из джойнов или какое то условие выборки.
23 фев 12, 17:53    [12143007]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
vopros99, не является ли причиной такого количества
left outer join-ов необходимость сохранения результата
внешнего соединения между последним inner join и
первым left outer join?
23 фев 12, 20:13    [12143487]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
vopros99
Guest
andrey odegov,
нет.
сейчас все хорошо рассмотрела.
там тупо к первой таблице (1.780.629 строк) по ее NUM_PRAT присоединяют все остальные по тому же NUM_PRAT.
т.е. все левые соединения переставляемы и сейчас их елочкой построю.
среди inner join-ов только одна таблица по-другому присоединяется, и в ней 27.996 строк.
выставила их первой парой.

сохранить результат первых inner join-ов во временной таблице?
первые 5 соединений дают примерно половину полей.
из остальных мало берется.
то вью скопировала в свою базу и план могу смотреть,
только толку 0, потому что это вью и есть таблица, к которой все остальное цепляют,
в плане у всех Clustered Scan, Parallelism, Hash Match.
24 фев 12, 13:39    [12146599]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
vopros99
Guest
только наверное елку надо строить не по числу строк в оставшихся таблицах, а по числу отбираемых полей?
раз все равно уже известно, что строк будет сколько в главной таблице
24 фев 12, 13:45    [12146687]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
Acce_Ekb
Member

Откуда: Екатеринбург
Сообщений: 87
vopros99,

Полная картина не совсем понятна.
Есть просто join c 30 таблицами и его нужно оптимизировать? Или в запросе есть еще условия where?

Если есть where, надо смотреть, сколько эти фильтры отсеивают записей. Может таблица с 10^9 записей, но на ней условие, которое выбирает всего 5 записей? Это меняет дело, нам нужно ставить её первой.

Index Scan прямо на всех-всех таблицах? Если да, то надо создавать индексы по полям, по которым идет join.
24 фев 12, 15:12    [12147455]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
vopros99, Вы можете попробовать заставить sql server
использовать сбалансированную компоновку для
внутренних соединений, м.б. в результате этого удастся
уменьшить количество строк для левой части внешних
соединений.
from ((p join a on p.num_part = a.num_part)
      inner join
      (s join m on s.num_part = m.num_part)
      on p.num_part = s.num_part)
left outer join o
on p.num_part = o.num_part
.
.
.

left outer join k
on p.num_part = k.num_part
option (force order)
ps:если я правильно увидел алиасы таблиц
24 фев 12, 15:41    [12147743]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
vopros99
Guest
в общем от перестановки ничего не поменялось,
хоть и 30 джойнов, а наверное оптимизатор 2008 шибко умный.
с хинтом FORCE ORDER еще и дольше отработало.
подумала, вместо временной прямо в таблицу и вставлю первые 5 INNER JOIN.
(там не просто SELECT, а SELECT INTO)
потом сделала ALTER TABLE ADD <оставшиеся поля>,
добавила оставшиеся столбцы и потом
UPDATE <новая таблица > SET <оставшиеся поля> ... FROM <новая таблица > LEFT JOIN ...<все оставшиеся JOIN>
вот тогда оно отработало в 2 раза быстрее (хотя вроде как извращение, половину вставить, а половину апгрейдить)
24 фев 12, 18:54    [12149567]     Ответить | Цитировать Сообщить модератору
 Re: что поделать с кучей соединений  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
vopros99,

Имхо, давно уже пора выложить действительный план в xml. Тогда будет не извращение. А то варианты можно долго перебирать...
24 фев 12, 20:44    [12150133]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить