Przechowywanie danych dziesiętne jako o zmiennej długości

decimal i numeric typy danych są zazwyczaj przechowywane na dysku danych o stałej długości.numeric Typ danych jest funkcjonalnie równoważne decimal typu danych.W SQL Server 2005 Service Pack 2 (SP2) i nowsze wersje decimal i numeric typy danych mogą być przechowywane jako kolumna o zmiennej długości, przy użyciu formatu magazynu vardecimal.Jest dostępna tylko w formacie przechowywania vardecimal SQL Server wersje Enterprise, Developer i oceny.

Ostrzeżenie

Ta funkcja zostanie usunięta z przyszłej wersji programu Microsoft SQL Server. Należy unikać stosowania tej funkcji w nowych projektach oraz zaplanować modyfikację aplikacji, w których obecnie jest używana ta funkcja. Użyj kompresji wiersza i strony.Aby uzyskać więcej informacji, zobacz Tworzenie skompresowanego tabel i indeksów.

Ostrzeżenie

Vardecimal jest format przechowywania, a nie typ danych.

Format przechowywania vardecimal może znacznie zmniejszyć rozmiar magazynu danych, ale dodać niewielką ilość obciążeniu Procesora.Format przechowywania vardecimal jest stosowany poziom tabela.Oznacza to, że nie można przechowywać niektóre decimal kolumn tabela w formacie magazynu vardecimal, a nie innych kolumn.decimal Dane pozostają typu dokładne dane.

Po włączeniu format przechowywania vardecimal w tabela decimal dane są przechowywane w danych, indeks i stron dziennika w formacie magazynu vardecimal.Zmiana formatu magazynu jest operacja offline.tabela, która jest modyfikowany jest zablokowany wyłącznie na czas trwania operacji i jest niedostępna dla jednoczesnych odczytu lub zapisu.

Implementacja Format przechowywania Vardecimal

W zależności od precyzji kolumna (1-38) przechowywanie decimal zużywa wartość między 5 i 17 bajtów.Tabela nie używa formatu vardecimal, każdy wpis w tabeli zużywa taką samą liczbę bajtów dla każdego dziesiętny kolumna zdefiniowane nawet wtedy, gdy wartość wiersza jest 0, NULL, lub niektórych wartość, która może być wyrażona w mniejszej liczby bajtów, takie jak numer 3.Gdy tabela jest przechowywana w formacie przechowywania vardecimal decimal kolumn w każdym wierszu zajmują miejsce, który jest wymagany do zawierają podany numer plus 2 bajty narzutów.Wynik jest zawsze pomiędzy 5 i 20 bajtów.Obejmuje to 2 bajty narzutów do przechowywania wartości przesunięcia.Jednakże wartości null i zer traktowane są specjalnie i podjąć tylko 2 bajtów.

Jeśli tabela nie ma żadnych kolumn o zmiennej długości, istnieje dodatkowe obciążenie 2 bajtów na wiersz 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 ustalony format i maksymalną liczbę bajtów, które są wymagane do przechowywania danych dziesiętne w formacie magazynu vardecimal.Gdy tabela jest przechowywany w stałym formacie, zostanie użyta wartość, wymieniony dla każdego wiersza.Gdy tabela jest przechowywana w formacie przechowywania vardecimal, mniej niż liczba bajtów jest wymieniony wymaga wielu wartości.

Precyzję kolumny

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

Vardecimal maksymalny obszar danych (bajty)

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

Używany Magazyn vardecimal maksymalny (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

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

  • Brak brakiem miejsca na dysku.

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

  • Musi mieć wysoki poziom dokładności dla niektórych danych, mimo że wiele wartości są małe, NULL lub 0 (takich jak tabela w magazyn danych z decimal kolumna, która ma wiele wierszy, które zawierają wartości 0 lub całkowitą).

Zmiana formatu tabela wymaga magazynowania tabela (indeks klastrowany lub sterty) wymagają przebudowania.Jeżeli indeks klastrowany tabela zawiera decimal kolumna, wszystkie indeksy nieklastrowany również musi przebudowany, ponieważ zawierają one klastrowanego wartości klucz.Jeżeli indeks klastrowany nie ma decimal kolumna, jeżeli zawierają one odbudowa zbudowania indeksów nie klastrowanych decimal kolumna.Jeśli tabela jest sterty (oznacza to, że nie ma indeks klastrowany), wszystkie indeksy nieklastrowany musi przebudowany na nowe miejsca wiersza w stercie.

Odbudowywanie tabela, aby włączyć lub wyłączyć format przechowywania vardecimal może wymagać więcej niż podwójny miejsce składowania całkowitej pierwotnej tabela.Jeśli tabela nie zawiera decimal lub numeric kolumn, format Włączanie przechowywania vardecimal to tylko operacja metadane.Partie dziennik aktywności należy oczekiwać, gdy odbudowa tabela i indeksy.

Vardecimal format przechowywania mogą być używane zarówno tylko do odczytu i zapisu i odczytu tabel.Oszczędności magazynu musi zrównoważenia dodatkowych użycie Procesora, wymaganego do konwersji na format przechowywania wierszy każdego czas , do których.Ponadto zapisu w tabela, która korzysta z vardecimal format przechowywania może zmniejszyć wydajność z powodu zwiększonej liczby podziałów strona.

Ograniczenia formatu Vardecimal

Obowiązują następujące ograniczenia:

  • Wymaga SQL Server 2005 z dodatkiem SP2 lub nowszej wersji.

  • Format przechowywania Vardecimal nie może być włączone w bazy danych systemu: master, model, msdb, tempdb, or distribution.Gdy kwerenda sortuje dane przechowywane w formacie magazynu vardecimal, dane są sortowane w tempdb stałą Państwo dziesiętnej.Zazwyczaj danych będzie wymagało więcej miejsca w tempdb niż miejsce zajmowane przez tabela źródłową formatu magazynu vardecimal w źródłowa baza danych.

  • Format przechowywania Vardecimal nie może być stosowany do widoków, widoki indeksowane, indeksy 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 powiadomienie tabel, nie można użyć formatu magazynu vardecimal.

  • Oródwierszową funkcji nie można użyć formatu magazynu vardecimal.

  • numeric kolumna, która jest przechowywana w tabela format magazynu vardecimal nie można szyfrować.

  • Partycje heterogenicznych (oznacza to, że stałych dziesiętny format i vardecimal magazynu format partycje) nie są obsługiwane.

  • Nowe tabele utworzone z tabela format magazynu vardecimal za pomocą Transact-SQL Wybierz … Składnia INTO... nie dziedziczą format magazynu vardecimal.

  • Baz danych, które są włączone dla dublowanie bazy danych nie może mieć ich Państwa formatu magazynu vardecimal zmianie.Należy usunąć dublowanie bazy danych włączyć vardecimal format przechowywania bazy danych.Jednakże, nie trzeba usuwać dublowanie bazy danych po poszczególnych tabel są włączone lub wyłączone dla formatu magazynu vardecimal.

  • SQL Server musi być w stanie zagwarantować powiodą wszystkie aktualizacje i tabela zawsze mogą być zwracane do ustalony format dziesiętny.Dlatego tabela nie można zmienić formatu magazynu vardecimal, jeśli dodatkowe obciążenie powoduje istniejącego wiersza przekracza 8060 bajtów lub istniejącą wartość indeksu przekroczyła 900 bajtów.

    Ostrzeżenie

    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 wymuszany po zmianie formatu tabela do magazynu vardecimal.

  • Podczas przenoszenia bazy danych przy użyciu metoda Odłącz i Dołącz kreatora kopiowania baz danych, operacja Dołącz zakończy się niepowodzeniem, jeśli obiekt obiekt docelowy Aparat baz danych nie jest SQL Server 2005 z dodatkiem SP2 lub nowszym. SQL Server metoda obiektów zarządzania utworzy nową bazę danych i tabele bez korzystania z formatu magazynu vardecimal.Bazy danych i tabele można zmienić vardecimal format po przeniesieniu Jeśli Aparat baz danych jest SQL Server 2005 z dodatkiem SP2 lub nowszym.

Kopii zapasowych i odzyskiwania, dublowania baz danych, sp_attach_db i wysyłki dziennika

Kopii zapasowych i odzyskiwanie, dublowanie bazy danych, sp_attach_dbi wysyłanie dziennika pracy poprawnie z formatu magazynu vardecimal; Jednak aby dołączyć bazy danych, która używa programu Magazyn vardecimal format, każde wystąpienie SQL Server musi zostać uaktualniony do co najmniej SQL Server 2005 z dodatkiem SP2.Na przykład, nie przywracanie kopia zapasowa dziennika bazy danych włączone dla formatu magazynu vardecimal do bazy danych, która nie jest włączona lub dublowania z bazy danych, włączone dla formatu magazynu vardecimal do bazy danych, która nie jest włączona, lub dołączania bazy danych włączony format przechowywania vardecimal włączona z SQL Server 2005 z dodatkiem SP2 do starszej wersja programu SQL Server.Jeśli użytkownik przywracanie pełnej kopia zapasowa bazy danych, włączone dla formatu magazynu vardecimal do bazy danych, która nie jest włączona dla formatu magazynu vardecimal, baza danych zostanie stają się włączone dla formatu magazynu vardecimal.

Po tabela jest zmieniany na format przechowywania vardecimal, obowiązuje łańcuch kopia zapasowa dziennika i bazy danych można przywrócić stosując ostatniej pełnej kopia zapasowa oraz prawidłowego łańcuch dzienników.Aby zapobiec tworzenia kopii zapasowych, które nie są prawidłowe, należy zmienić bazę danych, aby model odzyskiwanie prostego przed zmodyfikowaniem dowolnej tabela, aby usunąć format magazynu vardecimal.Po usunięciu formatu vardecimal dowolnej tabela, należy utworzyć pełną bazę kopia zapasowa.

Dublowania bazy danych przy użyciu formatu Vardecimal magazynu

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

Aby użyć formatu magazynu vardecimal z bazy danychdublowanie

  1. Doprowadzić głównego zobowiązanego i lusterka wystąpień partner do co najmniej SQL Server 2005 z dodatkiem SP2.

  2. Jeśli używasz obecnie dublowanie bazy danych, usuń dublowanie bazy danych i Usuń dublowanie partner.Aby uzyskać więcej informacji, zobacz Jak Usuń dublowanie (Transact-SQL) w bazie danych.

  3. Włącz vardecimal format przechowywania dublowana baza danych (Jeśli baza danych jest na SQL Server 2005) i upewnij się, że dublowana baza danych jest w pełni model odzyskiwanie.

  4. Ustanowienie dublowanie bazy danych przez za pomocą pełnego i dziennika kopii zapasowych z dublowana baza danych.Aby uzyskać więcej informacji, zobacz Jak Ustanowienie bazy danych, dublowanie sesji za pomocą uwierzytelniania systemu Windows (Transact-SQL).

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

Ostrzeżenie

Nie trzeba usuwać dublowanie bazy danych zmienić format składowania poszczególnych tabel.

Aby usunąć format magazynu vardecimal

  1. Modyfikowanie tabel w dublowana baza danych, aby usunąć format magazynu vardecimal.

  2. Usuń dublowanie bazy danych.

  3. Ustaw tryb odzyskiwanie proste dublowana baza danych.Przerywa łańcuch dzienników.

  4. Jeśli baza danych jest na SQL Server 2005, wyłącz format przechowywania vardecimal w głównej bazie danych.

  5. Upuść bazę danych partner dublowania.

  6. Zmień dublowana baza danych tryb pełnego odzyskiwanie.

  7. Kopii zapasowej dublowana baza danych i ponownie ustanowić dublowanie bazy danych.

Efekty Format przechowywania Vardecimal operacji replikacji

Działa replikacja w zwykły sposób na tabelach korzystające z formatu magazynu vardecimal, ale następujące kwestie:

  • decimal typy danych przechowywane w formacie magazynu vardecimal są konwertowane na stały format dziesiętny transferu podczas replikacja. distribution Bazy danych nie można włączyć dla formatu magazynu vardecimal.Dlatego dane nie są przechowywane w formacie magazynu vardecimal, gdy jest przechowywane w tabelach replikacja w distribution bazy danych.Subskrybent zwykle stosowane są rekordy dziennika.

  • Magazyn vardecimal formatowanie tabela mogą być replikowane do tabela ustalony format dziesiętny i tabela ustalony format dziesiętny mogą być replikowane do tabela format magazynu vardecimal.

  • Proces tworzenia tabela związane z nowej subskrypcja nie tworzy tabele w formacie magazynu vardecimal.Umożliwia to replikacja została wykonana pomyślnie, niezależnie od poziom dodatku usługa pack Aparat baz danych, lub Państwo vardecimal magazynu włączony format bazy danych subskrypcji.Subskrybowanie tabela można włączyć dla formatu magazynu vardecimal subskrybent po utworzeniu tabela lub modyfikując skryptów tworzenia, zanim zaczną być stosowane.

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

Subskrybent

Skrypt

SQL Server 2000lub SQL Server w wersja 7.0

Tworzenie tabela skrypty mogą być używane bez modyfikacji.

SQL Server 2005, baza danych nie jest oznaczony dla formatu magazynu vardecimal.

Tworzenie tabela skrypty mogą być używane bez modyfikacji.

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

Tworzenie tabela skrypty mogą być używane bez modyfikacji.

SQL Server 2005, baza danych jest oznaczona do formatu vardecimal i ma SQL Server 2005 tabela subskrybent włączone formatu vardecimal.

Tworzenie tabela skrypty mogą zostać zmodyfikowane, włączyć vardecimal formatu bazy danych i umożliwić format przechowywania vardecimal tabel.Lub baza danych subskrybent i tabel, można włączyć przy użyciu procedury przechowywanej, które opisano w sekcji "Włączanie Vardecimal magazynu Format" występujący.

Uwagi dodatkowe

Oto lista uwagi dodatkowe pamiętać podczas pracy z formatu magazynu vardecimal:

  • Format przechowywania vardecimal nie ma wpływu import zbiorczy i wywóz (bcp) operacji.

  • Funkcja DŁUGOŚĆ_DANYCH nie wykrywać vardecimal format przechowywania i zwraca liczbę bajtów, przechowywane w tym formacie dziesiętnym.

  • W rzadkich przypadkach skaner uniemożliwi format przechowywania vardecimal SQL Server z za pomocą planu kwerend, który był optymalnej stała dziesiętna dane.

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

  • Jeśli w tabeli nie ma kolumn z decimal lub numeric Typ danych, kiedy sp_tableoption jest wykonywane, zmiany metadane tabeli oznacza, że tabela używa formatu magazynu vardecimal.Nowa decimal kolumny są dodawane później będą przechowywane w formacie magazynu vardecimal.Nie specjalne techniki są niezbędne do dodawania lub usuwania kolumn z tabela, która korzysta z formatu magazynu vardecimal.

Włączanie formatu Vardecimal

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

  • Aby włączyć vardecimal format przechowywania bazy danych wymaga ZMIEŃ bazę danych na serwerze.

  • Aby zmienić tabela vardecimal format przechowywania wymaga ZMIEŃ uprawnienia w tabela.

Przed włączeniem formatu vardecimal, należy najpierw sprawdzić, że tabela zostanie zmniejszony, gdy jest włączony format przechowywania vardecimal.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ć więcej niż oszczędności i może skutkować większą tabela.Oszacowanie redukcji rozmiar wiersza, przed zmodyfikowaniem tabela, użyj sp_estimated_rowsize_reduction_for_vardecimal procedura składowana.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 bazy danych, można włączyć formatu magazynu vardecimal decimal typu danych przy użyciu procedur przechowywanych lub SQL Server Management Studio:

  • Uruchom sp_db_vardecimal_storage_format włączyć format przechowywania vardecimal w bazie danych (Jeśli wystąpienie SQL Server jest SQL Server 2005, SP 2) i uruchom sp_tableoption, aby włączyć format przechowywania vardecimal w odpowiednich tabelach.

  • W Management Studio, użyj Stronie opcje właściwości bazy danych włączyć format przechowywania vardecimal w bazie danych.Należy użyć sp_tableoption Aby zmienić format przechowywania vardecimal tabela.

Ostrzeżenie

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

Identyfikowanie Magazyn Vardecimal formatowanie tabel

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

Poniższy przykład zwraca 1 Jeśli Production.WorkOrderRouting tabela używa formatu magazynu vardecimal i 0 w przeciwnym razie nie.

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

Następujący przykład wyszukiwania AdventureWorks2008R2 bazy danych wszystkie tabele, które używają formatu magazynu vardecimal.

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

Format przechowywania Vardecimal usuwanie problemów

Aby usunąć format przechowywania vardecimal z tabeli, tabela musi odbudowywany w ustalony format dziesiętny.Może to znacznie zwiększyć miejsce na dysku używane przez tabela.Jeśli nie ma wystarczającej ilości miejsca na dysku, operacja nie powiedzie się.W tym przypadek, aby wyłączyć format przechowywania vardecimal, należy się upewnić że miejsca na dysku jest dostępna do SQL Server.Operacja rozszerzenia wymaga również tymczasowego miejsca do przechowywania danych w vardecimal i regularne format.Jeśli byłyby rozszerzonej tabela dopasowanie dostępnego miejsca na dysku po ekspansji ale niepowodzeniem rozwinąć tylko z powodu braku tymczasowego miejsca na dysku, można rozwinąć dane stopniowo poprzez kopiowanie wierszy tabela do nowej tabela nierozwinięta.

Aby usunąć format przechowywania vardecimal z bazy danych natychmiast po jego modyfikacji, upuść bazę danych, a następnie przywracanie bazę danych z kopia zapasowa wykonanej przed Magazyn vardecimal format bazy danych włączony.

Podczas przesuwania bazy danych z SQL Server 2005 edition Enterprise, Developer lub oceny do innej wersja lub starszej wersja programu SQL Server, należy najpierw otworzyć bazę danych przy użyciu jednego z wymaganych wersje, usuń format przechowywania vardecimal i następnie przeprowadzić migrację bazy danych.Dołączanie bazy danych zawierającej format przechowywania vardecimal do serwera niekwalifikujące się powiedzie.