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

DECLARE @DateBeg datetime	SET @DateBeg = '01.07.2013'
DECLARE @DateEnd datetime	SET @DateEnd = '28.07.2013'

SELECT
	TSuper.LastName AS Supervisor,
	TEmp.LastName AS Employee,
	dbo.tblCustomers.RecordID,
	COUNT(TUsrDates1.UsrDate) AS UsrCount1,
	COUNT(TUsrDates2.UsrDate) AS UsrCount2,
	COUNT(TUsrDates3.UsrDate) AS UsrCount3,
	COUNT(TUsrDates4.UsrDate) AS UsrCount4
FROM 
	dbo.tblCustomers
	INNER JOIN
	TEmp ON TEmp.EmployeeID = dbo.tblCustomers.EmployeeID
	INNER JOIN
	TSuper ON TSuper.EmployeeID = TEmp.SupervisorID
	INNER JOIN
	(	SELECT ...
	) AS TUsrID ON TUsrID.RecordID = dbo.tblCustomers.RecordID
	LEFT OUTER JOIN
	(	SELECT	*
		FROM	dbo.tblConsUsrDates
		WHERE	UsrType = 0
				AND UsrDate >= @DateBeg
				AND UsrDate < DATEADD(DAY, 7, @DateBeg)
				AND DATEADD(DAY, 7, @DateBeg) <= @DateEnd
	) AS TUsrDates1 ON TUsrDates1.UsrID = TUsrID.UsrID
	LEFT OUTER JOIN
	(	SELECT	*
		FROM	dbo.tblConsUsrDates
		WHERE	UsrType = 0
				AND UsrDate >= DATEADD(DAY, 7, @DateBeg)
				AND UsrDate < DATEADD(DAY, 14, @DateBeg)
				AND DATEADD(DAY, 14, @DateBeg) <= @DateEnd
	) AS TUsrDates2 ON TUsrDates2.UsrID = TUsrID.UsrID
	LEFT OUTER JOIN
	(	SELECT	*
		FROM	dbo.tblConsUsrDates
		WHERE	UsrType = 0
				AND UsrDate >= DATEADD(DAY, 14, @DateBeg)
				AND UsrDate < DATEADD(DAY, 21, @DateBeg)
				AND DATEADD(DAY, 21, @DateBeg) <= @DateEnd
	) AS TUsrDates3 ON TUsrDates3.UsrID = TUsrID.UsrID
	LEFT OUTER JOIN
	(	SELECT	*
		FROM	dbo.tblConsUsrDates
		WHERE	UsrType = 0
				AND UsrDate >= DATEADD(DAY, 21, @DateBeg)
				AND UsrDate <= @DateEnd
	) AS TUsrDates4 ON TUsrDates4.UsrID = TUsrID.UsrID
WHERE
	TEmp.FirstName IS NOT NULL
GROUP BY
	TSuper.LastName,
	TEmp.LastName,
	dbo.tblCustomers.RecordID


Запрос выполняется 40 секунд (!)
Однако, если убрать один из LEFT джойнов и оставить любые три - запрос выполняется за секунду

Смотрел планы... но я в них не силён и понял только что они абсолютно разные и во втоорм случае используется некая опция "Буферизировать индекс" с 3000000 повторами и стоимостью 50%

Подскажите, есть ль возможность ускорить запрос?
13 авг 13, 13:34    [14701966]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104760
Bryk_Alien
Подскажите, есть ль возможность ускорить запрос?

Заменить все LEFT OUTER JOIN на CASE внутри агрегатных функций
13 авг 13, 13:37    [14701989]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
точно...

Спасибо за вариант!

А чем запрос с 3 одинаковыми джойнами отличается от запроса с тремя? Неужели такая большая разница?
13 авг 13, 13:42    [14702039]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104760
Bryk_Alien
А чем запрос с 3 одинаковыми джойнами отличается от запроса с тремя? Неужели такая большая разница?

Для вашего пищеварения есть разница употребить 3 или 4 одинаковых котлеты ?
Котлеты одинаковые, чего это вы 4ю котлету едите дольше 3ей ?
13 авг 13, 13:44    [14702066]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Glory
Заменить все LEFT OUTER JOIN на CASE внутри агрегатных функций

+1005000
13 авг 13, 13:46    [14702085]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory
Bryk_Alien
А чем запрос с 3 одинаковыми джойнами отличается от запроса с тремя? Неужели такая большая разница?

Для вашего пищеварения есть разница употребить 3 или 4 одинаковых котлеты ?
Котлеты одинаковые, чего это вы 4ю котлету едите дольше 3ей ?
Имхо неудачный пример... сравнили жопу с пальцем
13 авг 13, 14:07    [14702266]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5133
Bryk_Alien, попробуйте добавить в конец
option(force order)
тем самым,вы укажете оптимизатору брать таблицы именно в том порядке, в каком вы их записали.
Не говорю что это будет априори быстрее, но попробовать стоит.
13 авг 13, 14:26    [14702417]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Bryk_Alien
А чем запрос с 3 одинаковыми джойнами отличается от запроса с тремя? Неужели такая большая разница?
Чем 3 яблока отличаются от 4 яблок? А 3 дома от 4 домов?

Но это лирика, а точный ответ вам даст кнопка Include Actual Execution Plan.
13 авг 13, 14:30    [14702461]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3626
Александр52
Bryk_Alien, попробуйте добавить в конец
option(force order)
тем самым,вы укажете оптимизатору брать таблицы именно в том порядке, в каком вы их записали.
Не говорю что это будет априори быстрее, но попробовать стоит.

правильный ответ уже был.... не надо сбивать товарища с пути
13 авг 13, 14:50    [14702628]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
Maxx
Glory
Заменить все LEFT OUTER JOIN на CASE внутри агрегатных функций

+1005000

один то left join можно оставить - чо уж вы такие жадные
DECLARE @DateBeg datetime	SET @DateBeg = '01.07.2013'
DECLARE @DateEnd datetime	SET @DateEnd = '28.07.2013'

SELECT
	TSuper.LastName AS Supervisor,
	TEmp.LastName AS Employee,
	dbo.tblCustomers.RecordID,
	SUM(CASE WHEN UsrDate >=@DateBeg AND UsrDate< DATEADD(DAY, 7, @DateBeg) THEN 1 ELSE 0 END) AS UsrCount1,
	SUM(CASE WHEN UsrDate >=DATEADD(DAY, 7, @DateBeg) AND UsrDate< DATEADD(DAY, 14, @DateBeg) THEN 1 ELSE 0 END) AS UsrCount2,
	SUM(CASE WHEN UsrDate >=DATEADD(DAY, 14, @DateBeg) AND UsrDate< DATEADD(DAY, 21, @DateBeg) THEN 1 ELSE 0 END) AS UsrCount3,
	SUM(CASE WHEN UsrDate >=DATEADD(DAY, 21, @DateBeg) THEN 1 ELSE 0 END) AS UsrCount4,
FROM 
	dbo.tblCustomers
	INNER JOIN
	TEmp ON TEmp.EmployeeID = dbo.tblCustomers.EmployeeID
	INNER JOIN
	TSuper ON TSuper.EmployeeID = TEmp.SupervisorID
	INNER JOIN
	(	SELECT ...
	) AS TUsrID ON TUsrID.RecordID = dbo.tblCustomers.RecordID

	LEFT OUTER JOIN dbo.tblConsUsrDates TUsrDates
	ON  TUsrDates.UsrID = TUsrID.UsrID
	AND UsrType = 0
	AND UsrDate BETWEEN  @DateBeg AND @DateEnd  
WHERE
	TEmp.FirstName IS NOT NULL
GROUP BY
	TSuper.LastName,
	TEmp.LastName,
	dbo.tblCustomers.RecordID
13 авг 13, 14:55    [14702677]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
2 Александр52,

Спасибо, но ускорить запрос не удалось...

2 Cammomile

Кнопку жал... Но видимо не хватает знаний чтобы в них разобраться. Буду смотреть вечером интернет.
Планы абсолютно разные.
В "медленном случае" фильтр и "Буферизировать индекс (Eager Spool)"
В "быстром случае" активно юзается нечто под название "параллелизм"
причём в быстром случае на всех иконках в плане 2 стрелочки, отсутствующие в медленном:

К сообщению приложен файл. Размер - 7Kb
13 авг 13, 15:10    [14702800]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
LexusR,

Спасибо, я так и сделал. Работает - быстро!
13 авг 13, 15:12    [14702815]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Впринципе причину, я, наверное, понял...

В "Быстром случае" джойнится запрос (таблица, у которой есть предикат) - то есть там уже отобранные записи в условии WHERE
А в медленном случае джойнится таблица целиком (3 млн записей, 4 раза) и только потом уже выполняется условие в пункте WHERE

Можно ли SQL заставить джойнить уже отобранные записи, как в быстром случае?
13 авг 13, 15:31    [14702989]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Вставил в подзапросы SELECT DISTINCT - тем самым, видимо, заставив их отрабатывать до операции LEFT OUTER JOIN
Отработало за секунду))))
+

DECLARE @DateBeg datetime	SET @DateBeg = '01.07.2013'
DECLARE @DateEnd datetime	SET @DateEnd = '28.07.2013'

SELECT
	TSuper.LastName AS Supervisor,
	TEmp.LastName AS Employee,
	dbo.tblCustomers.RecordID,
	COUNT(TUsrDates1.UsrDate) AS UsrCount1,
	COUNT(TUsrDates2.UsrDate) AS UsrCount2,
	COUNT(TUsrDates3.UsrDate) AS UsrCount3,
	COUNT(TUsrDates4.UsrDate) AS UsrCount4
FROM 
	dbo.tblCustomers
	INNER JOIN
	TEmp ON TEmp.EmployeeID = dbo.tblCustomers.EmployeeID
	INNER JOIN
	TSuper ON TSuper.EmployeeID = TEmp.SupervisorID
	INNER JOIN
	(	SELECT ...
	) AS TUsrID ON TUsrID.RecordID = dbo.tblCustomers.RecordID
	LEFT OUTER JOIN
	(	SELECT DISTINCT	UsrID, UsrDate
		FROM	dbo.tblConsUsrDates
		WHERE	UsrType = 0
				AND UsrDate >= @DateBeg
				AND UsrDate < DATEADD(DAY, 7, @DateBeg)
				AND DATEADD(DAY, 7, @DateBeg) <= @DateEnd
	) AS TUsrDates1 ON TUsrDates1.UsrID = TUsrID.UsrID
	LEFT OUTER JOIN
	(	SELECT DISTINCT	UsrID, UsrDate
		FROM	dbo.tblConsUsrDates
		WHERE	UsrType = 0
				AND UsrDate >= DATEADD(DAY, 7, @DateBeg)
				AND UsrDate < DATEADD(DAY, 14, @DateBeg)
				AND DATEADD(DAY, 14, @DateBeg) <= @DateEnd
	) AS TUsrDates2 ON TUsrDates2.UsrID = TUsrID.UsrID
	LEFT OUTER JOIN
	(	SELECT DISTINCT	UsrID, UsrDate
		FROM	dbo.tblConsUsrDates
		WHERE	UsrType = 0
				AND UsrDate >= DATEADD(DAY, 14, @DateBeg)
				AND UsrDate < DATEADD(DAY, 21, @DateBeg)
				AND DATEADD(DAY, 21, @DateBeg) <= @DateEnd
	) AS TUsrDates3 ON TUsrDates3.UsrID = TUsrID.UsrID
	LEFT OUTER JOIN
	(	SELECT DISTINCT	UsrID, UsrDate
		FROM	dbo.tblConsUsrDates
		WHERE	UsrType = 0
				AND UsrDate >= DATEADD(DAY, 21, @DateBeg)
				AND UsrDate <= @DateEnd
	) AS TUsrDates4 ON TUsrDates4.UsrID = TUsrID.UsrID
WHERE
	TEmp.FirstName IS NOT NULL
GROUP BY
	TSuper.LastName,
	TEmp.LastName,
	dbo.tblCustomers.RecordID


Спасибо всем за советы!
13 авг 13, 15:37    [14703044]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104760
Bryk_Alien
Вставил в подзапросы SELECT DISTINCT - тем самым, видимо, заставив их отрабатывать до операции LEFT OUTER JOIN

Человек-оптимизатор детектед.
13 авг 13, 15:41    [14703064]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5133
Ivan Durak, это бонус к написанному выше ответу.
13 авг 13, 15:50    [14703121]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory
Bryk_Alien
Вставил в подзапросы SELECT DISTINCT - тем самым, видимо, заставив их отрабатывать до операции LEFT OUTER JOIN

Человек-оптимизатор детектед.
Вы так говорите, как будто это что-то плохое...
13 авг 13, 15:51    [14703126]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

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

Человек-оптимизатор детектед.
Вы так говорите, как будто это что-то плохое...

Что "это" ? Заявление о том, как именно поступает оптимизатор ?
13 авг 13, 15:53    [14703137]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory
Bryk_Alien
пропущено...
Вы так говорите, как будто это что-то плохое...

Что "это" ? Заявление о том, как именно поступает оптимизатор ?
Было такое заявление?
13 авг 13, 15:56    [14703162]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

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

Что "это" ? Заявление о том, как именно поступает оптимизатор ?
Было такое заявление?

А для чего цитирование тогда используют ? Я лично - для указания конкретной фразы/предложения
13 авг 13, 15:58    [14703174]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Empirical
Member

Откуда:
Сообщений: 99
Интересно, а outer apply начальный план улучшит?
13 авг 13, 16:01    [14703195]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory,

Я уже потерял нить беседы...
На проблему были даны несколько работающих ответов и она была решена. Если у Вас есть что-либо добавить, я выслушаю, если нет - я перестаю следить за темой, у меня есть более важные дела.
13 авг 13, 16:02    [14703204]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104760
Bryk_Alien
Если у Вас есть что-либо добавить, я выслушаю, если нет

Лучше всего о плане выполнения сообщает сам сервер. А не ваш мозг.
Вы как в запросе без DISTINCT, так и с DISTINCT не знаете, что и в каком порядке делает сервер.
Тем не менее делаете выводы
13 авг 13, 16:06    [14703232]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Empirical
Интересно, а outer apply начальный план улучшит?
Я с таким раньше не сталкивался, сейчас прочитал в справке но не понял, как его можно применить
13 авг 13, 16:06    [14703234]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
Bryk_Alien
Glory,

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


вам пытаются намекнуть, что ваша фраза "тем самым, видимо, заставив их отрабатывать до операции LEFT OUTER JOIN" чуть менее, чем полностью (на 146%) некорректна.
и что для вас было бы неплохо разобраться , как оно на самом деле
13 авг 13, 16:20    [14703340]     Ответить | Цитировать Сообщить модератору
 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

Откуда:
Сообщений: 104760
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

Откуда: Москва
Сообщений: 47007
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

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

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


или

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

Откуда:
Сообщений: 104760
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

Откуда:
Сообщений: 104760
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

Откуда:
Сообщений: 104760
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

Откуда:
Сообщений: 104760
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

Откуда:
Сообщений: 104760
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

Откуда:
Сообщений: 104760
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]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Maxx
Member [скрыт]

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

Graphical Execution Plan Icons
14 авг 13, 10:11    [14706099]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Maxx
Bryk_Alien,

Graphical Execution Plan Icons
Для ТС, наверно, больше подойдёт другой вариант этой ссылки:
http://msdn.microsoft.com/ru-ru/library/ms175913(v=sql.105).aspx
14 авг 13, 10:15    [14706117]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Maxx
Member [скрыт]

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

да там иногда такие ляпы в переводе попадают ,что ховайся
14 авг 13, 10:19    [14706140]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Maxx,
iap,
Ух ты!! Вот это спасибо! Сейчас почитаю))
Дело в том, что даже в яндексе не так-то просто оказалось найти что-нибудь про планы выполнения...
14 авг 13, 11:31    [14706562]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104760
Bryk_Alien
Дело в том, что даже в яндексе не так-то просто оказалось найти что-нибудь про планы выполнения...

http://yandex.ru/yandsearch?lr=11481&text=execution plan mssql - 5я ссылка сверху
И ссылка эта на оффициальный хелп продукта, который вы используете
14 авг 13, 11:35    [14706588]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Maxx
Member [скрыт]

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

ЭЭЭЭЭ...... вообще официальный хелп по продуктам Микрософт http://msdn.microsoft.com , но уж никак не Яндекс
14 авг 13, 11:39    [14706620]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Maxx
Bryk_Alien,

ЭЭЭЭЭ...... вообще официальный хелп по продуктам Микрософт http://msdn.microsoft.com , но уж никак не Яндекс
Ну да...
Но МСДН - это скорее справочник. Он полезен когда знаешь что искать или ищешь нечто конкретное.
А я искал что-то вроде руководства для чайников "Как строить запросы, чтобы они выполнялись быстро, анализируя при этом план выполнения"
14 авг 13, 11:45    [14706665]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Лучше сразу взять за правило искать на английском и в гугле/яху, а не на русском и в яндексе.

Еще полезно к строке поиска на английском добавлять SQLServerCentral или StackOverFlow
14 авг 13, 12:19    [14707009]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104760
Bryk_Alien
"Как строить запросы, чтобы они выполнялись быстро, анализируя при этом план выполнения"

Фраза достойная быть выбитой в граните
Т.е. мало того, что запросы должны выполняться быстро, так они же(т.е. запросы) должны делать это, анлизируя при этом план выполнения
Работать надо над траслированием своих мыслей в слова и предложения.

Bryk_Alien
Но МСДН - это скорее справочник. Он полезен когда знаешь что искать или ищешь нечто конкретное.

Вы там хоть что-нибудь поискали ? Хоть "план выполнения" ? Или "оптимизация" ?
14 авг 13, 12:29    [14707079]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Bryk_Alien
Maxx
Bryk_Alien,

ЭЭЭЭЭ...... вообще официальный хелп по продуктам Микрософт [/url][url=http://msdn.microsoft.com/]http://msdn.microsoft.com , но уж никак не Яндекс
Ну да...
Но МСДН - это скорее справочник. Он полезен когда знаешь что искать или ищешь нечто конкретное.
А я искал что-то вроде руководства для чайников "Как строить запросы, чтобы они выполнялись быстро, анализируя при этом план выполнения"
По ссылке, которую дали, перейдите сюда: Производительность запроса
14 авг 13, 12:40    [14707157]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory
Bryk_Alien
"Как строить запросы, чтобы они выполнялись быстро, анализируя при этом план выполнения"

Фраза достойная быть выбитой в граните
Т.е. мало того, что запросы должны выполняться быстро, так они же(т.е. запросы) должны делать это, анлизируя при этом план выполнения
Подразумевалось что анализироват планы будет человек а не запрос. Предложение можно было понять двояко. Вы выбрали неверный вариант.

Glory
Работать надо над траслированием своих мыслей в слова и предложения.
Ага
Постараюсь запомнить такой вариант фразы "думай что говоришь".

Не, я в МСДН-е не искал. не догадался сразу, потом кое что нашёл подходящее.. и руки так и не дошли
14 авг 13, 12:45    [14707223]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
iap,

Спасибо большое!
Вы мне очень помогли
14 авг 13, 12:49    [14707251]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Glory
Member

Откуда:
Сообщений: 104760
Bryk_Alien
Подразумевалось что анализироват планы будет человек а не запрос. Предложение можно было понять двояко. Вы выбрали неверный вариант.

А в яндексе или другом поисковике сидит человек, который транслирует с безграмотного русского в грамотный технический ?
14 авг 13, 12:51    [14707268]     Ответить | Цитировать Сообщить модератору
 Re: 4 LEFT JOIN'а  [new]
Bryk_Alien
Guest
Glory
Bryk_Alien
Подразумевалось что анализироват планы будет человек а не запрос. Предложение можно было понять двояко. Вы выбрали неверный вариант.

А в яндексе или другом поисковике сидит человек, который транслирует с безграмотного русского в грамотный технический ?
Не, яндекс по такому запросу вообще нифига не нашёл. Далеко ему ещё до ИИ...
14 авг 13, 12:59    [14707345]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / Microsoft SQL Server Ответить