Представляемая или временная таблица - что выбрать в MS SQL Server?
У меня возникла проблема с выбором между использованием представления и временной таблицей.
У меня есть хранимая процедура, которую я вызываю из программы. В этой процедуре я сохраняю результаты долгого запроса во временной таблице, называю столбцы и выполняю ещё несколько запросов к этой таблице, сохраняя результаты в метках или в GridView и после этого удаляю временную таблицу. Я мог бы также сохранить результат запроса в представлении и выполнять запросы к этому представлению. Что лучше использовать, и в каких случаях мне обязательно нужно применять представление или временную таблицу?
Согласно моим исследованиям, у представления есть такие преимущества, как безопасность, простота и возможность указания имен столбцов. На мой взгляд, моя временная таблица также удовлетворяет всем этим критериям.
5 ответ(ов)
Если ваш запрос «долгий», и вы получаете результаты из нескольких запросов, то временная таблица будет лучшим выбором.
Представление (view) в общем случае является просто сокращением для оператора select
. Это не означает, что результаты когда-либо обрабатываются и сохраняются. Каждый раз, когда вы используете представление, результаты необходимо заново генерировать. Хотя повторные обращения к представлению могут быть более эффективными (например, если страницы, используемые в запросе представления, находятся в кеше), временная таблица фактически хранит результаты.
В SQL Server вы также можете использовать переменные таблиц (например, declare @t table ...
).
Использование временной таблицы (или переменной таблицы) внутри одной сохраненной процедуры, как правило, имеет мало последствий с точки зрения безопасности, простоты и имен столбцов. Безопасность будет обеспечиваться доступом к сохраненной процедуре. Имена столбцов необходимы для обоих решений. Оценить простоту без дополнительной информации сложно, но ничего не выделяется как особенно сложное.
Это зависит от того, какая задача перед вами стоит.
Если вам нужно, чтобы представление (view) каждый раз выполняло обработку вашего "долгого запроса", то его использование будет значить дополнительные вычислительные затраты. В то же время временная таблица (temp table) позволяет сохранять результаты, что минимизирует повторные вычисления.
Так что вам нужно определить: хотите ли вы использовать больше ресурсов процессора или больше места для хранения данных?
Вы также можете использовать некоторые значения из представления (постоянный индекс), что может помочь с производительностью, но для более точного ответа не хватает информации о вашем конкретном сценарии.
Если речь идет только о необходимости хранения данных в рамках одного вызова процедуры, то лучшим выбором будет временная таблица.
Следует также отметить, что для временной таблицы существует ограничение:
Вы не можете ссылаться на временную таблицу более одного раза в одном запросе.
Это делает временные таблицы неудобными для случаев, когда вам необходимо использовать самосоединение (self join) на них.
Это действительно вопрос, который зависит от конкретной ситуации и особенностей операции, и ответ может варьироваться в зависимости от требований сценария.
Однако я хотел бы добавить небольшое замечание: если вы используете представление (view) для хранения результатов сложного запроса, которые затем используются в операциях с GridView, то может возникнуть проблема с выполнением операций обновления на сложных представлениях. В то же время временные таблицы (Temp Tables) могут прекрасно справиться с этой задачей.
С другой стороны, есть сценарии, при которых представления могут быть лучшим выбором (например, в случае работы с несколькими серверами баз данных, если их неправильно обрабатывать), но всё зависит от того, что вы хотите достичь.
В общем, я бы использовал временную таблицу, когда мне нужно несколько раз обратиться к одной и той же таблице внутри хранимой процедуры, а представление — когда я хочу использовать таблицу в разных хранимых процедурах.
Представление по своей сути не сохраняет данные: каждый раз, когда вы обращаетесь к представлению, SQL использует логику этого представления для доступа к исходной таблице. Поэтому не стоит создавать представление на основе другого представления и избегать множественных ссылок на представление с сложной логикой.
"Вставка результатов хранимой процедуры в временную таблицу"
Обновление данных в одной таблице из другой на основе совпадения ID
Как вставить перенос строки в строке VARCHAR/NVARCHAR SQL Server
Возможно ли задать условия в Count()?
with(nolock) или (nolock) - есть ли разница?