Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory
Bryk_Alien
Если у Вас есть что-либо добавить, я выслушаю, если нет

Лучше всего о плане выполнения сообщает сам сервер. А не ваш мозг.
Вы как в запросе без DISTINCT, так и с DISTINCT не знаете, что и в каком порядке делает сервер.
Тем не менее делаете выводы


Можно подумать, я пытаюсь обвинить сервер в том что он выдаёт неправильный план...
Даже с моими мизерными знаниями, используя свой мозг, я смог разобраться в проблеме и заставить SQL работать так как мне нужно. С помощью DISTINCT я получил и предикаты (я даже не знаю что означает это слово) и быструю скорость выполнения.
Внёс изменения -> получил результат -> сделал выводы. Имею полное право

А от вас только первая строчка была более менее полезна, далее начались кулинарные рассуждения и полемика
13 авг 13, 16:25    [14703363]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
StarikNavy
Bryk_Alien
Glory,

Я уже потерял нить беседы...
На проблему были даны несколько работающих ответов и она была решена. Если у Вас есть что-либо добавить, я выслушаю, если нет - я перестаю следить за темой, у меня есть более важные дела.


вам пытаются намекнуть, что ваша фраза "тем самым, видимо, заставив их отрабатывать до операции LEFT OUTER JOIN" чуть менее, чем полностью (на 146%) некорректна.
и что для вас было бы неплохо разобраться , как оно на самом деле
пох, проблему-то я решил
Но никто вам не мешает оставить содержательный комментарий, дабы те, кто натолкнуться на эту тему не остались в заблуждении
13 авг 13, 16:30    [14703412]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bryk_Alien
Можно подумать, я пытаюсь обвинить сервер в том что он выдаёт неправильный план...

Нет. Вы придумываете связи между синтаксисом и планом выполнения.

Bryk_Alien
Даже с моими мизерными знаниями, используя свой мозг, я смог разобраться в проблеме и заставить SQL работать так как мне нужно.

И какая же была проблема то ?
Медленно выполняется запрос - это следствие, а не проблема.

Bryk_Alien
Внёс изменения -> получил результат -> сделал выводы. Имею полное право

Оспаривают не ваше права на выводы. А правильность выводов.
13 авг 13, 16:32    [14703426]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Empirical
Member

Откуда:
Сообщений: 99
Bryk_Alien
StarikNavy
пропущено...


вам пытаются намекнуть, что ваша фраза "тем самым, видимо, заставив их отрабатывать до операции LEFT OUTER JOIN" чуть менее, чем полностью (на 146%) некорректна.
и что для вас было бы неплохо разобраться , как оно на самом деле
пох, проблему-то я решил
Но никто вам не мешает оставить содержательный комментарий, дабы те, кто натолкнуться на эту тему не остались в заблуждении


Он имеет ввиду (видимо) порядок обработки запроса SQL сервером (logical query processing phases, order of statement execution):
1. FROM
2. ON
3. OUTER
4. WHERE
5. GROUP BY
6. CUBE | ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10 ORDER BY
11. TOP

Ну, то есть надо сначала с From'ом все отработать, потом уже когда идеи исчерпались далее по нисходящему списку. Distinct в самом низу почти.
13 авг 13, 16:35    [14703452]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory,

Ну не прав - так не прав. Не буду спорить с профессионалами.
13 авг 13, 16:36    [14703465]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Empirical
Bryk_Alien
пропущено...
пох, проблему-то я решил
Но никто вам не мешает оставить содержательный комментарий, дабы те, кто натолкнуться на эту тему не остались в заблуждении


Он имеет ввиду (видимо) порядок обработки запроса SQL сервером (logical query processing phases, order of statement execution):
1. FROM
2. ON
3. OUTER
4. WHERE
5. GROUP BY
6. CUBE | ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10 ORDER BY
11. TOP

Ну, то есть надо сначала с From'ом все отработать, потом уже когда идеи исчерпались далее по нисходящему списку. Distinct в самом низу почти.

Спасибо!
К сожалению, я не знаю как можно разобраться с секцией FROM (в спойлере)
В силу своих познаний мне она кажется максимально соптимизированной... Скорее всего я упускаю какое-либо правило или принцип
13 авг 13, 16:40    [14703500]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Bryk_Alien,

Да вам показали как справиться 1 лефт +касе..выж оставили свой вариант и прилепили дистинкт
13 авг 13, 16:43    [14703533]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Maxx
Bryk_Alien,

Да вам показали как справиться 1 лефт +касе..выж оставили свой вариант и прилепили дистинкт

Нет, я сделал один лефт и 4 кейза
Мне просто было интересно разобраться в проблеме, так как такое поведение сервера мне показалось (да и сейчас кажется) странным.
Не могу сказать что это было зря, я узнал много интерсных вещей которые, возможно, мне помогут в будующем.
13 авг 13, 16:45    [14703557]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Empirical
Bryk_Alien
пропущено...
пох, проблему-то я решил
Но никто вам не мешает оставить содержательный комментарий, дабы те, кто натолкнуться на эту тему не остались в заблуждении


Он имеет ввиду (видимо) порядок обработки запроса SQL сервером (logical query processing phases, order of statement execution):
1. FROM
2. ON
3. OUTER
4. WHERE
5. GROUP BY
6. CUBE | ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10 ORDER BY
11. TOP

Ну, то есть надо сначала с From'ом все отработать, потом уже когда идеи исчерпались далее по нисходящему списку. Distinct в самом низу почти.
Но если ещё точнее, физический порядок выполнения
определяет всё равно сервер по своему усмотрению.
13 авг 13, 16:48    [14703573]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
Bryk_Alien,
вы уж определитесь:

Bryk_Alien
пох, проблему-то я решил


или

Bryk_Alien
Мне просто было интересно разобраться в проблеме
13 авг 13, 16:49    [14703576]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bryk_Alien
Мне просто было интересно разобраться в проблеме,

Так в чем была проблема то ?
13 авг 13, 16:50    [14703586]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
StarikNavy
Bryk_Alien,
вы уж определитесь:
Bryk_Alien
пох, проблему-то я решил

или
Bryk_Alien
Мне просто было интересно разобраться в проблеме

Ну так а что не так:
Проблема: долго выполняется запрос
Причина: коряво отбирает записи
Суть причины: вместо того чтобы джойнить уже отобранные строки, джойнит всю таблицу и потом отбирает
Действие: методом научтого тыка впихнуть динстинкт (параметр "интуиция" - успех)
Результат: запрос выполняется быстро - проблема решена!

Та-да-а!


--
Может есть другое решение, по-фэншую? Его просто никто не озвучил...
13 авг 13, 16:57    [14703633]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory
Bryk_Alien
Мне просто было интересно разобраться в проблеме,

Так в чем была проблема то ?
А она была подробно описана в стартовом посте :)
13 авг 13, 16:59    [14703657]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bryk_Alien
А она была подробно описана в стартовом посте :)

Еще раз
Медленно работает запрос - это не проблема. Это следствие.
13 авг 13, 17:02    [14703694]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory
Bryk_Alien
А она была подробно описана в стартовом посте :)

Еще раз
Медленно работает запрос - это не проблема. Это следствие.
Для меня - это была проблема. Пользователь не хотел ждать 40 секунд результатов не очень-то и сложного запроса.

Ув. Glory!
Я понимаю, что мои действия могут выглядеть смешными с высоты профессионалов, которые по 10+ лет работают в SQL.
Но рассуждая на своём уровне - я нашёл замечательное решение! И оно работает! Я рад и доволен. Если проводить аналогию - то у меня была проблема: "машина медленно едет" решение: "выжать педаль газа". Что происходит внутри машины или SQL-сервера мне, конечно, интересно, но не критично :)

Спасибо всем за разьяснения!
13 авг 13, 17:14    [14703785]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bryk_Alien
Я понимаю, что мои действия могут выглядеть смешными с высоты профессионалов, которые по 10+ лет работают в SQL.
Но рассуждая на своём уровне - я нашёл замечательное решение! И оно работает! Я рад и доволен. Если проводить аналогию - то у меня была проблема: "машина медленно едет" решение: "выжать педаль газа". Что происходит внутри машины или SQL-сервера мне, конечно, интересно, но не критично :)

Бумеранг - 14702266
13 авг 13, 17:24    [14703838]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory
Bryk_Alien
Я понимаю, что мои действия могут выглядеть смешными с высоты профессионалов, которые по 10+ лет работают в SQL.
Но рассуждая на своём уровне - я нашёл замечательное решение! И оно работает! Я рад и доволен. Если проводить аналогию - то у меня была проблема: "машина медленно едет" решение: "выжать педаль газа". Что происходит внутри машины или SQL-сервера мне, конечно, интересно, но не критично :)

Бумеранг - 14702266
Ну вы ж любите аналогии...
13 авг 13, 17:27    [14703863]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bryk_Alien
Glory
пропущено...

Бумеранг - 14702266
Ну вы ж любите аналогии...

Мда
Дано - неприемлимое время выполения запроса

Анализ
план выполнение показывает спул индекса
спул индекса нужен для повторного его использования
повторное использование нужно из-за дублирования кода

Решение
убрать дублирующий код
13 авг 13, 17:31    [14703886]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory
Bryk_Alien
пропущено...
Ну вы ж любите аналогии...

Мда
Дано - неприемлимое время выполения запроса

Анализ
план выполнение показывает спул индекса
спул индекса нужен для повторного его использования
повторное использование нужно из-за дублирования кода

Решение
убрать дублирующий код
В случае трёх одинаковых джойнов, однако, никакого спула не происходит...
Как оказалось, и в четырёх он не обязателен если заставить этот глючный сервер сначала отбирать данные а потом вязать.
13 авг 13, 17:49    [14703975]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bryk_Alien
В случае трёх одинаковых джойнов, однако, никакого спула не происходит...
Как оказалось, и в четырёх он не обязателен если заставить этот глючный сервер сначала отбирать данные а потом вязать.

Это вы цитируете планы выполнения или свое видение ?
13 авг 13, 17:51    [14703989]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory
Bryk_Alien
В случае трёх одинаковых джойнов, однако, никакого спула не происходит...
Как оказалось, и в четырёх он не обязателен если заставить этот глючный сервер сначала отбирать данные а потом вязать.

Это вы цитируете планы выполнения или свое видение ?
Свой видение плана выполнения, на котором отсутсвует буферизация, характерная для медленного плана:

Вот кусок после дистинкта:

К сообщению приложен файл. Размер - 41Kb
13 авг 13, 17:58    [14704033]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Empirical
Интересно, а outer apply начальный план улучшит?

По моему нет, т.к. сервер "развернет " аплаи в те же джойны.

Если я правильно понял, вот упрощенная модель "идей" автора. Планы совершенно одинаковы.
CREATE TABLE #Main (ID Int) 

CREATE TABLE #Detail (ID Int , Name Varchar(10)) 

INSERT INTO  #Main (ID) VALUES (1),(2),(1),(2),(1),(2),(3) 

INSERT INTO  #Detail (ID, Name) VALUES (1, 'A'),(2, 'B'), (3, 'C'), (4, 'D')

GO 


SELECT 
  * 
FROM #Main M
LEFT JOIN (SELECT * FROM #Detail WHERE ID = 1) D1 ON D1.ID = M.ID 
LEFT JOIN (SELECT * FROM #Detail WHERE ID = 2) D2 ON D2.ID = M.ID 
LEFT JOIN (SELECT * FROM #Detail WHERE ID = 3) D3 ON D3.ID = M.ID 
LEFT JOIN (SELECT * FROM #Detail WHERE ID = 4) D4 ON D4.ID = M.ID 

GO 

SELECT 
  *
FROM #Main M 
OUTER APPLY (
  SELECT * FROM #Detail D WHERE D.ID = 1 AND D.ID = M.ID
) OA1 
OUTER APPLY (
  SELECT * FROM #Detail D WHERE D.ID = 2 AND D.ID = M.ID
) OA2 
OUTER APPLY (
  SELECT * FROM #Detail D WHERE D.ID = 3 AND D.ID = M.ID
) OA3 
OUTER APPLY (
  SELECT * FROM #Detail D WHERE D.ID = 4 AND D.ID = M.ID
) OA4 


GO

DROP TABLE #Main 
DROp TABLE #Detail 
13 авг 13, 17:59    [14704043]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Может не в тему, но не подскажете что означают черные стрелочки в желтеньком кружке?
На медленном плане их нет...
13 авг 13, 18:02    [14704053]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bryk_Alien
Вот кусок после дистинкта:

Ага. Лечу по фотографии.
13 авг 13, 18:04    [14704063]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
AnyKey45
Member

Откуда: Ekaterinburg-Moscow-EU
Сообщений: 219
Bryk_Alien,

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

Если стрелок нет - обработка на одном ядре(в 1 поток).

как-то так
14 авг 13, 10:01    [14706037]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить