Przechowywanie danych dziesiętny jako zmienna długość

The decimal and numeric data types are typically stored on the disk as fixed-length data.The numeric data type is functionally equivalent to the decimal data type.W SQL Server 2005 Z dodatkiem usługa Pack 2 (SP2) i nowsze wersje decimal i numeric typy danych mogą być przechowywane jako kolumna o zmiennej długości, korzystając z formatu magazynu vardecimal. Jest dostępna tylko w formacie przechowywania vardecimal SQL Server Wersje Enterprise Developer i oceny.

Uwaga

This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature. Użyj kompresji wiersz i strona.Aby uzyskać więcej informacji zobaczCreating Compressed Tables and Indexes.

Uwaga

Vardecimal jest format przechowywania, nie jest typ danych.

Format przechowywania vardecimal może znacznie zmniejszyć rozmiar magazynu danych, ale powoduje dodania niewielki obciążeniu PROCESORA.Format przechowywania vardecimal jest stosowany poziom tabela.Oznacza to, że nie można przechowywać niektórych decimal kolumny tabela w formacie przechowywania vardecimal, a nie innych kolumn. The decimal data remains an exact data type.

Po włączeniu vardecimal formacie przechowywania w tabela, decimal dane są przechowywane w danych, indeksu i stron dzienników w formacie przechowywania vardecimal. Zmienianie formatu magazynu jest operacją trybu offline.W tabela, który jest modyfikowany jest zablokowany wyłącznie na czas trwania operacji i jest niedostępna dla jednoczesnych odczytu lub zapisu.

Implementacja w formacie Vardecimal magazynu

W zależności od precyzji kolumna (1-38) przechowywanie decimal pobiera wartość między 5 a 17 bajtów. Jeśli tabela nie jest używany format przechowywania vardecimal, każdy zapis w tabela zużywa taką samą liczbę bajtów na zdefiniowaniu każdego dziesiętną kolumna, nawet wtedy, gdy wartość wiersza wynosi 0, wartość NULL, lub niektóre wartość, która może być wyrażone w mniejszą liczbę bajtów, takie jak numer 3.Gdy tabela jest przechowywany w formacie przechowywania vardecimal, decimal kolumny każdego wiersza zużywają miejsce wymagane do zawierają pod warunkiem, że numer, plus 2 bajty obciążenie. Wynik jest zawsze pomiędzy 20 i 5 bajtów.Obejmuje to 2 bajty pośrednich kosztów do przechowywania wartości przesunięcia.Jednak wartości null i zer są traktowane jako specjalnie i podjąć tylko 2 bajtów.

Jeśli w tabela nie ma żadnych kolumn o zmiennej długości, to dodatkowe obciążenie 2 bajtów w wierszu do przechowywania liczby kolumn o zmiennej długości.Jeśli tabela ma już co najmniej jedną kolumna o zmiennej długości, nie istnieje żadne dodatkowe obciążenie.

W poniższej tabela przedstawiono liczbę bajtów, które są wymagane do przechowywania danych dziesiętne w regularnych stały format, a maksymalna liczba bajtów, które są wymagane do przechowywania danych dziesiętnego w formacie przechowywania vardecimal.Po tabela są przechowywane w stałym formacie, zostanie użyta wartość, jest na liście, dla każdego wiersza.Gdy tabela jest przechowywany w formacie przechowywania vardecimal, mniejsza niż liczba bajtów, które ma na liście wymaga wielu wartości.

Precyzję kolumna

Oryginał stała dziesiętna rozmiar (bajty)

Obszar danych vardecimal maksymalny (bajty)

Obciążenie do przechowywania przesunięcie (bajty)

Używane vardecimal maksymalnej pamięci (bajty)

1-3

5

3

2

5

4-6

5

4

2

6

7-9

5

5

2

7

10-12

9

6

2

8

13-15

9

8

2

10

16-18

9

9

2

11

19

9

10

2

12

20-21

13

10

2

12

22-24

13

11

2

13

25-27

13

13

2

15

28

13

14

2

16

29-30

17

14

2

16

31-33

17

15

2

17

34-36

17

16

2

18

37-38

17

18

2

20

Przy użyciu formatu Vardecimal magazynu

Można użyć formatu magazynu vardecimal, próbując rozwiązać następujące problemy:

  • Brak miejsca na dysku jest za mała.

  • Dostęp do dysku (We/Wy) jest wąskiego gardła na wydajność systemu.

  • Wysoki poziom dokładności musi być dla niektórych danych, mimo że wiele wartości są małe, wartość NULL lub 0 (na przykład w magazynie danych z tabela decimal kolumna, która ma wiele wierszy, które zawierają wartości 0 lub liczba całkowita).

Zmiana formatu magazynowania tabela wymaga magazynowania tabela (indeks klastrowany lub sterty) wymagają przebudowania.Jeżeli indeks klastrowany tabela zawiera decimal kolumna, również musi wymagają przebudowania wszystkich ponownego zbudowania indeksów nie klastrowanych, ponieważ zawierają wartości klucz klastrowanego. Jeśli nie ma indeks klastrowany decimal kolumny, ponownego zbudowania indeksów nie klastrowanych są przebudowywane, jeżeli zawierają one decimal Kolumna. Jeśli tabela jest sterty (to znaczy nie ma indeks klastrowany), wszystkie ponownego zbudowania indeksów nie klastrowanych musi być ponownie wskaż nowych lokalizacji wiersza w stosie.

Odbudowywanie tabela, aby włączyć lub wyłączyć format przechowywania vardecimal mogą wymagać więcej niż podwójny odstęp całkowitej pamięci masowej oryginalnej tabela.Jeśli tabela nie zawiera decimal lub numeric kolumny, włączanie formacie przechowywania vardecimal jest tylko operacją metadane. Partie dziennik aktywności się spodziewać po tabela i indeksy są przebudowywane.

Vardecimal magazynowania format mogą być używane do plik obu tylko do odczytu i zapisu i odczytu tabel.Oszczędności magazynu musi być zrównoważone przed dodatkowe użycie PROCESORA, wymaganego do konwersji na format przechowywania wierszy za każdym razem, są one dostępne.Ponadto zapisu w tabela, która korzysta z vardecimal formacie przechowywania może zmniejszyć wydajność ze względu na zwiększenie liczby podziałów strona.

Ograniczenia w formacie Vardecimal magazynu

Obowiązują następujące ograniczenia:

  • Wymaga SQL Server 2005 Z dodatkiem SP2 lub nowszym.

  • Format przechowywania Vardecimal nie może być włączone w bazach danych systemu: wzorzec, modelu, msdb, tempdb lub dystrybucji. Gdy kwerendy sortuje dane, które są przechowywane w formacie przechowywania vardecimal, dane są sortowane w tempdb w stanie stała dziesiętna.Zazwyczaj dane wymaga znacznie więcej miejsca w tempdb niż miejsce zajmowane przez w tabela źródłowej vardecimal przechowywania formatu w źródłowej bazie danych.

  • Format przechowywania Vardecimal nie mogą być zastosowane do widoków, indeksowania widoków, indeksów XML i indeksy pełnotekstowe.Jednak tabele, które opierają się te obiekty, można użyć formatu magazynu vardecimal.

  • Wewnętrzny tabele, takich jak metadane i tablic powiadomienie, nie może użyć formatu magazynu vardecimal.

  • Wycenione tabela funkcji nie można użyć formatu magazynu vardecimal.

  • The numeric kolumna that is stored in a vardecimal storage format tabela cannot also be encrypted.

  • Partycje heterogenicznych (oznacza to, środka dziesiętny format i vardecimal magazynu format partycje) nie są obsługiwane.

  • Nowe tabele, które są tworzone na podstawie tabela format przechowywania vardecimal przy użyciu Transact-SQL Składnia INTO… … SELECT nie dziedziczą format przechowywania vardecimal.

  • Bazy danych, które są włączone dla dublowanie bazy danych nie może być ich stanów format przechowywania vardecimal zmienione.Należy usunąć dublowanie bazy danych umożliwiające vardecimal formacie przechowywania w bazie danych.Jednakże nie trzeba usunąć dublowanie, kiedy poszczególne tabele są włączone lub wyłączone dla formatu magazynu vardecimal bazy danych.

  • SQL Server musi być w stanie zagwarantować powiedzie wszystkie aktualizacje i tabela zawsze mogą być zwracane do formatu dziesiętnego stałych.Dlatego tabela nie można zmienić format przechowywania vardecimal Jeśli dodatkowe obciążenie powoduje, że istniejącego wiersza przekracza 8060 bajtów lub istniejącej wartości indeksu przekraczać 900 bajtów.

    Uwaga

    Vardecimal storage format differs from variable text (varchar) storage in that SQL Server lets you create a row that could exceed 8060 bytes if all variable columns are at the maximum size.SQL Server enforces the 8060-byte limit when text data is inserted or updated.SQL Server does not let you create a set of decimal columns that could ever exceed the 8060 byte limit for a row.Limit 8060 bajtów jest wymuszane w przypadku format tabela zostanie zmieniony na vardecimal magazynowania.

  • Podczas transferu bazy danych za pomocą metoda odłączania i dołączania kreatora kopiowania baz danych, Operacja dołączania zakończy się niepowodzeniem, jeśli obiekt obiekt docelowy Database Engine nie jest SQL Server 2005 Z dodatkiem SP2 lub nowszej. The SQL Server Management Objects metoda will create the new database and tables without using the vardecimal storage format. Bazy danych i tabele można zmienić format vardecimal po przeniesieniu, gdy Database Engine jest SQL Server 2005 Z dodatkiem SP2 lub nowszej.

kopia zapasowa i odzyskiwanie, dublowanie bazy danych, sp_attach_db i dostawy dziennika

kopia zapasowa i odzyskiwanie, dublowanie bazy danych, sp_attach_db i wysyłanie dziennika działają poprawnie z formatu magazynu vardecimal; jednak dołączyć bazę danych, która korzysta z magazynu vardecimal sformatować, każde wystąpienie SQL Server musi zostać uaktualniony do co najmniej SQL Server 2005 Z DODATKIEM SP2. Na przykład, nie możesz przywracanie kopia zapasowa dziennika dziennika bazy danych włączone dla formatu magazynu vardecimal do bazy danych, która nie jest włączona lub dublowania z bazy danych dla formatu magazynu vardecimal do bazy danych, która nie jest włączona lub dołączania bazy danych włączone do formatu magazynu vardecimal można włączyć włączone SQL Server 2005 Dodatek SP2 do wcześniejszej wersja programu SQL Server. Jeżeli przywrócić pełna kopia zapasowa bazy danych dla formatu magazynu vardecimal do bazy danych, która nie jest włączona dla formatu magazynu vardecimal włączone, bazy danych będzie stają się dostępny dla formatu magazynu vardecimal.

Po zmianie tabela do formatu magazynu vardecimal zachowuje ważność w łańcuchu kopii zapasowych dziennika i bazy danych mogą być przywracane przy zastosowaniu ostatniej pełnej kopia zapasowa dziennika oraz łańcuch prawidłowego dziennika.Aby uniknąć tworzenia kopii zapasowych, które nie są prawidłowe, należy zmienić bazę danych na prostej model odzyskiwanie przed przystąpieniem do modyfikacji dowolnej tabela, aby usunąć format przechowywania vardecimal.Po usunięciu formatu magazynu vardecimal dowolnej tabela, należy utworzyć wykonać pełną kopię zapasową bazy danych.

Przy użyciu formatu magazynu Vardecimal dublowanie bazy danych

Poniższe procedury zawierają instrukcje dla przy użyciu formatu magazynu vardecimal z dublowanie bazy danych.

Aby użyć formatu magazynu vardecimal z dublowanie bazy danych

  1. Przenieść główny i dublowanie partner wystąpienia co najmniej SQL Server 2005 Z DODATKIEM SP2.

  2. Jeśli aktualnie za pomocą dublowania bazy danych, Usuń dublowanie bazy danych i delete partner dublowania.Aby uzyskać więcej informacji zobaczHow to: Remove Database Mirroring (Transact-SQL).

  3. Włącz vardecimal formacie przechowywania w głównej bazie danych (Jeśli baza danych znajduje się na SQL Server 2005) i upewnij się, że główna baza danych znajduje się w model pełnego odzyskiwanie.

  4. Ustalenie dublowanie bazy danych dzięki przy użyciu pełnego i rejestrować kopie zapasowe z główna baza danych.Aby uzyskać więcej informacji zobaczJak Ustalenie lustrzane sesja za pomocą uwierzytelnianie systemu Windows (języka Transact-SQL) bazy danych.

  5. Modyfikowanie poszczególnych tabel, należy użyć formatu magazynu vardecimal.

Uwaga

Nie trzeba usunąć dublowanie, aby zmienić format przechowywania pojedynczych tabel bazy danych.

Aby usunąć format przechowywania vardecimal

  1. Modyfikowanie tabel w bazie danych głównych, usuń format przechowywania vardecimal.

  2. Usuwanie dublowanie bazy danych.

  3. Ustaw tryb odzyskiwanie proste główna baza danych.To spowoduje przerwanie łańcuch dzienników.

  4. Jeśli baza danych znajduje się na SQL Server 2005, wyłączyć format przechowywania vardecimal główna baza danych.

  5. Usuwanie dublowania bazy danych partner.

  6. Zmiana główna baza danych do trybu pełnego odzyskiwanie.

  7. tworzyć kopię zapasową główna baza danych i ponownie ustanowić dublowanie bazy danych.

Skutki formatu magazynu Vardecimal dla operacji replikacja

Replikacja w zwykły sposób działa na tabele, które używają formatu magazynu vardecimal, ale następujące kwestie:

  • decimal typy danych przechowywane w formacie przechowywania vardecimal są konwertowane na dziesiętny format ustalony dla transferu podczas replikacja.baza danych dystrybucji nie można włączyć dla formatu magazynu vardecimal.W związku z tym dane nie są przechowywane w formacie vardecimal magazynu, gdy jest on przechowywany w tabelach replikacja baza danych dystrybucji.Na subskrybent, rekordy dziennika są zwykle stosowane.

  • Vardecimal magazynowania format tabeli mogą być replikowane do tabeli ustalony format dziesiętny, a tabela ustalony format dziesiętny mogą być replikowane do przechowywania vardecimal format tabeli.

  • Proces tworzenia tabela związanych z nową subskrypcję nie zostanie utworzony przy użyciu formatu magazynu vardecimal tabel.Dzięki temu replikacja się powiodła, niezależnie od poziom dodatku usługa pack Database Engine, lub stanu formatu włączone przechowywanie vardecimal subskrybowanie bazy danych. Subskrybowanie tabela może być włączona dla formatu magazynu vardecimal subskrybent po utworzeniu tabela lub zmieniając skryptów tworzenia, przed ich stosowania.

W poniższej tabela opisano wymagania skryptu dla poszczególnych subskrybentów.

Subskrybent

Skrypt

SQL Server 2000 lub SQL Server w wersja 7.0

Skrypty tworzenia tabela można użyć bez modyfikacji.

SQL Server 2005, bazy danych nie jest oznaczony do formatu magazynu vardecimal.

Skrypty tworzenia tabela można użyć bez modyfikacji.

SQL Server 2005, baza danych jest oznaczony do formatu magazynu vardecimal, ale nie ma w tabela subskrybent format przechowywania vardecimal włączone.

Skrypty tworzenia tabela można użyć bez modyfikacji.

SQL Server 2005, baza danych jest oznaczony do formatu magazynu vardecimal, a użytkownik chce SQL Server 2005 Tabela subskrybent miały format przechowywania vardecimal włączone.

Skrypty tworzenia tabela mogą być modyfikowane, można włączyć formacie vardecimal przechowywania w bazie danych i włączyć formacie przechowywania vardecimal tabel.Lub abonenta bazy danych i tabele można włączyć za pomocą procedur przechowywanych, które są opisane w sekcji „ Włączanie Vardecimal Magazyn Format „ znajdujący się.

Dodatkowe zagadnienia

Poniżej przedstawiono listę dodatkowych zagadnień, należy pamiętać podczas pracy w formacie przechowywania vardecimal:

  • Format przechowywania vardecimal ma nie zbiorczej efekt importowania i eksportowania)BCP) operacje.

  • Funkcja DŁUGOŚĆ_DANYCH nie wykrywa vardecimal formatu magazynu i zwraca liczbę bajtów, które mogą być przechowywane w stałym formacie dziesiętnym.

  • W rzadkich przypadkach uniemożliwi vardecimal format przechowywania SQL Server Używanie planu kwerend, który został optymalne dla stała dziesiętna dane.

  • Format przechowywania vardecimal mogą być używane z dowolnego poziom zgodności bazy danych.

  • Jeśli tabela nie ma kolumn z decimal lub numeric Typ danych, kiedy wykonywana jest sp_tableoption, zmiany metadane tabeli oznacza, że w tabeli używany jest format przechowywania vardecimal. Gdy nowe decimal kolumny są dodawane później będą przechowywane w formacie vardecimal magazynowania. Potrzebne są nie specjalne techniki Dodawanie lub usuwanie kolumn z tabela, która jest w formacie vardecimal magazynowania.

Włączanie w formacie Vardecimal magazynu

Aby włączyć lub zmienić vardecimal format magazynu wymaga następujących uprawnień:

  • Aby włączyć vardecimal formacie przechowywania w bazie danych wymaga instrukcji ALTER DATABASE na serwerze.

  • Aby zmienić tabela vardecimal formatu magazynu wymaga uprawnień ALTER w tabela.

Przed włączeniem vardecimal formatu magazynu należy najpierw sprawdzić, czy w tabela zostanie zmniejszony, po włączeniu vardecimal formatu magazynu.Jeśli precyzji kolumna zdefiniowane jest wymagane dla większości wierszy, obciążenie, które jest skojarzone z formatu magazynu vardecimal może być dłuższa niż oszczędności i może skutkować większą tabela.Aby oszacować zmniejszenie rozmiaru wiersza, przed przystąpieniem do modyfikacji w tabela, należy użyć sp_estimated_rowsize_reduction_for_vardecimal procedura przechowywana.If you decide to change the storage format of the table, enable the database for vardecimal storage format, and then enable individual tables for the vardecimal storage format.SQL Server 2008 databases do not have to be enabled for the vardecimal storage format.

W SQL Server 2008 Baza danych, można włączyć vardecimal format przechowywania decimal typy danych przy użyciu procedury przechowywane lub SQL Server Management Studio:

  • Uruchamianie sp_db_vardecimal_storage_format umożliwiające formacie vardecimal przechowywania w bazie danych (Jeśli wystąpienie SQL Server jest SQL Server 2005Dodatku SP 2), a następnie uruchom sp_tableoption, aby włączyć formacie vardecimal przechowywania w odpowiednich tabelach.

  • W Management Studio, należy użyć Strona Opcje Właściwości bazy danych umożliwiające formacie vardecimal przechowywania w bazie danych.Należy użyć sp_tableoption zmienić tabela do formatu magazynu vardecimal.

Uwaga

Począwszy od SQL Server 2008, wszystkie bazy danych są włączone dla formatu magazynu vardecimal.

Identyfikowanie tabel Format Vardecimal magazynu

Aby określić, które tabele w bazie danych są w formacie vardecimal magazynu, należy użyć funkcja OBJECTPROPERTY i wyszukiwania dla właściwość TableHasVarDecimalStorageFormat.

W poniższym przykładzie są zwracane 1 Jeśli Production.WorkOrderRouting w tabela formacie vardecimal magazynowania, a 0 Jeśli tak nie jest dostępne.

USE AdventureWorks ;
GO
SELECT OBJECTPROPERTY(OBJECT_ID('Production.WorkOrderRouting'), 
   'TableHasVarDecimalStorageFormat') ;
GO

Następujące wyszukiwania przykład AdventureWorks Baza danych dla wszystkich tabel, które używają formatu magazynu vardecimal.

USE AdventureWorks ;
GO
SELECT name, object_id, type_desc
FROM sys.objects 
 WHERE OBJECTPROPERTY(object_id, 
   N'TableHasVarDecimalStorageFormat') = 1 ;
GO

Usuwanie formatu magazynu Vardecimal problemów

Aby usunąć format przechowywania vardecimal z tabela, w tabela muszą wymagają przebudowania w stałym formacie dziesiętnym.Może to znacznie zwiększyć ilość miejsca na dysku, który jest używany przez w tabela.Jeśli nie ma wystarczającej ilości miejsca na dysku, operacja nie powiedzie się.W takim przypadek należy wyłączyć format przechowywania vardecimal, użytkownik powinien upewnić się, za mało miejsca na dysku, aby były dostępne dla SQL Server. Operacja rozszerzenia również wymaga tymczasowego miejsca na przechowywanie danych zarówno w vardecimal, jak i w formacie zwykłego.Jeśli tabela rozwinięte czy mieszczą się na dostępne miejsce na dysku po rozszerzenia, ale nie może rozwinąć się tylko z powodu braku miejsca na dysku tymczasowym, stopniowo Rozwiń dane, poprzez kopiowanie wierszy z tabeli do nowej tabeli unexpanded.

Aby usunąć format przechowywania vardecimal bazy danych natychmiast po jego modyfikacji, upuść bazę danych, a następnie przywracanie bazę danych z kopia zapasowa, który został utworzony przed magazynowania vardecimal sformatować włączona baza danych.

Podczas przenoszenia bazy danych z SQL Server 2005 Wydanie, Developer lub Enterprise oceny do innej edycji lub wcześniejszej wersja programu SQL Server, musisz najpierw otwórz bazę danych za pomocą jednego z wymaganych wersje, usuń format przechowywania vardecimal i następnie migracji bazy danych. Dołączanie bazy danych zawierającej formacie vardecimal przechowywania na serwerze nie kwalifikują zakończy się niepowodzeniem.