Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
Sterta to tabela bez indeksu klastrowanego. Na tabelach przechowywanych jako sterta można utworzyć jeden lub więcej indeksów nieklastrowanych. Dane są przechowywane w stercie bez określonej kolejności. Zazwyczaj dane są początkowo przechowywane w kolejności wstawiania wierszy. Jednakże silnik bazy danych może przenosić dane na stercie w celu optymalnego przechowywania wierszy. W wynikach zapytania nie można przewidzieć kolejności danych. Aby zagwarantować kolejność wierszy zwracanych ze sterta, użyj klauzuli ORDER BY . Aby określić stałą kolejność logiczną do przechowywania wierszy, utwórz indeks klastrowany w tabeli, tak aby tabela nie jest stertą.
Note
Czasami istnieją dobre powody, aby pozostawić tabelę jako kopiec zamiast tworzenia indeksu klastrowanego, ale efektywne korzystanie z kopców jest zaawansowaną umiejętnością. Większość tabel powinna mieć starannie wybrany indeks klastrowany, chyba że istnieje dobry powód pozostawienia tabeli jako heap.
Kiedy należy używać sterta
Sterta jest idealna dla tabel, które są często obcinane i ponownie ładowane. Silnik bazy danych optymalizuje przestrzeń w stercie, wypełniając najwcześniejsze dostępne miejsce.
Rozważ następujące kwestie:
- Lokalizowanie wolnego miejsca na stercie może być kosztowne, zwłaszcza jeżeli dokonano wielu usunięć lub aktualizacji.
- Indeksy klastrowane zapewniają stałą wydajność tabel, które nie są często obcinane.
W przypadku tabel, które są regularnie obcinane lub ponownie tworzone, takie jak tabele tymczasowe lub przejściowe, użycie sterty jest często bardziej wydajne.
Wybór między użyciem sterta a indeksem klastrowanym może znacząco wpłynąć na wydajność i wydajność bazy danych.
Gdy tabela jest przechowywana jako sterta, poszczególne wiersze są identyfikowane przez odwołanie do 8-bajtowego identyfikatora wiersza (RID) składającego się z numeru pliku, numeru strony danych i miejsca na stronie (FileID:PageID:SlotID). ID wiersza jest niewielką i wydajną strukturą.
Steraty mogą być używane jako tabele przejściowe dla dużych, nieurządkowanych operacji wstawiania. Ponieważ dane są wstawiane bez wymuszania ścisłej kolejności, operacja wstawiania jest zwykle szybsza niż równoważne wstawianie do indeksu klastrowanego. Jeśli dane sterta zostaną odczytane i przetworzone w ostatecznym miejscu docelowym, może być przydatne utworzenie wąskiego indeksu nieklastrowanego, który obejmuje predykat wyszukiwania używany przez zapytanie.
Note
Dane są pobierane ze stosu według stron danych, ale niekoniecznie w kolejności ich wstawiania.
Czasami specjaliści ds. danych używają również stertów, gdy dane są zawsze dostępne za pośrednictwem indeksów nieklastrowanych, a identyfikator RID jest mniejszy niż klucz indeksu klastrowanego.
Jeśli tabela jest stertą i nie ma żadnych indeksów nieklastrowanych, cała tabela musi być odczytywana (skanowanie tabeli), aby znaleźć dowolny wiersz. Program SQL Server nie może bezpośrednio wyszukać identyfikatora RID na stercie. To zachowanie może być akceptowalne, gdy tabela jest mała.
Kiedy nie należy używać stert
Nie używaj sterta, gdy dane są często zwracane w kolejności posortowanej. Indeks klastrowany w kolumnie sortowania może uniknąć operacji sortowania.
Nie używaj sterta, gdy dane są często grupowane razem. Dane muszą być sortowane przed grupowaniem, a indeks klastrowany w kolumnie sortowania może uniknąć operacji sortowania.
Nie używaj sterty, gdy zakresy danych są często odpytywane z tabeli. Indeks klastrowany w kolumnie zakresu pozwala uniknąć sortowania całego stosu.
Nie używaj sterta, gdy nie ma indeksów nieklastrowanych, a tabela jest duża. Jedynym zastosowaniem tej konstrukcji jest zwrócenie całej zawartości tabeli bez określonej kolejności. W stercie silnik bazy danych odczytuje wszystkie wiersze, aby znaleźć dowolny wiersz.
Nie używaj sterta, jeśli dane są często aktualizowane. Jeśli zaktualizujesz rekord, a aktualizacja używa większej ilości miejsca na stronach danych niż obecnie używane, rekord musi zostać przeniesiony na stronę danych, która ma wystarczającą ilość wolnego miejsca. Spowoduje to utworzenie przekazanego rekordu wskazującego nową lokalizację danych, a wskaźnik przekazywania musi zostać zapisany na stronie, która przechowywała te dane wcześniej, aby wskazać nową lokalizację fizyczną. Wprowadza to fragmentację sterty. Gdy silnik bazy danych skanuje stertę, podąża za tymi wskaźnikami. Ta akcja ogranicza wydajność odczytu z wyprzedzeniem i może spowodować naliczenie dodatkowych operacji we/wy, co zmniejsza wydajność skanowania.
Zarządzanie stertami
Aby utworzyć stertę, utwórz tabelę bez indeksu klastrowanego. Jeśli tabela ma już indeks klastrowany, usuń indeks klastrowany, aby przywrócić tabelę do sterty.
Aby usunąć stertę, utwórz indeks klastrowany na stercie.
Aby odbudować stertę i odzyskać zmarnowane miejsce:
- Utwórz indeks klastrowany na stercie, a następnie usuń ten indeks klastrowany.
- Użyj polecenia
ALTER TABLE ... REBUILD, aby odbudować stertę.
Warning
Tworzenie lub usuwanie indeksów klastrowanych wymaga ponownego zapisania całej tabeli. Jeśli tabela ma indeksy nieklastrowane, wszystkie indeksy nieklastrowane muszą być ponownie tworzone za każdym razem, gdy indeks klastrowany zostanie zmieniony. W związku z tym zmiana z sterty danych na strukturę indeksu klastrowanego lub z powrotem może zająć dużo czasu i wymagać miejsca na dysku do zmiany kolejności danych w bazie tymczasowej tempdb.
Identyfikowanie sterty
Poniższe zapytanie zwraca listę stert z bieżącej bazy danych. Lista zawiera:
- Nazwy tabel
- Nazwy schematu
- Liczba wierszy
- Rozmiar tabeli w KB
- Rozmiar indeksu w kb
- Nieużywane miejsce
- Kolumna identyfikująca stertę
SELECT t.name AS 'Your TableName',
s.name AS 'Your SchemaName',
p.rows AS 'Number of Rows in Your Table',
SUM(a.total_pages) * 8 AS 'Total Space of Your Table (KB)',
SUM(a.used_pages) * 8 AS 'Used Space of Your Table (KB)',
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS 'Unused Space of Your Table (KB)',
CASE
WHEN i.index_id = 0
THEN 'Yes'
ELSE 'No'
END AS 'Is Your Table a Heap?'
FROM sys.tables t
INNER JOIN sys.indexes i
ON t.object_id = i.object_id
INNER JOIN sys.partitions p
ON i.object_id = p.object_id
AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a
ON p.partition_id = a.container_id
LEFT JOIN sys.schemas s
ON t.schema_id = s.schema_id
WHERE i.index_id <= 1 -- 0 for Heap, 1 for Clustered Index
GROUP BY t.name,
s.name,
i.index_id,
p.rows
ORDER BY 'Your TableName';
Struktury kopców
Sterta to tabela bez indeksu klastrowanego. Sterty mają jeden wiersz w sys.partitions, z index_id = 0 dla każdej partycji używanej przez stertę. Domyślnie sterta ma jedną partycję. Gdy sterta ma wiele partycji, każda partycja ma strukturę sterty zawierającą dane dla tej konkretnej partycji. Na przykład, jeśli sterta ma cztery partycje, istnieją cztery struktury sterty; jedna w każdej partycji.
W zależności od typów danych w stercie każda struktura sterty będzie zawierać co najmniej jedną jednostki alokacji do przechowywania danych dla określonej partycji i zarządzania nimi. Co najmniej każda sterta będzie mieć jedną IN_ROW_DATA jednostkę alokacji na partycję. Sterta będzie zawierać również jedną jednostkę alokacji LOB_DATA na każdą partycję, jeśli zawiera kolumny dużych obiektów (LOB). Będzie również mieć jedną ROW_OVERFLOW_DATA jednostkę alokacji na partycję, jeśli zawiera kolumny o zmiennej długości przekraczające limit rozmiaru wiersza 8060 bajtów.
Kolumna first_iam_page w widoku systemu sys.system_internals_allocation_units wskazuje pierwszą stronę IAM w łańcuchu stron IAM, które zarządzają przestrzenią przydzieloną do sterty w określonej partycji. Program SQL Server używa stron "IAM" do przechodzenia przez stertę. Strony danych i wiersze w nich nie są w żadnej określonej kolejności i nie są połączone. Jedynym logicznym połączeniem między stronami danych są informacje zarejestrowane na stronach IAM.
Important
sys.system_internals_allocation_units Widok systemowy jest zarezerwowany tylko do użytku wewnętrznego programu SQL Server. Zgodność w przyszłości nie jest gwarantowana.
Skany tabel lub odczyty szeregowe sterta mogą być wykonywane przez skanowanie stron IAM w celu znalezienia zakresów, które zawierają strony sterta. Ponieważ IAM reprezentuje zakresy w tej samej kolejności, w jakiej istnieją w plikach danych, oznacza to, że sekwencyjne skanowanie sterty postępuje kolejno przez każdy plik. Użycie stron IAM do ustawienia sekwencji skanowania oznacza również, że wiersze ze stosu nie są zwykle zwracane w kolejności, w której zostały wstawione.
Na poniższej ilustracji pokazano, jak Silnik bazy danych SQL Server używa stron IAM do pobierania wierszy danych z segmentu danych pojedynczej partycji.
Powiązana zawartość
STWÓRZ INDEKS (Transact-SQL)
UPUŚĆ INDEKS (Transact-SQL)
Indeksy klastrowane i nieklastrowane opisane