Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Insert #Table vs @Table  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 362
Здравствуйте!
Ms sql server 2017

Почему вставка результата запроса во временную таблицу происходит намного быстрее нежели в табличную переменную (5 сек. против 35 сек)
[dbo].[ssf_WordDifference] - CLR функция

DECLARE
	@Fam varchar(50) = 'Фамилия'
	,@Nam VARCHAR(50) = 'Имя'
	,@Mid VARCHAR(50) = 'Отчество'
	
	drop table #FIO
	DECLARE @FIO TABLE (FaceMainGUID UNIQUEIDENTIFIER)
	CREATE TABLE #FIO (FaceMainGUID UNIQUEIDENTIFIER)

					INSERT #FIO
					SELECT ff.FaceMainGUID
						FROM dbo.FaceFIO ff
						WHERE
							([dbo].[ssf_WordDifference]([kFam], @Fam) <= 2 ) and
							([dbo].[ssf_WordDifference]([kNam], @Nam) <= 2 ) and
							([dbo].[ssf_WordDifference]([kMid], @Mid) <= 2 )

					INSERT @FIO
					SELECT ff.FaceMainGUID
						FROM dbo.FaceFIO ff
						WHERE
							([dbo].[ssf_WordDifference]([kFam], @Fam) <= 2 ) and
							([dbo].[ssf_WordDifference]([kNam], @Nam) <= 2 ) and
							([dbo].[ssf_WordDifference]([kMid], @Mid) <= 2 )
11 фев 20, 10:25    [22077385]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 362


К сообщению приложен файл. Размер - 48Kb
11 фев 20, 10:26    [22077386]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 362


К сообщению приложен файл. Размер - 47Kb
11 фев 20, 10:27    [22077387]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6789
Алексаша,

желтые двойные стрелочки виноваты.
SQL предпологает что в @ вставляется одна запись и не параллелит. OPTION (RECOMPILE) или далее по версиям варианты
11 фев 20, 10:28    [22077389]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 362
TaPaK,

там где двойные стрелочки это вставка во временную таблицу. т.е. их наличие в данном случае это хорошо, так?
11 фев 20, 10:40    [22077399]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6789
Алексаша
TaPaK,

там где двойные стрелочки это вставка во временную таблицу. т.е. их наличие в данном случае это хорошо, так?

ну понятие "хорошо" относительно :) Вообще табличные переменные это большая недоделка, которую постоянно пытаются довести до жизненной, так что по возможности не пользуйтесь
11 фев 20, 10:43    [22077405]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 362
TaPaK,

Спасибо, буду иметь в виду.
11 фев 20, 10:46    [22077412]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
invm
Member

Откуда: Москва
Сообщений: 9079
Алексаша,

https://dba.stackexchange.com/questions/16385/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server
Parallelism

Queries that insert into (or otherwise modify) @table_variables cannot have a parallel plan, #temp_tables are not restricted in this manner.

There is an apparent workaround in that rewriting as follows does allow the SELECT part to take place in parallel but that ends up using a hidden temporary table (behind the scenes)

INSERT INTO @DATA ( ... )
EXEC('SELECT .. FROM ...')

There is no such limitation in queries that select from table variables as illustrated in my answer here
11 фев 20, 11:05    [22077431]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7332
Алексаша,

не используйте табличную переменную,если предполагаете вставить более 100 строк.
11 фев 20, 12:06    [22077482]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 362
Владислав Колосов,

В моем случае даже если запрос ничего не возвращает, вставка в переменную 35 сек против 5.
Вашу рекомендацию понял.
11 фев 20, 12:16    [22077492]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
aleks222
Member

Откуда:
Сообщений: 818
Алексаша

даже если запрос ничего не возвращает, вставка в переменную 35 сек против 5.


Так то не вставка, то ваши "функции" исполняются.
11 фев 20, 12:36    [22077522]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 362
aleks222,

почему мои функции в случае со вставкой во временную табл. быстрее работают? в 7 раз
11 фев 20, 14:44    [22077644]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6789
Алексаша
aleks222,

почему мои функции в случае со вставкой во временную табл. быстрее работают? в 7 раз

ответ в желтых стрелках
11 фев 20, 14:52    [22077652]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1150
Алексаша,

Вам же уже написали, с #-таблицами у вас план запроса использует параллелизм, с @-таблицами параллелизм использоваться не может.

Параллельный план на достаточно большом объеме выборки данных в большинстве случаев работает быстрее последовательного. Поэтому и разница.
11 фев 20, 15:05    [22077665]     Ответить | Цитировать Сообщить модератору
 Re: Insert #Table vs @Table  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1186
Я не люблю @ таблицы
потому что с ними усложняется отладка
допустим есть проблема в коле
именя # , ## таблицы ты стопнулся и видишь данные
а в @ нет

тем не менее есть экзотические случаи когда можно заюзать
как то на собесе меня спросили как вставить запись в лог
если транзакция откаталась
я не допер
а ответ был в @ переменных - на них не действует rollback

ps на текущей работе куча кода с @ переменными
вообщем все работает - так что если все пишется нормально
то и работатет оно также
переписывать вообщем не получится да и не надо.

Сообщение было отредактировано: 11 фев 20, 15:38
11 фев 20, 15:36    [22077683]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить