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

Откуда: от верблюда
Сообщений: 428
(имена таблиц изменены, запросы набирал заново - не копировал, т.ч. если где очепятка, не пинайте сильно)

есть таблица t1 соединяется с t2 через f1

select
t1.f1,t2.f2
from
t1
join t2
on t2.f1 = t1.f1


статистика показывает следующее:
Table 't1'. Scan count 51, logical reads 462, physical reads 0, read-ahead reads 26.
Table 't2'. Scan count 1, logical reads 458, physical reads 2, read-ahead reads 35.


если присоединить еще одну таблицу t3
select
t1.f1,t2.f2,t3.f1
from
t1
join t2
on t2.f1 = t1.f1
left join t3
on t2.f2 = t3.f1


то получается
Table 't3'. Scan count 20, logical reads 177, physical reads 0, read-ahead reads 21.
Table 't1'. Scan count 76, logical reads 666, physical reads 1, read-ahead reads 30.
Table 't2'. Scan count 1, logical reads 583, physical reads 2, read-ahead reads 43.


присоединяем дальше
select
t1.f1,t2.f2,t3.f1,t4.f1
from
t1
join t2
on t2.f1 = t1.f1
left join t3
on t2.f2 = t3.f1
left join t4
on t3.f2 = t4.f1


Table 't4'. Scan count 20, logical reads 60, physical reads 3, read-ahead reads 0.
Table 't3'. Scan count 20, logical reads 177, physical reads 0, read-ahead reads 21.
Table 't1'. Scan count 76, logical reads 666, physical reads 1, read-ahead reads 30.
Table 't2'. Scan count 1, logical reads 583, physical reads 2, read-ahead reads 43.


и последний
select
t1.f1,t2.f2,t3.f1,t4.f1,t5.f1
from
t1
join t2
on t2.f1 = t1.f1
left join t3
on t2.f2 = t3.f1
left join t4
on t3.f2 = t4.f1
left join t5
on t4.f2 = t5.f1


Table 't4'. Scan count 20, logical reads 60, physical reads 3, read-ahead reads 0.
Table 't3'. Scan count 20, logical reads 177, physical reads 0, read-ahead reads 21.
Table 't5'. Scan count 45, logical reads 268, physical reads 0, read-ahead reads 3.
Table 't1'. Scan count 101, logical reads 870, physical reads 2, read-ahead reads 35.
Table 't2'. Scan count 1, logical reads 708, physical reads 2, read-ahead reads 49.


с каждым разом количество logical reads и read-ahead reads увеличивается, и иногда physical reads тоже

почему так происходит и нормальное ли это явление?
когда присоединил таблицу 4, то добавились чтения только по таблице 4, а по остальным ничего не изменилось, по идее это логично, но что не так при присоединении остальных?

для таблиц t1,t2,t4 план показывает операцию index seek
а для t3,t5 - clustered index seek, все дело в этом?
8 апр 13, 09:53    [14149671]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
Glory
Member

Откуда:
Сообщений: 104751
TJ001
почему так происходит и нормальное ли это явление?

Потому что планы выполнения меняются.

TJ001
когда присоединил таблицу 4, то добавились чтения только по таблице 4, а по остальным ничего не изменилось, по идее это логично, но что не так при присоединении остальных?

У сервера есть 3 стратегии выполнения join-а. Даже одного единственного.
А у вас 4 join-а.
8 апр 13, 09:56    [14149678]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Glory,

можно ли это победить без реструктуризации и добавления индексов?
8 апр 13, 09:58    [14149687]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
Glory
Member

Откуда:
Сообщений: 104751
TJ001
можно ли это победить

Победить что ?
Вы что уже знаете, какое оптимальное число чтений должно быть в каждом запросе ?
И хотите, чтобы сервер пришел к вашим показателям ?
8 апр 13, 10:00    [14149691]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Glory,

нет, оптимального числа я не знаю... просто хотелось бы чтобы присоединение каждой таблицы приводило к такому же изменению статистики как с t4, т.е. чтобы чтения для других таблиц не наращивались... если это возможно (нужно?), если нет, то оставлю эту затею - только скажите :)
8 апр 13, 10:10    [14149722]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31956
TJ001
просто хотелось бы чтобы присоединение каждой таблицы приводило к такому же изменению статистики как с t4, т.е. чтобы чтения для других таблиц не наращивались... если это возможно (нужно?),
Это можно попытаться сделать хинтами, но результат может быть печальным, поскольку количество чтений добавленной таблицы может получиться очень большим.
8 апр 13, 10:15    [14149740]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
Glory
Member

Откуда:
Сообщений: 104751
TJ001
просто хотелось бы чтобы присоединение каждой таблицы приводило к такому же изменению статистики как с t4, т.е. чтобы чтения для других таблиц не наращивались... если это возможно (нужно?), если нет, то оставлю эту затею - только скажите :)

Для этого вы должны знать самый оптимальный план выполнения.
8 апр 13, 10:18    [14149756]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Glory,

не знаю что там себе думает сервер, но по моему представлению все просто

если делать выборку из каждой таблицы отдельным запросом, то меня устраивает статистика, но когда я объединяю их джойнами, вся эйфория быстро проходит :(

alexeyvg,

я поэкспериментирую с хинтами, только скажите как, я с ними не работал ни разу и не совсем понимаю как в данном случае их применить... :(
8 апр 13, 10:36    [14149878]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
Glory
Member

Откуда:
Сообщений: 104751
TJ001
если делать выборку из каждой таблицы отдельным запросом, то меня устраивает статистика, но когда я объединяю их джойнами, вся эйфория быстро проходит

Скорняк, а можно ли сшить из этой шкуры 7 шапок ? (с) народная сказка

А если я сделаю select 1, то статистика чтений будет вообще супер.
Вот только результат не тот
8 апр 13, 10:45    [14149935]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Glory,

видимо я чего-то не понимаю... не буду отнимать больше ваше время

спасибо за ответы :-)
8 апр 13, 10:52    [14149968]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31956
TJ001
я поэкспериментирую с хинтами, только скажите как, я с ними не работал ни разу и не совсем понимаю как в данном случае их применить... :(
Если не работали, то и не используйте. Для использования нужно хорошо знать планы, физические и логические операции и т.п. А "как" - очень просто: указываете в запросе хинт.

Но уверяю, сервер выберет план оптимальнее вас, особенно если есть свежая статистика.
8 апр 13, 10:59    [14150010]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
mag2000
Member

Откуда:
Сообщений: 187
TJ001
видимо я чего-то не понимаю... не буду отнимать больше ваше время

спасибо за ответы :-)


Не отчаивайтесь! Хотя тема эта очень не простая.
Попробуйте тут почитать для получения представления о чём может думать оптимизатор:
http://www.sqlcmd.ru/density-selectivity-cardinality-part01.html
8 апр 13, 11:06    [14150047]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
я не говорю что оптимизатор делает что-то неправильно. и если такая статистика у запроса, значит либо запрос неправильный либо структура данных, структуру менять я не могу, остается подгонять запрос, если конечно удастся что-то улучшить...
бум изучать
спасибо за советы, друзья :)
8 апр 13, 11:12    [14150080]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
Glory
Member

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

Т.е. вы считаете, что каждую таблицу следует читать не больше 1 раза ?
8 апр 13, 11:15    [14150098]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Glory
TJ001
и если такая статистика у запроса, значит либо запрос неправильный либо структура данных

Т.е. вы считаете, что каждую таблицу следует читать не больше 1 раза ?


ну... не то чтобы более одного, но на мой взгляд присоединение таблицы, которая не увеличивает количество результирующих строк, не должна увеличивать количество чтений в других таблицах, сама себя пускай считывает сколько ей нравится, но причем здесь остальные? может я и ерунду говорю, но это только от непонимания процессов... по этой же причине и создал топик, в надежде услышать ответ
т.ч. не кидайте в меня камнями :)
8 апр 13, 11:27    [14150170]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
Glory
Member

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

Потому что сервер не просто читает таблицы, а соединяет их
Для просто чтения вы должны написать запрос
select *
from
t1, t2, t3, t4
8 апр 13, 11:32    [14150199]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Glory
Для просто чтения вы должны написать запрос
select *
from
t1, t2, t3, t4


помнится, за такие конструкции часто бьют по рукам в разных статьях и на этом форуме в том числе...

но в моем случае, даже если написать так, план строится идентичный и статистика тоже, как через join, так и через from t1, t2

здесь поднимался подобный вопрос и причиной была названа операция clustered index scan. похоже на правду...

select top 20
t3.f1
from t3


Table 't3'. Scan count 1, logical reads 4, physical reads 2, read-ahead reads 9.


select top 20 t3.f1,t4.f1
from t3
LEFT JOIN t4
ON t4.f1 = t3.f2


Table 't4'. Scan count 20, logical reads 20, physical reads 1, read-ahead reads 0.
Table 't3'. Scan count 1, logical reads 4, physical reads 2, read-ahead reads 9.


на мой взгляд, должно быть именно так, при правильной организации индексов
8 апр 13, 11:56    [14150373]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
Glory
Member

Откуда:
Сообщений: 104751
TJ001
помнится, за такие конструкции часто бьют по рукам в разных статьях и на этом форуме в том числе...

Ну вам же важнее статистика чтений, как я понял.
8 апр 13, 11:59    [14150392]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Glory,

да, но не любой ценой
должна же быть золотая середина)))
не хочется чтобы потом кто-то плевался взглянув на мой запрос ))))))
8 апр 13, 12:04    [14150418]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31956
TJ001
на мой взгляд присоединение таблицы, которая не увеличивает количество результирующих строк, не должна увеличивать количество чтений в других таблицах, сама себя пускай считывает сколько ей нравится, но причем здесь остальные?
Понимаете, такой алгоритм возможен, но тогда придётся читать присоединённую таблицу столько раз, сколько было выбрано строк в остальном запросе. Или делать поиск столько-же раз.

Это может быть сильно невыгодно.
8 апр 13, 12:08    [14150438]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
Glory
Member

Откуда:
Сообщений: 104751
TJ001
должна же быть золотая середина)))

Ну так найдите ее. Оптимизатор между прочим занимается тем же самым
8 апр 13, 12:09    [14150443]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
alexeyvg,

да, понимаю, еще не очень отчетливо, но это временно :)

Glory
TJ001
должна же быть золотая середина)))

Ну так найдите ее. Оптимизатор между прочим занимается тем же самым


ищу:)

истина где-то рядом ©

всем спасибо за ответы :)
8 апр 13, 13:03    [14150872]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
во всяком случае понятно, что эти увеличения не всегда являются показателем "неправильности"...
ответ на главный вопрос сабжа получен!
8 апр 13, 13:06    [14150898]     Ответить | Цитировать Сообщить модератору
 Re: должны ли увеличиваться показатели logical reads при join'ах?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
TJ001
во всяком случае понятно, что эти увеличения не всегда являются показателем "неправильности"...
ответ на главный вопрос сабжа получен!
так же как не увеличения не всегда являются показателем "правильности"...

а вообще, если хотите понять как оно работает, то смотрите планы, изучайте типы джойнов, а не эту сухую статистику количества чтений.
9 апр 13, 02:11    [14154425]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить