Mam następujący problem w SQL Server 2005: próba wstawienia niektórych wierszy do zmiennej tabeli zajmuje dużo czasu w porównaniu z tym samym wstawieniem przy użyciu tabeli tymczasowej.
To jest kod, który należy wstawić do zmiennej tabeli
DECLARE @Data TABLE(...)
INSERT INTO @DATA( ... )
SELECT ..
FROM ...
To jest kod do wstawienia do tabeli temp
CREATE #Data TABLE(...)
INSERT INTO #DATA( ... )
SELECT ..
FROM ...
DROP TABLE #Data
Tabela tymczasowa nie ma żadnych kluczy ani indeksów, część select jest taka sama między 2 zapytaniami, a liczba wyników zwróconych przez select wynosi ~ 10000 wierszy. Czas potrzebny do wykonania samego wyboru wynosi ~ 10 sekund.
Wykonanie wersji tabeli temp zajmuje do 10 sekund, musiałem zatrzymać wersję zmiennej tabeli po 5 minutach.
Muszę użyć zmiennej tabeli, ponieważ zapytanie jest częścią funkcji wartości tabeli, która nie pozwala na dostęp do tabeli tymczasowej.
Plan wykonania dla wersji zmiennej tabelowej
Plan wykonania dla wersji tabeli tymczasowej
źródło
EXEC
tej funkcji .... chyba się myliłemInvalid use of a side-effecting operator 'INSERT EXEC' within a function.
. Obejść praca może chociaż.OPENQUERY
Zmienne tabeli są czasami wolniejsze, ponieważ nie ma statystyk dotyczących zmiennych tabeli, dlatego optymalizator zawsze zakłada tylko jeden rekord.
Jednak nie mogę zagwarantować, że tak jest w tym przypadku, musisz rzucić okiem na informacje o „szacowanych wierszach” w planie zapytań dla zmiennej tabeli.
źródło