powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос данных из представления - "лишние" таблицы в плане запроса
18 сообщений из 18, страница 1 из 1
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035707
Matroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица которая содержит документы - генерируемые, либо импортируемые сервером.
Documents(ID int identity(1,1) primary key, <набор полей - описание документа>, Body varbinary(max) ).
Body - тело документа, в среднем по палате 7800 байт, наибольшая часть документов 300-500 байт.

Тормозит запрос к таблице, который который выбирает фильтрованный список документов для просмотра (размер списка ограничен 50 тыс. строк). Для фильтров есть индексы. Body не выбирается, его просмотр и редактирование отдельными средствами.

Понятно, что в принципе в ОП поднимается слишком много страниц, потом lookup и т.д.

Кроме индексирования, решено поделить таблицу на 2:
Код: sql
1.
2.
3.
Documents_Main (ID int identity(1,1) primary key, <набор полей - описание документа>)
Documents_Data(ID int primary key, Body varbinary(max)))
ALTER TABLE Documents_Data ADD CONSTRAINT FOREIGN KEY (ID) references Documents_Main(ID) on delete cascade 



Изменения не должны сказаться на клиентах, поэтому сверху обновляемый VIEW
Код: sql
1.
2.
3.
4.
alter view Dоcuments  
as
select m.* /*здесь перечислены все поля вместо m.* */, d.Body 
from Documents_Main m inner join Documents_Data d on m.ID = d.ID



В итоге запрос на выборку, который выбирает необходимый список, все равно тормозит.
Из плана видно, что наибольшую нагрузку дает clustered index seek к Documents_Data. Но никаких полей из нее не выбирается, связь 1-1, PK и внешний ключ указан.
Подобный подход (надстройка в виде view) вообще уже используется в БД, лишние таблицы не тянутся в запросы (по крайней мере, там, где это наблюдали).
Почему здесь не так?
Пока объяснил на пальцах, без планов, может есть простой ответ.
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035712
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Matroz
Кроме индексирования, решено поделить таблицу на 2

Дешевле выкинуть Body в LOB
Код: sql
1.
EXEC sp_tableoption 'Documents', 'large value types out of row', 1


Но это повысит производительность только если Body в подавляющем большинстве выборок не участвует.

P.S. Недавно меня за подобное предложение тут сильно критиковали. Но мой личный опыт показывает востребованность такого подхода. Выбирать Вам. Вставка, обновление и чтение Body при этом замедлится.
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035724
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Matroz,

уберите d.body и проверьте - будет ли тормозить.
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035741
Matroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Matroz,

уберите d.body и проверьте - будет ли тормозить.


Так мне без d.body это представление и не нужно
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035770
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Matroz,

это очевидно, вы Вы хотите понять - в каком месте "не работает".
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035773
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Matroz

Из плана видно, что наибольшую нагрузку дает clustered index seek к Documents_Data. Но никаких полей из нее не выбирается

вот и покажите план.
только не картинкой.
https://www.brentozar.com/pastetheplan/
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035781
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Matroz

Тормозит запрос к таблице, который который выбирает фильтрованный список документов для просмотра (размер списка ограничен 50 тыс. строк). Для фильтров есть индексы. Body не выбирается, его просмотр и редактирование отдельными средствами.

Понятно, что в принципе в ОП поднимается слишком много страниц, потом lookup и т.д.

Кроме индексирования, решено поделить таблицу на 2:

Пока объяснил на пальцах, без планов, может есть простой ответ.


Знатные борцы с тормозами.
Чтобы сервер "нетормозил" - заставим его делать лишнюю работу - соединение таблиц.

Бред же. Незамутненный.
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035790
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да уж, товарищ, если в запросе вьюха, а не 1 таблица в явном виде,
соединение все равно надо делать, раз вы его заказали.

чтобы не читать таблицу с документами,
ПК по id должен быть некластерный, а у вас поди кластерный,
потому кластерный и фигурирует в плане
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035792
Matroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222

Чтобы сервер "нетормозил" - заставим его делать лишнюю работу - соединение таблиц.

Бред же. Незамутненный.

Отличный совет!
Но серверу нет нужды соединять таблицы, если используются данные только одной из них.
При соблюдении определенных условий (когда разборщик понимает, что это не ограничивающий join)
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035793
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Matroz
(когда разборщик понимает, что это не ограничивающий join)

И как сервер это МОЖЕТ понять, кроме как выполнив соединение?
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035794
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну или если куча не нравится и вью особо хочется,
то по ид делайте и кластерный, и некластерный.
один как ПК, второй просто уникальный.
тогда где не надо боди, подцепит некластерный
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035830
Matroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222И как сервер это МОЖЕТ понять, кроме как выполнив соединение?
вот так. Натолкнуло на размышления, может ли.
Неверно условие связи записал, теперь может, при наличии уникальности с обеих сторон.
Так работает, Documents_Data в плане нет.
Код: sql
1.
2.
3.
4.
alter view Dоcuments  
as
select m.* /*здесь перечислены все поля вместо m.* */, d.Body 
from Documents_Main m LEFT OUTER join Documents_Data d on m.ID = d.ID


Yasha123
aleks222
спасибо за активацию мозга.

Этот вариант тоже посмотрю (но у нас генерируется скрипт на две БД, в т.ч. Postgres - как он хранит BLOB, пока не рабирался)
ptr128EXEC sp_tableoption 'Documents', 'large value types out of row', 1
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035850
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Matroz
Так работает, Documents_Data в плане нет.
Таблица может быть в плане, но обращений к ней не будет.
Проверять нужно в результатх statistics io.
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035875
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Matroz

Так работает, Documents_Data в плане нет.
[src]
alter view Dоcuments
as
select m.* /*здесь перечислены все поля вместо m.* */, d.Body
from Documents_Main m LEFT OUTER join Documents_Data d on m.ID = d.ID


Только ЭТО - необновляемое представление.
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035885
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Matroz
Postgres - как он хранит BLOB, пока не рабирался

Похоже. Механизмом TOAST .
Отключить out-of-line для поля можно указанием SET STORAGE PLAIN или MAIN.
Форсировать - EXTERNAL или EXTENDED.
Граница выталкивания поля в TOAST, в зависимости от его размера, определяется выражением WITH ( toast_tuple_target = n )
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40035949
Matroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222

Только ЭТО - необновляемое представление.

Я не имел в виду, что оно обновляемое по умолчанию, просто не стал писать
На большинстве таблиц триггера висят, для аудита. Здесь будет INSTEAD OF триггер
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40036004
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Matroz,

зачем Вы добавили в запрос колонку body, если она "не выбирается"?
...
Рейтинг: 0 / 0
Запрос данных из представления - "лишние" таблицы в плане запроса
    #40036013
Matroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,
Представление создано для клиентов, которые используют нашу БД.
Они работают с документами индивидуально (либо генерируют их небольшими пачками) в прежнем режиме,
только теперь будут работать не с таблицей, а с одноименным представлением. Естественно им требуется и описание и содержимое документа (Body).
У нас есть приложение, которое реализует в т.ч. групповые операции над документами. Тормозят несколько запросов, которые используются для сравнительно больших выборок, но им как раз и не требуется содержимое документа (на момент просмотра).
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос данных из представления - "лишние" таблицы в плане запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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