0

Представляемая или временная таблица - что выбрать в MS SQL Server?

14

У меня возникла проблема с выбором между использованием представления и временной таблицей.

У меня есть хранимая процедура, которую я вызываю из программы. В этой процедуре я сохраняю результаты долгого запроса во временной таблице, называю столбцы и выполняю ещё несколько запросов к этой таблице, сохраняя результаты в метках или в GridView и после этого удаляю временную таблицу. Я мог бы также сохранить результат запроса в представлении и выполнять запросы к этому представлению. Что лучше использовать, и в каких случаях мне обязательно нужно применять представление или временную таблицу?

Согласно моим исследованиям, у представления есть такие преимущества, как безопасность, простота и возможность указания имен столбцов. На мой взгляд, моя временная таблица также удовлетворяет всем этим критериям.

5 ответ(ов)

0

Если ваш запрос «долгий», и вы получаете результаты из нескольких запросов, то временная таблица будет лучшим выбором.

Представление (view) в общем случае является просто сокращением для оператора select. Это не означает, что результаты когда-либо обрабатываются и сохраняются. Каждый раз, когда вы используете представление, результаты необходимо заново генерировать. Хотя повторные обращения к представлению могут быть более эффективными (например, если страницы, используемые в запросе представления, находятся в кеше), временная таблица фактически хранит результаты.

В SQL Server вы также можете использовать переменные таблиц (например, declare @t table ...).

Использование временной таблицы (или переменной таблицы) внутри одной сохраненной процедуры, как правило, имеет мало последствий с точки зрения безопасности, простоты и имен столбцов. Безопасность будет обеспечиваться доступом к сохраненной процедуре. Имена столбцов необходимы для обоих решений. Оценить простоту без дополнительной информации сложно, но ничего не выделяется как особенно сложное.

0

Это зависит от того, какая задача перед вами стоит.

Если вам нужно, чтобы представление (view) каждый раз выполняло обработку вашего "долгого запроса", то его использование будет значить дополнительные вычислительные затраты. В то же время временная таблица (temp table) позволяет сохранять результаты, что минимизирует повторные вычисления.

Так что вам нужно определить: хотите ли вы использовать больше ресурсов процессора или больше места для хранения данных?

Вы также можете использовать некоторые значения из представления (постоянный индекс), что может помочь с производительностью, но для более точного ответа не хватает информации о вашем конкретном сценарии.

Если речь идет только о необходимости хранения данных в рамках одного вызова процедуры, то лучшим выбором будет временная таблица.

0

Следует также отметить, что для временной таблицы существует ограничение:

Вы не можете ссылаться на временную таблицу более одного раза в одном запросе.

Это делает временные таблицы неудобными для случаев, когда вам необходимо использовать самосоединение (self join) на них.

0

Это действительно вопрос, который зависит от конкретной ситуации и особенностей операции, и ответ может варьироваться в зависимости от требований сценария.

Однако я хотел бы добавить небольшое замечание: если вы используете представление (view) для хранения результатов сложного запроса, которые затем используются в операциях с GridView, то может возникнуть проблема с выполнением операций обновления на сложных представлениях. В то же время временные таблицы (Temp Tables) могут прекрасно справиться с этой задачей.

С другой стороны, есть сценарии, при которых представления могут быть лучшим выбором (например, в случае работы с несколькими серверами баз данных, если их неправильно обрабатывать), но всё зависит от того, что вы хотите достичь.

0

В общем, я бы использовал временную таблицу, когда мне нужно несколько раз обратиться к одной и той же таблице внутри хранимой процедуры, а представление — когда я хочу использовать таблицу в разных хранимых процедурах.

Представление по своей сути не сохраняет данные: каждый раз, когда вы обращаетесь к представлению, SQL использует логику этого представления для доступа к исходной таблице. Поэтому не стоит создавать представление на основе другого представления и избегать множественных ссылок на представление с сложной логикой.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь