Tabele tymczasowe są właśnie tym. Są one najczęściej używane w celu zapewnienia przestrzeni roboczej dla wyników pośrednich podczas przetwarzania danych w ramach partii lub procedury. Są również używane do przekazywania tabeli z funkcji wartościowanej w tabeli, do przekazywania danych tabelarycznych między procedurami składowanymi lub, ostatnio w postaci parametrów wycenianych w tabeli, do wysyłania całych tabel tylko do odczytu z aplikacji do procedur SQL Server lub przekaż tabele tymczasowe tylko do odczytu jako parametry. Po zakończeniu ich używania są automatycznie usuwane.
Zanim zagłębimy się w technologię, radziłbym, abyś w miarę możliwości używał zmiennych tabeli. Są łatwe, a SQL Server wykonuje całą pracę za Ciebie. Mają również tendencję do powodowania mniej problemów w ciężko pracującym systemie OLTP. Tylko od czasu do czasu może zajść potrzeba ich dostrojenia, aby uzyskać dobrą wydajność w połączeniach, ale wyjaśnię to za chwilę, Jeśli jednak wykonujesz bardziej złożone przetwarzanie danych tymczasowych lub prawdopodobnie używasz więcej niż rozsądnie małych ilości danych w nich, wtedy lokalne tabele tymczasowe będą prawdopodobnie lepszym wyborem.
Zmienne tabeli
Zmienne tabelowe są używane w ramach procedury lub partii, w której się znajdują zdefiniowane i zostały pierwotnie utworzone, aby umożliwić funkcje wartościowane w tabeli. Jednak nadają się one do wielu zastosowań, do których był używany tradycyjny stół tymczasowy. Zachowują się jak inne zmienne w swoich regułach określania zakresu. Gdy znajdą się poza zakresem, są usuwane. Są o wiele łatwiejsze w obsłudze i całkiem bezpieczne, a ponadto powodują mniejszą liczbę ponownych kompilacji w procedurach, w których są używane, niż w przypadku korzystania z tabel tymczasowych. Zmienne tabeli wymagają mniej zasobów blokujących, ponieważ są „prywatne” dla procesu, który je utworzył. Wycofania transakcji nie mają na nie wpływu, ponieważ zmienne tabeli mają ograniczony zakres i nie są częścią trwałej bazy danych, więc są przydatne do tworzenia lub przechowywania danych, które powinny przetrwać wycofania, takie jak wpisy dziennika. Wadą zmiennych tabel jest to, że często są one usuwane, zanim będziesz mógł zbadać ich zawartość w celu debugowania lub użyć ich do interaktywnego wypróbowania różnych wyrażeń SQL.
Jeśli Twoja aplikacja jest konserwatywna, a ilość danych Nigdy więcej nie będę chciał. Możesz jednak napotkać problemy. Jedną z trudności jest to, że do zmiennych tabeli można się odwoływać tylko w zakresie lokalnym, więc nie można ich przetwarzać za pomocą dynamicznego języka SQL, tak jak w przypadku tymczasowej tabeli lub parametru wycenianego w tabeli. Dzieje się tak, ponieważ nie można odwołać się do zmiennej tabeli zdefiniowanej zewnętrznie w dynamicznym języku SQL, którą następnie wykonuje się za pomocą instrukcji EXEC lub procedury składowanej sp_ExecuteSQL
, ponieważ dynamiczny SQL jest wykonywany poza zakresem zmiennej tabeli. Możesz oczywiście utworzyć, a następnie użyć zmiennej tabeli wewnątrz dynamicznego SQL, ponieważ zmienna tabeli będzie w zasięgu. Jednak po uruchomieniu dynamicznego SQL nie byłoby zmiennej tabeli.
Jest też kilka anomalii, o których należy pamiętać. Nie można na przykład zmienić definicji tabeli po początkowej instrukcji DECLARE. W SQL Server 2000 zmienna tabeli nie może być miejscem docelowym instrukcji SELECT INTO
ani INSERT EXEC
(teraz naprawiono); Nie można wywoływać funkcji zdefiniowanych przez użytkownika z ograniczeń CHECK, wartości DEFAULT i kolumn obliczeniowych w zmiennej tabeli. Jedynymi ograniczeniami, które są dozwolone poza ograniczeniami CHECK, to PRIMARY KEY, UNIQUE KEY i NULL / NOT NULL
Jednak najtrudniejsze problemy pojawiają się wraz ze wzrostem rozmiaru tabel, ponieważ przed SQL Server 2016 , nie można było jawnie zadeklarować indeksu, a indeksy, które wymuszały ograniczenia UNIQUE i PRIMARY KEY, nie miały utrzymywanych indeksów dystrybucji. Teraz możesz tworzyć określone typy indeksów bezpośrednio z definicją tabeli, ale statystyki dystrybucji nadal nie są dla nich utrzymywane. Optymalizator zapytań zakłada, że w tabeli jest tylko jeden wiersz. Nie można również generować planów zapytań równoległych dla wyrażenia SQL, które modyfikuje zawartość tabeli. Aby częściowo obejść ograniczenie indeksu, możesz użyć ograniczeń, aby zrobić to samo. Najistotniejsze jest ograniczenie klucza podstawowego, które umożliwia narzucenie indeksu klastrowego, ale unikalne ograniczenia są przydatne dla wydajności. Optymalizator zapytań z radością ich użyje, jeśli są w pobliżu.
Największym problemem ze zmiennymi tabeli jest to, że statystyki nie są utrzymywane w kolumnach. Oznacza to, że optymalizator zapytań musi odgadnąć rozmiar i dystrybucję danych, a jeśli się pomyli, zobaczysz słabą wydajność łączenia: Jeśli tak się stanie, niewiele możesz zrobić w inny sposób niż powrócić do używania klasycznych lokalnych tabel tymczasowych. Począwszy od SQL Server 2019, firma Microsoft wprowadziła nową funkcję o nazwie Odroczona kompilacja zmiennych tabeli, która rozwiązuje ten problem. Aby dowiedzieć się więcej, przeczytaj ten artykuł Grega Larsena.
Jeśli nie używasz SQL Server 2019, jedną rzeczą, którą możesz spróbować, jest dodanie OPTION (RECOMPILE) do instrukcji, która obejmuje połączenie zmiennej tabeli z innymi tabelami. Dzięki temu SQL Server będzie w stanie wykryć liczbę wierszy podczas ponownej kompilacji, ponieważ wiersze będą już wypełnione. Nie rozwiązuje to całkowicie problemu, ponieważ optymalizator nadal nie ma statystyk dotyczących dystrybucji i może, zwykle w przypadku wypaczenia rozkładu, stworzyć zły plan. W tej wersji demonstracyjnej łączenie zostało skrócone w czasie o trzy czwarte, po prostu dodając OPCJĘ (REKOMPILUJ)
Teraz, jeśli możesz sprawić, że to, co trafia do tabel, będzie unikalne, możesz następnie użyć na nich ograniczenia klucza podstawowego stoły. Pozwoliło to optymalizatorowi na użycie klastrowego przeszukiwania indeksu zamiast skanowania tabeli, a czas wykonania był zbyt szybki, aby go zmierzyć
Zacznij od zmiennych tabeli, ale w przypadku problemów z wydajnością wróć do używania lokalnych tabel tymczasowych. Niektórzy ludzie są na tyle odważni, by udzielać porad dotyczących liczby wierszy w tabeli, a widziałem 100 lub 1000 oferowanych jako maksimum; ale widziałem, że znacznie większe zmienne tabelaryczne działają z czasem doskonale zadowalająco, a znacznie mniejsze powodują problemy. Jednak w mniejszych tabelach problem jest mniej wykrywalny!
Parametry wartościowane w tabeli
Parametr wartościowany w tabeli (TVP) jest specjalnym typem zmiennej tabeli, która rozszerza jej zastosowanie. Gdy zmienne tabeli są przekazywane jako parametry, tabela jest materializowana w bazie danych systemu TempDB jako zmienna tabeli i przekazywana przez odniesienie, wskaźnik do tabeli w bazie danych TempDB.
Parametry wartościowane w tabeli są używane od tego czasu SQL Server 2008 do wysyłania kilku wierszy danych do procedury Transact-SQL lub do partii za pośrednictwem sp_ExecuteSQL
. Ich szczególną wartością dla programisty jest to, że mogą być używane w kodzie TSQL jako a także w aplikacji klienckiej, więc są dobre do wysyłania tabel klienta na serwer. Z poziomu TSQL można zadeklarować zmienne z wartościami przechowywanymi w tabeli, wstawić do nich dane i przekazać te zmienne jako parametry wartościowane w tabeli do procedur składowanych i funkcji, a ich ogólniejsza użyteczność jest ograniczona przez fakt, że są one przekazywane tylko jako tylko do odczytu. Nie możesz wykonywać instrukcji UPDATE
, DELETE
ani INSERT
w przypadku wartości tabeli parametr w treści procedury.
Musisz utworzyć typ tabeli zdefiniowany przez użytkownika i zdefiniować strukturę tabeli, aby z nich korzystać. Oto prosty przykład ich użycia w TSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
/ * Najpierw musisz utworzyć tabelę rodzaj. * /
UTWÓRZ NAZWY TYPU JAKO TABELĘ
(Nazwa VARCHAR (10));
GO
/ * Następnie utwórz procedurę otrzymywania danych dla parametru wycenianego w tabeli, tabeli nazw i wybierz jedną pozycję z tabeli * /
TWORZENIE PROCEDURY ChooseAName
@CandidateNames Names READONLY
AS
DECLARE @candidates TABLE (NAME VARCHAR (10),
theOrder UNIQUEIDENTIFIER)
INSERT INTO @candidates (nazwa, kolejność)
SELECT name, NEWID ()
FROM @CandidateNames
SELECT TOP 1
NAME
FROM @Candidates
ZAMÓWIENIE WEDŁUG ZAMÓWIENIA
GO
/ * Zadeklaruj zmienną, która odwołuje się do typu naszej listy krów. * /
ZADEKLAROWAĆ @MyFavouriteCowName AS Names;
/ * Dodaj dane do zmiennej tabeli. * /
INSERT INTO @MyFavouriteCowName (Name)
SELECT „Bossy” UNION SELECT „Bessy” UNION SELECT „płatek” UNION SELECT „Daisy” UNION SELECT „Lulu” UNION SELECT ” Buttercup „UNION SELECT” Bertha „WYBÓR UNII” Bubba „WYBÓR UNII” Beauregard „WYBÓR UNII” Brunhilde „WYBÓR UNII” Lore „WYBÓR UNII” Lotte „WYBÓR UNII” Rosa „WYBÓR UNII” Thilde „WYBÓR UNII” Lisa „WYBÓR UNII” Peppo „UNION SELECT” Maxi „UNION SELECT” Moriz „UNION SELECT” Marla „
/ * Przekaż tabelę z listą tradycyjnych nemów krów do procedury składowanej. * /
EXEC wybierzAName @MyFavouriteCowName
GO
|
Podobnie jak w przypadku zmiennych tabeli, parametr wyceniony w tabeli przestaje istnieć, gdy znajduje się poza zakresem, ale definicja typu pozostaje, dopóki nie zostanie jawnie usunięta.Podobnie jak zmienne tabelowe, nie uzyskują blokad, gdy dane są wypełniane przez klienta, a statystyki nie są utrzymywane w kolumnach parametrów wycenianych w tabeli. Nie można użyć parametru wycenionego w tabeli jako celu instrukcji SELECT INTO
lub INSERT EXEC
. Jak można się spodziewać, parametr wyceniony w tabeli może znajdować się w klauzuli FROM
w SELECT INTO
lub w INSERT EXEC
ciąg znaków lub procedura składowana.
TVP rozwiązuje powszechny problem związany z chęcią przekazania lokalnej zmiennej do dynamicznego SQL, która jest następnie wykonywana przez sp_ExecuteSQL
. Jest słabo udokumentowany przez firmę Microsoft, więc pokażę Ci sprawdzony przykład na początek
Zanim przejdziemy do opisu bardziej tradycyjnych tabel tymczasowych i ich użycia, musimy zagłębić się w miejsce, w którym odbywają się tymczasowe stoły. TempDB.
TempDB
Tymczasowe tabele i zmienne tabel są tworzone w bazie danych TempDB, która jest po prostu kolejną bazą danych z prostym odzyskiwaniem: w TempDB wykonywane jest tylko „minimalne” rejestrowanie aby umożliwić wycofywanie zmian i inne rozwiązania ACID. Szczególną różnicą w TempDB jest to, że wszelkie obiekty, takie jak tabele, są usuwane podczas uruchamiania. Ponieważ baza danych TempDB zawsze korzysta z prostego modelu odzyskiwania, zakończona transakcja jest usuwana z dziennika dziennika w następnym punkcie kontrolnym bazy danych TempDB i zachowywane są tylko transakcje na żywo. To wszystko oznacza, że tabele tymczasowe zachowują się jak inne tabele bazowe, ponieważ są rejestrowane i przechowywane tak jak one. W praktyce tabele tymczasowe prawdopodobnie pozostaną w pamięci podręcznej, ale tylko wtedy, gdy są często używane: tak samo jak w przypadku tabeli podstawowej. TempDB obsługuje system zwany tymczasowym ponownym wykorzystaniem obiektów, który buforuje część obiektów tymczasowych wraz z planem, jeśli jest wystarczająca ilość pamięci. Może to wyjaśniać legendę, że obiekty tymczasowe istnieją tylko w pamięci. Prawda jak zawsze jest taka, że „to zależy…”.
W TempDB dzieje się wiele innych rzeczy: silnik bazy danych może go używać do umieszczania tabel roboczych w celu sprawdzenia DBCC, tworzenia lub odbudowywania indeksów, kursorów, na przykład. Tabele pośrednie w zapytaniach opisanych jako „hashes”, „sorts” i „spools” są na przykład materializowane w bazie danych TempDB, razem z tabelami wymaganymi do kilku „fizycznych” operacji wykonywania instrukcji SQL. Jest również używany jako magazyn wersji dla izolacji migawki, wielu aktywnych zestawów wyników (MARS), wyzwalaczy i budowania indeksu online.
Ponieważ tabele tymczasowe są przechowywane tak samo jak tabele podstawowe, istnieje jeden lub dwa rzeczy, na które musisz uważać. Na przykład musisz mieć uprawnienie CREATE TABLE
w TempDB, aby utworzyć normalną tabelę. Aby zaoszczędzić Ci kłopotów, jest to domyślnie przypisane do roli DBO (właściciel bazy danych), ale może być konieczne zrobienie tego jawnie w przypadku użytkowników, którym nie przypisano roli DBO. Wszyscy użytkownicy mają uprawnienia do tworzenia lokalnych lub globalnych tabel tymczasowych w bazie danych TempDB, ponieważ jest to im przypisywane za pośrednictwem kontekstu bezpieczeństwa użytkownika GUEST
.
Klasyczna tabela tymczasowa jest dostępna dwie odmiany, globalna lub udostępniana, tymczasowa tabela, poprzedzona przedrostkiem „##” i lokalna tabela tymczasowa, której nazwa jest poprzedzona znakiem „#”. Lokalne tabele tymczasowe są mniej podobne do zwykłych tabel niż globalne tabele tymczasowe: nie może tworzyć na nich widoków ani kojarzyć z nimi wyzwalaczy. Trudno jest ustalić, który proces, sesja lub procedura je utworzyły. Później pomożemy Ci w tym. Co najważniejsze, są one bezpieczniejsze niż globalna tabela tymczasowa, ponieważ może ją zobaczyć tylko proces będący jej właścicielem.
Inną osobliwością lokalnej tabeli tymczasowej (i lokalnej tymczasowej procedury przechowywanej) jest to, że ma ona inną nazwę w metadanych do tego, który podajesz w ramach procedury lub partii. Jeśli ta sama procedura jest wykonywana jednocześnie przez kilka procesów, aparat bazy danych musi być w stanie rozróżnić lokalne tabele tymczasowe o identycznych nazwach utworzone przez różne procesy. Odbywa się to poprzez dodanie ciągu liczbowego do każdej lokalnej nazwy tabeli tymczasowej, uzupełnionej znakami podkreślenia z lewej strony. Chociaż określasz krótką nazwę, na przykład #MyTempTable
, to, co faktycznie jest przechowywane w TempDB, składa się z nazwy tabeli określonej w instrukcji CREATE TABLE
i przyrostek. Z powodu tego przyrostka nazwy lokalnych tabel tymczasowych muszą mieć maksymalnie 116 znaków.
Jeśli chcesz zobaczyć, co się dzieje, możesz przeglądać tabele w TempDB w taki sam sposób, jak inne stół. Możesz nawet używać sp_help
pracy z tabelami tymczasowymi tylko wtedy, gdy wywołasz je z TempDB.
1
2
3
|
UŻYJ TEMPDB
idź
wykonaj sp_Help #mytemp
|
lub można je znaleźć w widokach systemowych TempDB bez przełączania baz danych.
1
|
SELECT nazwa, create_date FROM TempDB.sys.tables WHERE nazwa LIKE „#%”
|
Lub schemat informacyjny
1
|
SELECT * FRO M TempDB.information_schema.tables
|
Jeszcze lepiej, możesz dowiedz się, jaki proces i użytkownik przetrzymuje ogromne tabele tymczasowe w TempDB i odmawia oddania miejsca
Nie możesz używać typów danych zdefiniowanych przez użytkownika w tabelach tymczasowych, chyba że typy danych istnieją w TempDB; to znaczy, chyba że typy danych zostały jawnie utworzone.
Tabele użytkowników w TempDB
W normalnym użyciu utworzysz tabele tymczasowe lub zmienne tabelowe bez zbytniego zastanawiania się nad tym. Ciekawe jest jednak to, że TempDB służy do wszelkiego rodzaju działań w piaskownicy. Możesz tworzyć zwykłe tabele podstawowe, widoki lub cokolwiek zechcesz. Możesz tworzyć schematy, procedury składowane i tak dalej. Raczej nie będziesz tego chciał, ale z pewnością jest to możliwe, ponieważ TempDB to tylko kolejna baza danych. Musiałem tylko ponownie uruchomić programistyczny SQL Server po tym, jak sobie to udowodniłem, instalując na nim AdventureWorks. Oznacza to, że w TempDB można utworzyć tabelę bazową, coś w rodzaju… bardziej… tymczasowej tabeli stałej. W przeciwieństwie do globalnego stołu tymczasowego, musisz zająć się nim samodzielnie: jesteś sam. To samo dotyczy rutyny. Zaletą takiego rozwiązania jest to, że każde przetwarzanie, które wykonujesz, wykorzystuje proste odzyskiwanie bazy danych TempDB, dzięki czemu, jeśli nie uda ci się zlikwidować, SQL Server działa jako matka przy następnym uruchomieniu: chociaż może to trwać bardzo długo. Następnym etapem jest stworzenie czegoś, co nazywam „trwałą tabelą tymczasową”. W tej tabeli same dane są ulotne po ponownym uruchomieniu serwera, ale sama tabela pozostaje. Prawdopodobnie najczęstszym sposobem tworzenia trwałej tabeli tymczasowej jest ponowne utworzenie globalnej tabeli tymczasowej podczas uruchamiania. Można to zrobić automatycznie po odzyskaniu wszystkich baz danych i zarejestrowaniu komunikatu „Odzyskiwanie zakończone”. Mimo że jest to „tymczasowy globalny”, nie jest on usuwany, gdy znikną wszystkie używające go połączenia, ponieważ proces, który go uruchamia nigdy nie znika. Prawdopodobnie lepiej jest utworzyć taką tabelę roboczą w bazie danych, która z niej korzysta, ale jeśli używasz pełnego odzyskiwania, praca tymczasowa pozostanie w dzienniku. Oczywiście możesz po prostu utworzyć zwykłą tabeli w TempDB. Możesz utworzyć te „trwałe” tabele podczas uruchamiania, definiując procedurę składowaną w module głównym, która tworzy globalną tabelę tymczasową.
Dlaczego warto używać tego rodzaju tabeli hybrydowej? Istnieją na przykład liczby technik przekazywania tabel między procedurami za pośrednictwem „trwałych” tabel w sposób bezpieczny dla wielu procesów, tak aby wykonać serię przetwarzania danych. Są one określane jako tabele z kluczem procesowym (patrz „Jak udostępniać dane między procedurami składowanymi : Tabela z kluczami procesowymi autorstwa Erlanda Sommarskoga ). Początkowo będą podnosić brwi każdego doświadczonego DBA, ale są skutecznym i bezpiecznym rozwiązaniem odwiecznego problemu, gdy są wykonywane prawidłowo.
Oprócz tabel tymczasowych, istnieje również wiele typów tabel które nie pochodzą bezpośrednio z tabel podstawowych, takich jak „fałszywe” tabele i tabele pochodne: niektóre z nich są tak ulotne, że najlepiej je traktować jako efemeryczne, a nie tymczasowe. CTE używa tabel efemerycznych, które są „wbudowane” lub „wyprowadzone” i nie zostały zmaterializowane. BOL określa je jako „tymczasowe nazwane zestawy wyników”. Istnieją tylko w ramach wyrażenia. W CTE mają przewagę nad tabelami pochodnymi, ponieważ można uzyskać do nich dostęp więcej niż raz.
Lokalna tabela tymczasowa
Z lokalną tabelą tymczasową (nazwy zaczynające się od #), to, co dzieje się pod maską, jest zaskakująco podobne do zmiennych tabeli. Podobnie jak w przypadku zmiennych tabel, lokalne tabele tymczasowe są prywatne dla procesu, który je utworzył. Dlatego nie można ich używać w widokach i nie można z nimi kojarzyć wyzwalaczy.
Są wygodniejsze niż zmienne tabeli, jeśli lubisz używać SELECT INTO
do ich tworzenia, ale jestem trochę ostrożny, jeśli chodzi o używanie SELECT INTO
w systemie, który prawdopodobnie będzie wymagał modyfikacji, wolałbym raczej jawnie utworzyć moje tabele tymczasowe, wraz ze wszystkimi potrzebnymi ograniczeniami.
Nie możesz łatwo stwierdzić, która sesja lub procedura utworzyła te tabele. Dzieje się tak, ponieważ jeśli ta sama procedura składowana jest wykonywana jednocześnie przez kilka procesów, aparat bazy danych musi mieć możliwość rozróżnienia tych samych tabel utworzonych przez różne procesy. Aparat baz danych robi to, dodając wewnętrznie przyrostek liczbowy z lewej strony do każdej lokalnej nazwy tabeli tymczasowej. Pełna nazwa tabeli tymczasowej przechowywana w widoku sys.objects w bazie danych TempDB składa się z nazwy tabeli określonej w instrukcji CREATE TABLE
oraz z przyrostka liczbowego wygenerowanego przez system. Aby umożliwić użycie sufiksu, nazwa tabeli określona dla lokalnej nazwy tymczasowej musi mieć mniej niż 116 znaków.
W przypadku lokalnych tabel tymczasowych uzyskuje się porządek; są automatycznie usuwane, gdy wychodzą poza zakres, chyba że jawnie usuwane przy użyciu DROP TABLE
. Ich zakres jest bardziej obszerny niż zmienna tabelowa, więc nie ma problemów z odwoływaniem się do nich w ramach partii lub w dynamicznym języku SQL. Lokalne tabele tymczasowe są usuwane automatycznie po zakończeniu bieżącej sesji lub procedury. Porzucenie go na końcu procedury, która go utworzyła, może spowodować zarysowanie głowy: lokalna tabela tymczasowa, która jest tworzona w ramach procedury składowanej lub sesji, jest usuwana po jej zakończeniu, więc nie może się do niej odwoływać proces, który wywołał procedurę składowaną, która stworzył tabelę. Mogą się jednak do niej odwoływać wszelkie zagnieżdżone procedury składowane wykonywane przez procedurę składowaną, która utworzyła tabelę. Jeśli zagnieżdżona procedura odwołuje się do tabeli tymczasowej i istnieją w tym czasie dwie tabele tymczasowe o tej samej nazwie, dla której tabeli jest rozwiązywane zapytanie?
Jako ciekawostka, możesz również utworzyć lokalne tymczasowe procedury składowane za pomocą taki sam zakres i okres istnienia jak lokalna tabela tymczasowa. Nie możesz zrobić tego samego z innymi procedurami.
Globalne tabele tymczasowe.
Podobnie jak lokalne tabele tymczasowe, globalne tabele tymczasowe (zaczynają się od ##) są automatycznie usuwane po zakończeniu sesji, która utworzyła tabelę: Jednak ponieważ tabele globalne nie są prywatne dla procesu, który go utworzył, muszą trwać później do ostatniej instrukcji języka Transact-SQL, która aktywnie odwoływała się do tabeli w momencie zakończenia sesji tworzenia i usunięcia blokad. Każdy, kto ma dostęp do bazy danych TempDB w czasie istnienia tych globalnych tabel tymczasowych, może bezpośrednio wysyłać zapytania, modyfikować lub usuwać te obiekty tymczasowe.
Możesz powiązać reguły, wartości domyślne i indeksy z tabelami tymczasowymi, ale nie możesz tworzyć widoków na tabelach tymczasowych lub skojarz z nimi wyzwalacze. Możesz użyć typu danych zdefiniowanego przez użytkownika podczas tworzenia tabeli tymczasowej tylko wtedy, gdy typ danych istnieje w TempDB
Procedury składowane mogą odwoływać się do tabel tymczasowych, które są tworzone podczas bieżącej sesji. W ramach procedury składowanej nie można utworzyć tabeli tymczasowej, usunąć jej, a następnie utworzyć nową tabelę tymczasową o tej samej nazwie.
Chociaż to działa….
… to nie działa. t
1
2
3
4
5
6
7
8
9
10
11
12
|
UTWÓRZ PROCEDURĘ MisbehaviourWithTemporaryTables AS
UTWÓRZ table #Color (
Color varchar (10) klawisz PRIMARY)
INSERT INTO # color SELECT „Red” UNION SELECT „White”
UNION SELECT „zielony „UNION SELECT” Żółty „UNION SELECT” niebieski „
DROP TABLE #color
CREATE table #Color (
Color varchar (10) klawisz PRIMARY)
INSERT INTO #color SELECT „Red” UNION SELECT „White”
UNION SELECT „zielony „UNION SELECT” Żółty „UNION SELECT„ niebieski ”
DROP TABLE # color
go
|
Korzystając z lokalnych tabel tymczasowych, można w niezamierzony sposób wymusić ponowną kompilację procedury składowanej za każdym razem, gdy jest ona używana. Nie jest to dobre, ponieważ jest mało prawdopodobne, aby procedura składowana działała dobrze. Aby uniknąć ponownej kompilacji, unikaj odwoływania się do tabeli tymczasowej utworzonej w wywoływanej lub wywoływanej procedurze składowanej: Jeśli nie możesz tego zrobić, umieść odwołanie w ciągu, który jest następnie wykonywany za pomocą EXECUTE
lub sp_ExecuteSQL
procedura składowana. Upewnij się również, że tabela tymczasowa została utworzona w procedurze składowanej lub wyzwalaczu, zanim zostanie przywołana i usunięta po tych odwołaniach.Nie twórz tymczasowej tabeli w instrukcji kontroli przepływu, takiej jak IF... ELSE
lub WHILE
.
Możesz tworzyć globalne tymczasowe procedury składowane, ale jeszcze nie znalazłem dla nich zastosowania. Globalne funkcje tymczasowe są niedozwolone.
Wnioski
Na każdym wspólnym placu zabaw bardzo uważaj, jak wymachujesz kijem. Czytając to, zdałeś sobie sprawę, że w TempDB dzieje się wiele działań i możesz spowodować spustoszenie w całym SQL Server, używając długotrwałych procesów, które wypełniają tabele tymczasowe, niezależnie od ich typu, niepotrzebnymi ilościami dane. Właściwie w tym artykule dałem Ci wskazówki, jak naprawdę, naprawdę zdenerwować swojego administratora baz danych przez bezmyślne wykorzystanie tego cennego współdzielonego zasobu, TempDB. (W dawnych czasach przed S2005, używanie SELECT INTO
z ogromnym stołem było świetną bronią w kształcie litery V (Vergeltungswaffe).
Zawsze uważam uogólniona rada, ale zawsze wolę, aby moje bazy danych korzystały ze zmiennych tabeli i TVP, gdzie tylko jest to możliwe. Wymagają one mniej zasobów i jest mniej prawdopodobne, że będziesz ich trzymać, gdy skończysz z nimi. Lubię ich używać maksymalnie , z kontrolami i ograniczeniami dla kolumn i tabel. Może się zdarzyć, że zabraknie im pary, zwłaszcza gdy rozmiary tabel stają się większe. W takich przypadkach lub gdy nie jest praktyczne użycie zmiennych tabeli ze względu na ich ograniczony zakres, wtedy Użyję lokalnych tabel tymczasowych. Potrzeba wielu zaciśniętych ust i potrząsania głową, zanim zgodzę się na globalny stół tymczasowy lub trwały stół tymczasowy. Mają kilka ważnych i całkowicie rozsądnych zastosowań, ale polegają na programista, aby wykonać niezbędne porządki