Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Работа с большой вьюшкой / 18 сообщений из 18, страница 1 из 1
25.10.2018, 12:45
    #39722762
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
В системе есть вьюшка джойном объединяющая кучу таблиц и фактически представляющая собой всю БД собранную воедино.
Народ привык делать на нее прямые запросы для отчетов, типа 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, а не наоборот.
...
Рейтинг: 0 / 0
25.10.2018, 12:47
    #39722765
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
энди,

авторпарсер сначала объединяет все таблицы в vw_report что долго и только потом берет строку с указанным id
Откуда такой вывод? И что кто этот "парсер"?
...
Рейтинг: 0 / 0
25.10.2018, 12:58
    #39722773
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
делаю запроc select * from vw_report where id=xxx по плану вижу что идут сначала джойны таблиц, а уже потом выбор одной строки,
итого 7 секунд
а если делаю
select * from base
join....
... (тут полная копия всех джойнов из vw_report)
join ...
where base.id=xxx
то выполняется моментом и план показывает что сначала выбирается запись из base и все остальное уже цепляется на эту одну запись
...
Рейтинг: 0 / 0
25.10.2018, 12:59
    #39722774
iiyama
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
энди,

Есть ли у вас план, мистер Фикс?
Есть ли у меня план? Есть ли у меня план? Да у меня целых три плана!
(с) Мистер Фикс
...
Рейтинг: 0 / 0
25.10.2018, 13:03
    #39722776
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
эндиделаю запроc select * from vw_report where id=xxx по плану вижу что идут сначала джойны таблиц, а уже потом выбор одной строки,
итого 7 секунд
а если делаю
select * from base
join....
... (тут полная копия всех джойнов из vw_report)
join ...
where base.id=xxx
то выполняется моментом и план показывает что сначала выбирается запись из base и все остальное уже цепляется на эту одну запись
планы показывайте. Или FORCE ORDER
...
Рейтинг: 0 / 0
25.10.2018, 14:32
    #39722855
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
эндиВ системе есть вьюшка джойном объединяющая кучу таблиц и фактически представляющая собой всю БД собранную воедино.
Народ привык делать на нее прямые запросы для отчетов, типа 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 какой смысл гадать на кофейной гуще?
...
Рейтинг: 0 / 0
25.10.2018, 14:51
    #39722872
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
Andy_OLAPЕсли написано внутри view джойны в виде left hash join или inner hash join - то сервер будет сначала читать таблицу base и все таблицы справочников, а потом уже отбирать одну строку по id.Как интересно. И у вас наверняка найдется и пример, и объяснения такого поведения?
...
Рейтинг: 0 / 0
25.10.2018, 14:57
    #39722879
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
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 никогда работать не будет?
...
Рейтинг: 0 / 0
25.10.2018, 15:00
    #39722884
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
Гавриленко Сергей Алексеевич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.
...
Рейтинг: 0 / 0
25.10.2018, 15:11
    #39722887
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
Andy_OLAPЯ пытаюсь автору темы донести, что если он написал select и join руками, а потом увидел похожие слова внутри view - это совсе не означает, что where xx.yy = zz означает одно и тоже.Да нет. Вы написали очередную чушь, а теперь пытаетесь вывернуться.
...
Рейтинг: 0 / 0
25.10.2018, 15:46
    #39722907
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
Постараюсь собрать пример, просто основная структура да и данные скажем так не совсем для публичного доступа.
...
Рейтинг: 0 / 0
25.10.2018, 16:16
    #39722934
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
энди,

План лучше покажите. Актуальный.
SentryOne Plan Explorer умеет анонимизировать планы.
...
Рейтинг: 0 / 0
25.10.2018, 19:12
    #39723038
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
эндиПостараюсь собрать пример, просто основная структура да и данные скажем так не совсем для публичного доступа.Если не можете показывать имена, то покажите вьюху, заменив названия таблиц

Ещё лучше показать план, но он большой, там сложнее менять имена.

PS А вообще невозможность "показывать" означает невозможность пользоваться интернетом при разработке. Тогда нужно формировать команду с очень-очень большим запасом.
Впрочем, на это вы повлиять не можете :-(
...
Рейтинг: 0 / 0
25.10.2018, 19:35
    #39723056
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
эндиделаю запроc select * from vw_report where id=xxx по плану вижу что идут сначала джойны таблиц, а уже потом выбор одной строки

Правильно ли я понял, что если вы мышей на стрелки к джойну в актуальном плане наводите, то вам говорят, что актуальное количество строк = кардинальности всей таблицы для каждой таблицы джойна?
...
Рейтинг: 0 / 0
25.10.2018, 19:39
    #39723058
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
PizzaPizza,

Сорри, для таблицы base вашего view запроса интересует количество строк к джойну, конечно же.
...
Рейтинг: 0 / 0
25.10.2018, 20:00
    #39723069
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
invmПлан лучше покажите. Актуальный.
SentryOne Plan Explorer умеет анонимизировать планы.
+1

https://www.sentryone.com/plan-explorer
...
Рейтинг: 0 / 0
26.10.2018, 08:49
    #39723258
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
ребят спасибо за советы, отдельное спасибо за Plan Explorer
Я сейчас сначала попробую порыть сам с использованием Ваших советов и PE, ну а если уж неполучится то приду снова.
...
Рейтинг: 0 / 0
27.10.2018, 02:55
    #39723831
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с большой вьюшкой
эндиделаю запроc select * from vw_report where id=xxx по плану вижу что идут сначала джойны таблиц, а уже потом выбор одной строки,
итого 7 секунд
а если делаю
select * from base
join....
... (тут полная копия всех джойнов из vw_report)
join ...
where base.id=xxx
то выполняется моментом и план показывает что сначала выбирается запись из base и все остальное уже цепляется на эту одну записьСделайте не так как вы написали, а возьмите целиком весь SELECT из вью, включая WHERE и все остальное. в этом случае план и скорость должны быть идентичными, а потом убирайте постепенно джойны/условия и поймете в чем затык.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Работа с большой вьюшкой / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]