Різниця продуктивності INSERT між тимчасовими таблицями та змінною таблиці


12

У мене в SQL Server 2005 є така проблема: спроба вставити деякі рядки в змінну таблиці займає багато часу в порівнянні з тим же вкладишем за допомогою тимчасової таблиці.

Це код, який потрібно вставити в змінну таблиці

DECLARE @Data TABLE(...)
INSERT INTO @DATA( ... )
SELECT ..
FROM ...

Це код, який потрібно вставити в темп-таблицю

CREATE #Data TABLE(...)
INSERT INTO #DATA( ... )
SELECT ..
FROM ...
DROP TABLE #Data

У тимчасовій таблиці немає жодних ключів або індексів, частина вибору однакова між двома запитами, а кількість результатів, повернених вибором, становить ~ 10000 рядків. Час, необхідний для самостійного виконання вибору, становить ~ 10 секунд.

Версія таблиці темп займає до 10 секунд для виконання, мені довелося зупинити версію змінної таблиці через 5 хвилин.

Я повинен використовувати змінну таблиці, оскільки запит є частиною функції значення таблиці, яка не дозволяє отримати доступ до тимчасової таблиці.

План виконання для змінної версії таблиці План виконання

План виконання для версії таблиці темп План виконання

Відповіді:


8

Очевидна відмінність двох планів полягає в тому, що швидкий паралельний, а повільний - послідовний.

Це одне з обмежень планів, які вставляються в таблиці змінних. Як згадувалося в коментарях (і, здається, це мало бажаний ефект), ви можете спробувати зробити це

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

щоб побачити, чи не обійдеться це обмеження.


Це було чудовою пропозицією, хоча я хоч і не міг використовувати EXECфункцію .... здогадуюсь, я помилявся
Lamak

1
@Lamak - До! Ви не можете, щоб це не працювало для ОП. Invalid use of a side-effecting operator 'INSERT EXEC' within a function.. Робота навколо може працювати , хоча. OPENQUERY
Мартін Сміт

Ах, добре знати, дякую за роз’яснення
Ламак

2
Як правило, ви не хочете використовувати змінні таблиці, якщо ви будете сподіватися повернути великий набір даних. Тимчасові таблиці зазвичай швидше в цьому випадку.
HLGEM

1
@munissor, тоді не використовуйте функцію оцінювання таблиці. Якщо ви хочете отримати кращі поради, опублікуйте саме те, що ви робите.
HLGEM

-1

Змінні таблиці іноді повільніше, оскільки немає статистичних даних щодо змінних таблиць, і тому оптимізатор завжди передбачає лише один запис.

Однак я не можу гарантувати, що це так і тут, вам доведеться переглянути інформацію про "орієнтовні рядки" в плані запитів для змінної таблиці.


Як це вплине на вставку в змінну таблиці?
Мартін Сміт

Ось що, як видається, відбувається, як ви бачите, що існує не тільки різниця між паралельним і послідовним, але також між приєднанням хеш-і вкладеного циклу, мабуть, оптимізатор припускає, що оскільки таблична змінна містить у своєму розумі один результат, то результат запиту також буде один запис, ще раз єдиним способом довести це було б побачити фактичну статистику для кожної частини запиту, але факт полягає в тому, що всі запити, що включають змінні таблиці, закінчуються приєднаннями циклу та послідовною обробкою, тому я річ справедливо підозрювати це
yoel halb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.