Использование временных таблиц в SQL Server. Временные таблицы t sql


sql - Использование временных таблиц в SQL Server

Временные таблицы наиболее полезны для сложного пакетного процесса, такого как отчет или работа ETL. Как правило, вы ожидаете использовать их довольно редко в транзакционном приложении.

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

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

Другие причины могут включать извлечение данных из полей XML с использованием запросов CROSS APPLY и xpath. Как правило, гораздо эффективнее извлечь это в таблицу temp, а затем работать в таблице temp. Они также намного быстрее, чем CTE для некоторых задач, поскольку они материализуют результаты запроса, а не повторно оценивают запрос.

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

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

qaru.site

Почему я не могу повторно использовать временные таблицы в T-SQL? MS SQL Server

Вот пример кода:

if object_id('tempdb..#TempList') is not null drop table #TempList create table #TempList ( ID int, Name varchar(20) ) insert into #TempList values (1, 'Alpha') insert into #TempList values (2, 'Beta') insert into #TempList values (3, 'Gamma') insert into #TempList values (4, 'Delta') insert into #TempList values (5, 'Omega') select * from #TempList if object_id('tempdb..#TempList') is not null drop table #TempList drop table #TempList create table #TempList ( ID_New int, AnotherID int, Name_New varchar(40) ) insert into #TempList values (100, 110, 'Orange') insert into #TempList values (101, 111, 'Red') insert into #TempList values (102, 112, 'Purple') insert into #TempList values (103, 113, 'Blue') insert into #TempList values (104, 114, 'Green') select * from #TempList

Это приводит к следующей ошибке:

Msg 2714, Level 16, State 1, Line 19 There is already an object named '#TempList' in the database.

Я не могу повторно использовать одно и то же имя таблицы temp в одном и том же сценарии SQL? Есть ли способ повторного использования одного и того же имени таблицы temp?

Благодарю.

Solutions Collecting From Web of "Почему я не могу повторно использовать временные таблицы в T-SQL?"

+ Изменить

if object_id('tempdb..#TempList') is not null drop table #TempList drop table #TempList create table #TempList (

в

if object_id('tempdb..#TempList') is not null drop table #TempList drop table #TempList GO; create table #TempList (

Оптимизатор запросов SQL Server запутывается.

Он видит, что вы создаете одну и ту же таблицу во второй раз. Обратите внимание, что падение таблицы (а также создание) имеет вероятностный результат, результат будет известен только во время выполнения (не при синтаксическом контроле или создании плана выполнения запроса aka «компиляция» на жаргоне SQL Server)

Похоже на ошибку парсера. Я уверен, что он видит, что два оператора create table создают одну и ту же таблицу и вызывают ошибку, независимо от оператора drop. Однако разбить его с помощью инструкции go отлично.

create table #Temp (ID int) insert into #Temp (ID) select 1 union all select 2 select ID from #Temp drop table #Temp go create table #Temp (ID int) insert into #Temp (ID) select 10 union all select 11 select ID from #Temp drop table #Temp

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

Поведение объясняется в этом блоге довольно тщательно.

Вам нужно запустить другой запрос, используя сравнение LIKE чтобы удалить таблицу #temp :

IF EXISTS ( SELECT * FROM sys.tables WHERE name LIKE '#templist%') DROP TABLE #templist CREATE TABLE #templist...

Да. Оставьте таблицу, когда вы закончите ее использование. 🙂

sqlserver.bilee.com

Временная таблица? Безопасный SQL

Во-первых, локальные временные таблицы, созданные в рамках процедуры, отбрасываются после завершения процедуры. Из BOL на Создать таблицу :

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

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

Я говорю «эффективно», чтобы поднять еще один момент. Я бы не рекомендовал отказаться от таблицы temp в конце вашей процедуры, хотя я бы добавил проверку непосредственно перед тем, как создать временную таблицу и удалить ее, если она существует (например, if object_id('tempdb..#Foo') is not null ). Аргумент против отмены таблицы temp в конце состоит в том, что, вызывая оператор Drop, вы вынуждаете SQL Server расходовать ресурсы, чтобы уничтожить таблицу тогда и там, пока вы ждете окончания вашей процедуры. Если вместо этого вы выходите из области действия, ваша процедура заканчивается немедленно, и вы позволяете SQL Server уничтожать таблицу в любое время по собственному выбору.

Таблица #Temp ограничена для ВАШЕЙ СЕССИИ и продолжительности жизни партии, то есть никто другой не может видеть вашу временную таблицу, а кто-то другой может создать свою собственную таблицу #Temp с тем же именем. После завершения сеанса или партии SQL Server очистит таблицу temp.

На другой ноте таблица ## Temp ведет себя как обычная таблица. Каждый может видеть это, и не может быть более одной таблицы ### Temp с тем же именем. SQL Server очистит эти таблицы ## Temp при перезапуске сервера.

Считается хорошей практикой кодирования, чтобы явным образом отбрасывать каждую временную таблицу, которую вы создаете. Если вы выполняете сценарии через SQL Server Management Studio / Query Analyzer, временные таблицы сохраняются до тех пор, пока вы явно не удалите их или пока не закроете сеанс.

В общем, у вас, вероятно, не будет проблем, не отбрасывая временные таблицы. В локальной таблице temp есть область сеанса или область SP в вашем случае. Он автоматически прекратится, когда сеанс будет закрыт или SP завершится.

Тем не менее, вы постоянно увеличиваете риск проблем, регулярно следуя этой практике. Например, если вы не используете SP, а отправляете инструкцию SELECT из ASP .net и оставляете соединение SQL Server открытым, таблица temp будет продолжать существовать. Продолжение использования соединения и других временных таблиц приведет к росту tempdb с течением времени.

Я также поддерживаю другие комментарии относительно использования временных таблиц в этом случае. Если вы создадите решение без временных таблиц, у вас, вероятно, будет более быстрый отчет и вы также можете избежать команды DROP temp table.

sql.fliplinux.com