Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
В системе есть вьюшка джойном объединяющая кучу таблиц и фактически представляющая собой всю БД собранную воедино. Народ привык делать на нее прямые запросы для отчетов, типа select * from vw_report where .... Сама вьюха представляет собой базовую таблицу base на которую зацеплено огромное количество справочников. В чем собственно говоря проблема. Проблема в том что когда человек пишет запрос select * from vw_report where id=xxx где id фактически является основным полем базовой таблицы base в вьюхе vw_report то парсер сначала объединяет все таблицы в vw_report что долго и только потом берет строку с указанным id. При этом id это кластерный PK на базовой таблице base. Отсюда вопрос, что можно сделать дабы парсер сначала производил бы поиск по id в таблице base, а уже потом делал портянки джойнов для vw_report, а не наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 12:45 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
энди, авторпарсер сначала объединяет все таблицы в vw_report что долго и только потом берет строку с указанным id Откуда такой вывод? И что кто этот "парсер"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 12:47 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
делаю запроc select * from vw_report where id=xxx по плану вижу что идут сначала джойны таблиц, а уже потом выбор одной строки, итого 7 секунд а если делаю select * from base join.... ... (тут полная копия всех джойнов из vw_report) join ... where base.id=xxx то выполняется моментом и план показывает что сначала выбирается запись из base и все остальное уже цепляется на эту одну запись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 12:58 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
энди, Есть ли у вас план, мистер Фикс? Есть ли у меня план? Есть ли у меня план? Да у меня целых три плана! (с) Мистер Фикс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 12:59 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
эндиделаю запроc select * from vw_report where id=xxx по плану вижу что идут сначала джойны таблиц, а уже потом выбор одной строки, итого 7 секунд а если делаю select * from base join.... ... (тут полная копия всех джойнов из vw_report) join ... where base.id=xxx то выполняется моментом и план показывает что сначала выбирается запись из base и все остальное уже цепляется на эту одну запись планы показывайте. Или FORCE ORDER ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 13:03 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
эндиВ системе есть вьюшка джойном объединяющая кучу таблиц и фактически представляющая собой всю БД собранную воедино. Народ привык делать на нее прямые запросы для отчетов, типа select * from vw_report where .... Сама вьюха представляет собой базовую таблицу base на которую зацеплено огромное количество справочников. В чем собственно говоря проблема. Проблема в том что когда человек пишет запрос select * from vw_report where id=xxx где id фактически является основным полем базовой таблицы base в вьюхе vw_report то парсер сначала объединяет все таблицы в vw_report что долго и только потом берет строку с указанным id. При этом id это кластерный PK на базовой таблице base. Отсюда вопрос, что можно сделать дабы парсер сначала производил бы поиск по id в таблице base, а уже потом делал портянки джойнов для vw_report, а не наоборот. Если написано внутри view джойны в виде left hash join или inner hash join - то сервер будет сначала читать таблицу base и все таблицы справочников, а потом уже отбирать одну строку по id. Если внутри view такие же простые join, как и в запросе, написанном "вручную", то возникает подозрение, что условие where base.id=xxx для "ручного запроса" совсем не так выглядит внутри view, там может быть on base.id = sprav1.base_id where base.dop_column = yyy или что-нибудь типа where base.id = convert(varchar(3),xxx). Поэтому без полного текста view какой смысл гадать на кофейной гуще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 14:32 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
Andy_OLAPЕсли написано внутри view джойны в виде left hash join или inner hash join - то сервер будет сначала читать таблицу base и все таблицы справочников, а потом уже отбирать одну строку по id.Как интересно. И у вас наверняка найдется и пример, и объяснения такого поведения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 14:51 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
Andy_OLAPЕсли написано внутри view джойны в виде left hash join или inner hash join - то сервер будет сначала читать таблицу base и все таблицы справочников, а потом уже отбирать одну строку по id. Если внутри view такие же простые join, как и в запросе, написанном "вручную", то возникает подозрение, что условие where base.id=xxx для "ручного запроса" совсем не так выглядит внутри view, там может быть on base.id = sprav1.base_id where base.dop_column = yyy или что-нибудь типа where base.id = convert(varchar(3),xxx). Поэтому без полного текста view какой смысл гадать на кофейной гуще?Это вы пытаетсь сказать, что при наличии локальных хинтов predicate pushdown никогда работать не будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 14:57 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
Гавриленко Сергей АлексеевичAndy_OLAPЕсли написано внутри view джойны в виде left hash join или inner hash join - то сервер будет сначала читать таблицу base и все таблицы справочников, а потом уже отбирать одну строку по id. Если внутри view такие же простые join, как и в запросе, написанном "вручную", то возникает подозрение, что условие where base.id=xxx для "ручного запроса" совсем не так выглядит внутри view, там может быть on base.id = sprav1.base_id where base.dop_column = yyy или что-нибудь типа where base.id = convert(varchar(3),xxx). Поэтому без полного текста view какой смысл гадать на кофейной гуще?Это вы пытаетсь сказать, что при наличии локальных хинтов predicate pushdown никогда работать не будет? Я пытаюсь автору темы донести, что если он написал select и join руками, а потом увидел похожие слова внутри view - это совсе не означает, что where xx.yy = zz означает одно и тоже. И поэтому жду от него здесь полный текст view. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 15:00 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
Andy_OLAPЯ пытаюсь автору темы донести, что если он написал select и join руками, а потом увидел похожие слова внутри view - это совсе не означает, что where xx.yy = zz означает одно и тоже.Да нет. Вы написали очередную чушь, а теперь пытаетесь вывернуться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 15:11 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
Постараюсь собрать пример, просто основная структура да и данные скажем так не совсем для публичного доступа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 15:46 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
энди, План лучше покажите. Актуальный. SentryOne Plan Explorer умеет анонимизировать планы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 16:16 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
эндиПостараюсь собрать пример, просто основная структура да и данные скажем так не совсем для публичного доступа.Если не можете показывать имена, то покажите вьюху, заменив названия таблиц Ещё лучше показать план, но он большой, там сложнее менять имена. PS А вообще невозможность "показывать" означает невозможность пользоваться интернетом при разработке. Тогда нужно формировать команду с очень-очень большим запасом. Впрочем, на это вы повлиять не можете :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 19:12 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
эндиделаю запроc select * from vw_report where id=xxx по плану вижу что идут сначала джойны таблиц, а уже потом выбор одной строки Правильно ли я понял, что если вы мышей на стрелки к джойну в актуальном плане наводите, то вам говорят, что актуальное количество строк = кардинальности всей таблицы для каждой таблицы джойна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 19:35 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
PizzaPizza, Сорри, для таблицы base вашего view запроса интересует количество строк к джойну, конечно же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 19:39 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
invmПлан лучше покажите. Актуальный. SentryOne Plan Explorer умеет анонимизировать планы. +1 https://www.sentryone.com/plan-explorer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 20:00 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
ребят спасибо за советы, отдельное спасибо за Plan Explorer Я сейчас сначала попробую порыть сам с использованием Ваших советов и PE, ну а если уж неполучится то приду снова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2018, 08:49 |
|
||
|
Работа с большой вьюшкой
|
|||
|---|---|---|---|
|
#18+
эндиделаю запроc select * from vw_report where id=xxx по плану вижу что идут сначала джойны таблиц, а уже потом выбор одной строки, итого 7 секунд а если делаю select * from base join.... ... (тут полная копия всех джойнов из vw_report) join ... where base.id=xxx то выполняется моментом и план показывает что сначала выбирается запись из base и все остальное уже цепляется на эту одну записьСделайте не так как вы написали, а возьмите целиком весь SELECT из вью, включая WHERE и все остальное. в этом случае план и скорость должны быть идентичными, а потом убирайте постепенно джойны/условия и поймете в чем затык. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2018, 02:55 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39723058&tid=1688895]: |
0ms |
get settings: |
10ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
78ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
| others: | 260ms |
| total: | 472ms |

| 0 / 0 |
