Quan les taules d'una BBDD creixen i creixen el rendiment es degrada, aleshores l'opció es buidar la BBDD de dades obsoletes, crear taules on deixar que els registres descansin en pau. Quan aquesta opció no és possible cal fer particions de les dades. Des de SQL Server 2005 en endavant això es pot fer. Però cal planificar les particions amb cura. Aquest exemple que poso a continuació és típic i fàcil d'entendre. El primer pas és crear els grups de fitxers, a ser possible amb un nom significatiu:
ALTER DATABASE AdventureWorksDW ADD FILEGROUP [Filegroup_2001]
GO
ALTER DATABASE AdventureWorksDW ADD FILEGROUP [Filegroup_2002]
GO
ALTER DATABASE AdventureWorksDW ADD FILEGROUP [Filegroup_2003]
GO
ALTER DATABASE AdventureWorksDW ADD FILEGROUP [Filegroup_2004]
GO
Després cal afegir fitxers de debó a aquests grups de fitxers, almenys un a cada grup.
ALTER DATABASE AdventureWorksDW
ADD FILE
(NAME = N'data_2001',
FILENAME = N'C:\mssql2005\data\data_2001.ndf',
SIZE = 5000MB,
MAXSIZE = 10000MB,
FILEGROWTH = 500MB)
TO FILEGROUP [Filegroup_2001]
GO
ALTER DATABASE AdventureWorksDW
ADD FILE
(NAME = N'data_2002',
FILENAME = N'D:\mssql2005\data\data_2002.ndf',
SIZE = 5000MB,
MAXSIZE = 10000MB,
FILEGROWTH = 500MB)
TO FILEGROUP [Filegroup_2002]
GO
ALTER DATABASE AdventureWorksDW
ADD FILE
(NAME = N'data_2003',
FILENAME = N'E:\mssql2005\data\data_2003.ndf',
SIZE = 5000MB,
MAXSIZE = 10000MB,
FILEGROWTH = 500MB)
TO FILEGROUP [Filegroup_2003]
GO
ALTER DATABASE AdventureWorksDW
ADD FILE
(NAME = N'data_2004',
FILENAME = N'F:\mssql2005\data\data_2004.ndf',
SIZE = 5000MB,
MAXSIZE = 10000MB,
FILEGROWTH = 500MB)
TO FILEGROUP [Filegroup_2004]
GO
Un cop fet això cal decidir quin criteri es fa servir per particionar. Normalment es fa servir un criteri temporal, per anys, mesos, etc... Aleshores cal disposar d'una columna DATETIME a la taula. No és obligatori que sigui un datetime, pot ser un sencer (integer), per exemple la part de l'any de la data etc... El criteri que decideix on va cada registre s'anomena funció de particionat i es defineix:
CREATE PARTITION FUNCTION FullOrderDateKeyRangePFN(DATETIME) AS
RANGE LEFT FOR VALUES
( '20011231 23:59:59.997',
'20021231 23:59:59.997',
'20031231 23:59:59.997',
'20041231 23:59:59.997' )
Ara cal crear un esquema de particionat, on es diu al SQL Server que en uns determinats grups de fitxers es farà servir una funció de particionat.
CREATE PARTITION SCHEME FullOrderDateRangePScheme AS
PARTITION FullOrderDateKeyRangePFN TO
([Filegroup_2001],
[Filegroup_2002],
[Filegroup_2003],
[Filegroup_2004],
[PRIMARY] )
Un cop es té l'esquema cal crear-hi les taules dins. Es fa amb un create table normal, però enlloc de dir-li "ON PRIMARY" es posa el nom de l'esquema:
CREATE TABLE [DBO].[FACTINTERNETSALES_PARTITIONED] (
[PRODUCTKEY] [INT] NOT NULL,
[ORDERDATEKEY] [INT] NOT NULL,
[DUEDATEKEY] [INT] NOT NULL,
[SHIPDATEKEY] [INT] NOT NULL,
[CUSTOMERKEY] [INT] NOT NULL,
[PROMOTIONKEY] [INT] NOT NULL,
[CURRENCYKEY] [INT] NOT NULL,
[SALESTERRITORYKEY] [INT] NOT NULL,
[SALESORDERNUMBER] [NVARCHAR](20) NOT NULL,
[SALESORDERLINENUMBER] [TINYINT] NOT NULL,
[REVISIONNUMBER] [TINYINT] NULL,
[ORDERQUANTITY] [SMALLINT] NULL,
[UNITPRICE] [MONEY] NULL,
[EXTENDEDAMOUNT] [MONEY] NULL,
[UNITPRICEDISCOUNTPCT] [FLOAT] NULL,
[DISCOUNTAMOUNT] [FLOAT] NULL,
[PRODUCTSTANDARDCOST] [MONEY] NULL,
[TOTALPRODUCTCOST] [MONEY] NULL,
[SALESAMOUNT] [MONEY] NULL,
[TAXAMT] [MONEY] NULL,
[FREIGHT] [MONEY] NULL,
[CARRIERTRACKINGNUMBER] [NVARCHAR](25) NULL,
[CUSTOMERPONUMBER] [NVARCHAR](25) NULL,
[FULLDATE] [DATETIME] NULL)
ON FullOrderDateRangePScheme (FullDate)
Ara que la taula està creada, cal omplir-la amb dades, normalment d'una taula existent.
INSERT FACTINTERNETSALES_PARTITIONED
SELECT *
FROM FACTINTERNETSALES
Per veure com han quedat distribuïdes les dades es pot fer servir la següent comanda.
SELECT $PARTITION.FullOrderDateKeyRangePFN(FULLDATE) AS PARTITIONID,
COUNT(*) AS ROW_COUNT
FROM DBO.FACTINTERNETSALES_PARTITIONED
GROUP BY $PARTITION.FullOrderDateKeyRangePFN(FULLDATE)
ORDER BY PARTITIONID
Quan es creen els indexos també es fan tenint en compte el particionat:
CREATE INDEX ix_FactInternetSales_Partitioned_ProductKey
ON FactInternetSales_Partitioned (ProductKey)
ON FullOrderDateRangePScheme(FullDate)
|