Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Insert #Table vs @Table / 15 сообщений из 15, страница 1 из 1
11.02.2020, 10:25
    #39925054
Алексаша
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
Здравствуйте!
Ms sql server 2017

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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 )
...
Рейтинг: 0 / 0
11.02.2020, 10:26
    #39925055
Алексаша
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
...
Рейтинг: 0 / 0
11.02.2020, 10:27
    #39925056
Алексаша
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
...
Рейтинг: 0 / 0
11.02.2020, 10:28
    #39925058
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
Алексаша,

желтые двойные стрелочки виноваты.
SQL предпологает что в @ вставляется одна запись и не параллелит. OPTION (RECOMPILE) или далее по версиям варианты
...
Рейтинг: 0 / 0
11.02.2020, 10:40
    #39925064
Алексаша
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
TaPaK,

там где двойные стрелочки это вставка во временную таблицу. т.е. их наличие в данном случае это хорошо, так?
...
Рейтинг: 0 / 0
11.02.2020, 10:43
    #39925066
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
Алексаша
TaPaK,

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

ну понятие "хорошо" относительно :) Вообще табличные переменные это большая недоделка, которую постоянно пытаются довести до жизненной, так что по возможности не пользуйтесь
...
Рейтинг: 0 / 0
11.02.2020, 10:46
    #39925070
Алексаша
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
TaPaK,

Спасибо, буду иметь в виду.
...
Рейтинг: 0 / 0
11.02.2020, 11:05
    #39925084
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
Алексаша,

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
...
Рейтинг: 0 / 0
11.02.2020, 12:06
    #39925118
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
Алексаша,

не используйте табличную переменную,если предполагаете вставить более 100 строк.
...
Рейтинг: 0 / 0
11.02.2020, 12:16
    #39925125
Алексаша
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
Владислав Колосов,

В моем случае даже если запрос ничего не возвращает, вставка в переменную 35 сек против 5.
Вашу рекомендацию понял.
...
Рейтинг: 0 / 0
11.02.2020, 12:36
    #39925146
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
Алексаша

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


Так то не вставка, то ваши "функции" исполняются.
...
Рейтинг: 0 / 0
11.02.2020, 14:44
    #39925219
Алексаша
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
aleks222,

почему мои функции в случае со вставкой во временную табл. быстрее работают? в 7 раз
...
Рейтинг: 0 / 0
11.02.2020, 14:52
    #39925227
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
Алексаша
aleks222,

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

ответ в желтых стрелках
...
Рейтинг: 0 / 0
11.02.2020, 15:05
    #39925236
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
Алексаша,

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

Параллельный план на достаточно большом объеме выборки данных в большинстве случаев работает быстрее последовательного. Поэтому и разница.
...
Рейтинг: 0 / 0
11.02.2020, 15:36
    #39925251
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert #Table vs @Table
Я не люблю @ таблицы
потому что с ними усложняется отладка
допустим есть проблема в коле
именя # , ## таблицы ты стопнулся и видишь данные
а в @ нет

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

ps на текущей работе куча кода с @ переменными
вообщем все работает - так что если все пишется нормально
то и работатет оно также
переписывать вообщем не получится да и не надо.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Insert #Table vs @Table / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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