sql >> Databasteknik >  >> RDS >> Sqlserver

Flytta SQL Server-tabellen till en annan filgrupp

Introduktion

En tabell är en logisk struktur. När du skapar en tabell skulle du vanligtvis inte bry dig om vilka enheter den sitter på vid lagringslagret. Men om du är databasadministratör kan denna kunskap bli viktig om du behöver flytta vissa databasdelar till alternativ lagring eller volym. Sedan kanske du vill att bestämda tabeller ska finnas på en viss volym eller uppsättning diskar.

Filgrupper i SQL Server erbjuder det abstraktionsskiktet som tillåter oss att kontrollera den fysiska platsen för våra logiska strukturer – tabeller, index etc.

Filgrupper

En filgrupp är en logisk struktur för att gruppera datafiler i SQL Server. Om vi ​​skapar en filgrupp och associerar den med en uppsättning datafiler, kommer alla logiska objekt som skapas i den filgruppen att finnas fysiskt på den uppsättningen fysiska filer.

Det primära syftet med sådan fysisk filgruppering är datatilldelning och dataplacering. Till exempel vill vi att våra transaktionsdata ska lagras på en uppsättning snabba diskar. Samtidigt behöver vi historiska data lagrade på en annan uppsättning billigare diskar. I ett sådant scenario skulle vi skapa Tran tabellen på TXN-filgruppen och TranHist tabell på en annan HIST-filgrupp. Längre fram i den här artikeln ska vi se hur detta översätts till att ha data på olika diskar.

Skapa filgrupper

Syntaxen för att skapa filgrupper visas i Lista 1 . Obs :Databaskontexten är master databas. När vi utfärdar satserna ändrar vi DB2-databasen genom att lägga till nya filgrupper till den. I huvudsak är dessa filgrupper bara logiska konstruktioner vid denna tidpunkt. De innehåller inga data.

-- Listing 1: Creating File Groups
USE [master]
GO
ALTER DATABASE [DB2] ADD FILEGROUP [HIST]
GO
ALTER DATABASE [DB2] ADD FILEGROUP [TXN]
GO

Lägga till filer i filgrupper

Nästa steg är att lägga till en fil till var och en av filgrupperna. Vi kan lägga till mer än en fil, men vi håller det enkelt för demonstrationsändamål. Lägg märke till att varje fil är helt och hållet på en annan enhet, och syntaxen tillåter oss att specificera den avsedda filgruppen.

-- Listing 2: Adding Files to Filegroups
USE [master]
GO
ALTER DATABASE [DB2] ADD FILE ( NAME = N'DB2_HIST_01', FILENAME = N'E:\MSSQL\Data\DB2_HIST_01.ndf' , SIZE = 102400KB , FILEGROWTH = 131072KB ) TO FILEGROUP [HIST]
GO
ALTER DATABASE [DB2] ADD FILE ( NAME = N'DB2_TXN_01', FILENAME = N'C:\MSSQL\Data\DB2_TXN_01.ndf' , SIZE = 102400KB , FILEGROWTH = 131072KB ) TO FILEGROUP [TXN]
GO

Skapa tabeller till filgrupper

Här säkerställer vi att tabeller finns på önskade diskar. Syntaxen för att skapa tabeller låter oss ange vilken filgrupp vi vill ha.

-- Listing 3: Creating a table on Filegroups TXN and HIST
USE [DB2]
GO

CREATE TABLE [dbo].[tran](
	[TranID] [int] NULL
	,TranTime [datetime]
	,TranAmt [money]
) ON [TXN]
GO

CREATE CLUSTERED INDEX [IX_Clustered01] ON [dbo].[tran]
(
	[TranID] ASC
) ON [TXN]
GO


CREATE TABLE [dbo].[tranhist](
	[TranID] [int] NULL
	,TranTime [datetime]
	,TranAmt [money]
) ON [HIST]
GO

Om vi ​​tar ett steg tillbaka noterar vi att vi nu har uppnått följande:

  1. Skapade två filgrupper.
  2. Fastställde datafilerna (och diskarna) som är associerade med varje filgrupp.
  3. Har bestämt vilka tabeller som är associerade med varje filgrupp.

I huvudsak är filgruppen abstraktionslagret .

Kontrollera vilka filgrupper våra tabeller sitter på

För att kontrollera vilken filgrupp varje tabell tillhör, kör vi koden i Listing 4. Vi använder två huvudsystemkatalogvyer:sys.indexes och sys.data_spaces . sys.data_spaces katalogvyn innehåller information om filgrupper och partitioner, och de huvudsakliga logiska strukturerna där tabeller och index lagras.

Obs! Vi använde inte sys.tables . SQL Server associerar index i en tabell med datautrymmen snarare än tabeller, som vi intuitivt tror.

-- Listing 4: Check the filegroup of an index or table

USE DB2
GO

select object_name(i.object_id) [Table Name]
, i.name [Index Name]
, i.type_desc [Index Type]
, d.name [FileGroup]
from sys.indexes i inner join sys.data_spaces d
on i.data_space_id=d.data_space_id
where d.name<>'PRIMARY'

Utdata från frågan i Listing 4 visar två tabeller som vi just har skapat. Lägg märke till att tranhisten tabellen har inget index. Ändå dyker den upp i resultatuppsättningen, identifierad som en hög .

En hög är en tabell som inte har något klustrat index som bestämmer orderdata som fysiskt lagras i en tabell. Det kan bara finnas ett klustrat index i en tabell.

Följa Trans-tabellen

Nu måste vi lägga till några poster i trans tabell med följande kod:

-- Listing 5: Populate the Tran Table

USE DB2
GO
SELECT * FROM [tran];

INSERT INTO [tran] VALUES (1, GETDATE(),12.00);
INSERT INTO [tran] VALUES (2, GETDATE(),13.00);
INSERT INTO [tran] VALUES (3, GETDATE(),15.40);
INSERT INTO [tran] VALUES (4, GETDATE(),16.20);
INSERT INTO [tran] VALUES (5, GETDATE(),11.10);

SELECT * FROM [tran];

Flytta en tabell till en annan filgrupp

För att flytta trans tabell till en annan filgrupp behöver vi bara bygga om det klustrade indexet och ange den nya filgruppen medan du gör ombyggnaden. Lista 5 visar detta tillvägagångssätt.

Vi utför två steg:släpp först indexet och återskapa det sedan. Däremellan kontrollerar vi att uppgifterna och platsen för de två tabeller vi skapade tidigare förblir intakta.

-- Listing 6: Check what filegroup an index or table belongs to

USE [DB2]
GO

DROP INDEX [IX_Clustered01] ON [dbo].[tran] WITH ( ONLINE = OFF )
GO

CREATE CLUSTERED INDEX [IX_Clustered01] ON [dbo].[tran]
(
	[TranID] ASC
) ON [HIST]
GO

Genom att ta bort det klustrade indexet från tran tabell, har vi konverterat den till en hög :

När vi återskapar det klustrade indexet indikeras det också i Listing 4-utgången.

Nu har vi trans tabell i HIST-filgruppen.

Slutsats

Den här artikeln visade förhållandet mellan tabeller, index, filer och filgrupper när det gäller vår SQL Server-datalagring. Vi har också förklarat att flytta en tabell från en filgrupp till en annan genom att återskapa det klustrade indexet.

Denna färdighet kommer att vara användbar när du behöver migrera data till ny lagring (snabbare diskar eller långsammare diskar för arkivering). I mer avancerade scenarier kan du använda filgrupper för att hantera datalivscykeln genom att implementera tabellpartitioner.

Referenser

  1. Databasfiler och filgrupper
  2. Byta ut tabellpartitioner – en genomgång

  1. skillnaden mellan förklara plan och genomförandeplan

  2. Hur använder jag Postgres JSONB datatype med JPA?

  3. Hur man skapar utländsk nyckelbegränsning med PÅ UPPDATERING CASCADE i SQL Server - SQL Server / TSQL Handledning Del 79

  4. Hur man infogar Excel- eller CSV-data i tabell med hjälp av grafiskt användargränssnitt i SQL Server - SQL Server / TSQL självstudie del 102