Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
01.03.2018, 15:01
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
Не могу сообразить как можно отвадить SQL сканировать родительскую таблицу, при добавлении записей в дочернюю. Особенно, учитывая тот факт, что значение в foreign key поле заносится из константы, т.е. там заведомо одно единственное значение. Вот в таком виде (при добавлении одной записи) в плане видим seek. Но стоит увеличить число записей (раскомментировать top и from), то на моём сервере уже при 39 записях SQL меняет seek на scan. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. Forceseek для insert не разрешает Майкрософт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 15:04
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
Имеется в виду второй запрос в плане (рис.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 15:24
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
ДонАтелло, ну всавьте миллион записей в Table_Master :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 15:59
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
ДонАтелло, Вам доподлинно известно, что NL будет выгоднее MERGE или HASH? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 16:45
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
TaPaKДонАтелло, ну всавьте миллион записей в Table_Master :) :) В данном случае таблица, как раз, маленькая. Автоочищаемая со временем... Но да, можно залить бетону для прочности... Как вариант... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 16:51
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
invmДонАтелло, Вам доподлинно известно, что NL будет выгоднее MERGE или HASH? А при чём тут это? Это join вкорячивает сам SQL на основании наличия foreign key. Вопрос, как раз, и состоит в том, знает ли кто-либо способ повлиять на этот join? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 17:00
|
|||
|---|---|---|---|
|
|||
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
ДонАтелло, в каждой таблица строк по сколько? примерно по 39? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 17:04
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
ДонАтеллоА при чём тут это? Это join вкорячивает сам SQL на основании наличия foreign key. Вопрос, как раз, и состоит в том, знает ли кто-либо способ повлиять на этот join?Если вас не устраивает "вкоряченное" - избавьтесь от FK. Если же считаете, что лучше сервера знаете как соединить таблицы, то добавьте к запросу option (loop join) и будет вам счастье в виде Nested Loops + Index Seek. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 17:52
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
ДонАтеллоTaPaKДонАтелло, ну всавьте миллион записей в Table_Master :) :) В данном случае таблица, как раз, маленькая. Автоочищаемая со временем... Но да, можно залить бетону для прочности... Как вариант... мда... если вставити 1кк то получите seek. Я так понимаю вы боитесь слова "scan" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 18:01
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
ДонАтеллоinvmДонАтелло, Вам доподлинно известно, что NL будет выгоднее MERGE или HASH? А при чём тут это? Это join вкорячивает сам SQL на основании наличия foreign key. Вопрос, как раз, и состоит в том, знает ли кто-либо способ повлиять на этот join?Как же сервер может сделать проверку на существование записи, не вкорячивая join? Сказали проверять, он и проверяет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 18:40
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
invmДонАтеллоА при чём тут это? Это join вкорячивает сам SQL на основании наличия foreign key. Вопрос, как раз, и состоит в том, знает ли кто-либо способ повлиять на этот join?Если вас не устраивает "вкоряченное" - избавьтесь от FK. Если же считаете, что лучше сервера знаете как соединить таблицы, то добавьте к запросу option (loop join) и будет вам счастье в виде Nested Loops + Index Seek. Блин... Отчего-то был уверен что insert проигнорирует option. Виноват. В таком виде - да, пошёл seek на любых кол-вах... От FK избавляться не очень хочется. Но, т.к. вставляются записи ВСЕГДА строго по одному мастеру, то я считаю этот вариант тут вполне приемлемым. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 18:42
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
Основательный человек, сам старательно раскладывает грабли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 18:52
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
TaPaK, Я не боюсь слова scan. Мне немного не нравятся дедлоки, вероятность которых, при наличии сканов резко возрастает. А так-то я более чем толерантен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 19:01
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
ДонАтеллоМне немного не нравятся дедлоки, вероятность которых, при наличии сканов резко возрастает.При наличии сканов таблиц из одной записи? Вряд ли возрастает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 19:07
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
alexeyvg, Кто сказал что одной? Это вставляю я N записей в Detail с гаранитрованно одним Master_ID. Но из этого никак не следует что в мастере нет к этому времени других записей. И в профилировщике я чётко видел блокировки накладываемые этим сканом на посторонние (ну относительно текущего контекста)записи. Как минимум на одну постороннюю запись. Ту, детали которой сейчас вставляет вторая, конкурирующая сессия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 19:48
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
ДонАтеллоМне немного не нравятся дедлоки, вероятность которых, при наличии сканов резко возрастает.Возникновение дедлоков не зависит от метода доступа, а зависит от порядка наложения блокировок на ресурсы, к которым идет конкурентное обращение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 20:05
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
invm, Да, но не только. Сканы в MSDN не указаны, как основная причина (тут не причины, а меры по предотвращению, но не суть, Ваша - первая): •Access objects in the same order. •Avoid user interaction in transactions. •Keep transactions short and in one batch. •Use a lower isolation level. •Use a row versioning-based isolation level. ◦Set READ_COMMITTED_SNAPSHOT database option ON to enable read-committed transactions to use row versioning. ◦Use snapshot isolation. •Use bound connections. Но в массе литературы (у того же Короткевича) раздел посвящённый борьбе с взаимоблокировками начинается с фразы: "...They can happen due to the scans introduced by non-optimized queries." И трудно с ним не согласится... Если транзакция, которая собирается вставлять детали мастера 1, пусть, даже, кратковременно блокирует все записи в таблице мастер, то когда она поссорится с другой сессией, которая вставляет детали мастера 2 и тоже будет блокировать все записи в таблице мастер - это вопрос времени. На приведённом тут примере это показать проще простого, если интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 21:05
|
|||
|---|---|---|---|
|
|||
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
ДонАтелло, автор•Access objects in the same order. •Keep transactions short and in one batch. Вот оно и есть. "Скан" сам по себе еще ничего не означает. Но он лочит очень много всего, в т.ч. лишнего (п3) и в слабопредсказуемом порядке (п1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 21:21
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
Сканы в MSDN, Да, ну и я о том же... Мораль то всё равно одна... Избегать их надо, по возможности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 21:28
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
И что же будет лочить скан на read committed? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 21:37
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
invm, Я же не писал "всегда" или "везде"... Я написал что не надо лопатить больше чем надо, когда это не надо. Если Вас задело использование термина scan для обозначения "лишнего" - искренне прошу прощения. Вопрос решён. Спасибо за помощь. Лично Вам. И лично Вам же "извините" за то что не сразу понял Ваше invmДонАтелло, Вам доподлинно известно, что NL будет выгоднее MERGE или HASH? как направление мысли, а не как вопрос не по теме. Но Вы же не хотите "прямо сейчас открыть дискуссию" © об уровнях блокировок? [spoiler][youtube= ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.03.2018, 22:32
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
ДонАтеллоЯ написал что не надо лопатить больше чем надо, когда это не надо.В вашем примере именно по этой причине оптимизатор ушел от NL к MERGE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.03.2018, 01:45
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
invm, Ну, видимо, Вы имеете в виду, что MERGE, особенно по кластерному ключу, который уже отсортирован - это наискорейший вариант соединения двух наборов данных. Однако, памятуя, что при read committed движок будет последовательно блокировать (и тут же отпускать) каждую запись из мастера, мы получаем, что даже в самом лучшем сценарии, когда все сканы производятся по порядку, мы наталкиваемся на блокировку второй сессии, которая будет ждать первую, несмотря на то, что они наполняют два разных Table_Master.ID деталями. Т.е. мы выстроим запросы в очередь, чего, явно, не требуется. В моём случае ситуация чуть сложнее. Таблиц с детализацией 5 штук. Т.е. запрос выглядит, условно, так: begin tran insert 1 row into Master insert into it's Detail1 insert into it's Detail2 insert into it's Detail3 insert into it's Detail4 insert into it's Detail5 commit tran Несложно увидеть, что тут будет 5 полных сканов мастера. Беря во внимание параллельные сессии, которые делают то же самое, +возможное нарушение порядка сканирования кластерного ключа мастера в следствии каких-нибудь merry-go-round scans, получаем вероятность взаимоблокировки. На ровном, в общем-то, месте. На рисунке видно, что вторая сессия, в некий момент, напарывается на блокировку первой сессии. Хотя вторая сессия добавляет детали к совсем другой записи, нежели первая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.03.2018, 06:43
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
begin tran insert 1 row into Master insert into it's Detail1 insert into it's Detail2 insert into it's Detail3 insert into it's Detail4 insert into it's Detail5 commit tran Шикарно, в одной транзакци. А так да, блакировки на ровном месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.03.2018, 09:44
|
|||
|---|---|---|---|
Clustered index scan родительской таблицы, при добавлении записей в дочернюю |
|||
|
#18+
ДонАтеллоНа рисунке видно, что вторая сессия, в некий момент, напарывается на блокировку первой сессии. Хотя вторая сессия добавляет детали к совсем другой записи, нежели первая.Это блокировка, а не взаимоблокировка. Рассматривая только ваш случай, конкуренция может привести к взаимоблокировке, если будет allocation order scan. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=46&tablet=1&tid=1690171]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
66ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 382ms |

| 0 / 0 |
