Przenoszenie tabeli (stosu lub indeksu clustrowanego) między grupami plików

8-Lut-2012

Tworząc w bazie danych tabelę nie zawsze wiesz, w której dokładnie grupie plików powinna się ona rzeczywiście znaleźć. Tergo rodzaju rzeczy możesz chcieć zmienić podczas życia tabeli.

Przypomnijmy. Jeżeli tabela ma indeks clustered to ta tabela jest indeksem clustrowanym. Jeżeli zaś tabela nie posiada indeksu clusterd, to jest stosem. Tak więc pytanie „Jak przenieść tabelę z jednej grupy plików na inną” można sprowadzić do pytania „Jak przenieść indeks clustrowany lub stos na inną grupę plików”.

Przenoszenie indeksu clustrowanego nie jest trudne. Załóżmy, że mamy bazę danych:

CREATE DATABASE [Example] ON PRIMARY
( NAME = N’PrimaryFile’,
FILENAME = N’C:\MSSQL\DATA\PrimaryFile.mdf’ ,
SIZE = 3072KB , FILEGROWTH = 1024KB ),
FILEGROUP [SECONDARY]
( NAME = N’SecondaryFile’,
FILENAME = N’C:\MSSQL\DATA\SecondaryFile.ndf’ ,
SIZE = 3072KB , FILEGROWTH = 1024KB )
LOG ON
( NAME = N’Example_log’,
FILENAME = N’C:\MSSQL\DATA\Example_log.ldf’ ,
SIZE = 1024KB , FILEGROWTH = 10%)

Mamy więc bazę danych z dwoma grupami plików PRIMARY i SECONDARY.

Przejdźmy do tej bazy danych:

USE Example

Utworzymy tabelę z indeksem clustrowanym na grupie plików PRIMARY:

CREATE TABLE BigTable
(id int identity(1,1) not null,
text1 nchar(4000) null)
ON [PRIMARY]
CREATE UNIQUE CLUSTERED INDEX PK_BigTable ON BigTable (ID)
ON [PRIMARY]

Możesz wypełnić teraz bazę danych rekordami (poniższa instrukcja wykona wstawienie 1000 rekordów bez wyświetlania informacji o tym na karcie messages):

SET NOCOUNT ON
INSERT INTO BigTable VALUES(‚x’)
GO 1000

Sprawdźmy, gdzie znajduje się ta tabela:

DBCC SHOWFILESTATS

Jak przenieść tabelę na drugą grupę plików? Ano wystarczy przebudować indeks:

CREATE UNIQUE CLUSTERED INDEX PK_BigTable ON BigTable (ID)
WITH DROP_EXISTING 
ON [SECONDARY]

Kiedy sprawdzisz zajętość plików zobaczysz, gdzie teraz znajduje się tabela:

DBCC SHOWFILESTATS

Posprzątajmy:

DROP TABLE BigTable

No dobrze, a jak to zrobić z tabelą, która nie ma indeksu clustrowanego? Dziwne, ale trzeba chociaż na chwilkę założyć indeks clustrowany. W skrócie wyglądałoby to tak:

CREATE TABLE BigTable (id int identity(1,1) not null, text1 nchar(4000) null) ON [PRIMARY]

SET NOCOUNT ON
INSERT INTO BigTable VALUES(‚x’)
GO 1000

DBCC SHOWFILESTATS

Teraz szybko utwórz indeks clustrowany na drugiej grupie plików, a potem usuń ten indeks i sprawdź zajętość:

CREATE UNIQUE CLUSTERED INDEX PK_BigTable ON BigTable (ID)
ON [SECONDARY]
DROP INDEX PK_BigTable ON BigTable
DBCC SHOWFILESTATS

Teraz już wiadomo, jak przenosić tabele między grupami plików, prawda?

Podobny wpis:

http://www.sqltact.com/2011/08/moving-heaps-to-another-filegroup.html

Dodaj komentarz:

Autor: Rafał Kraik