Udostępnij przez


Przełączanie partycji Widoki indeksowane są zdefiniowane.

Partycjonowanie danych umożliwia zarządzanie i szybko i efektywnie dostępu podzbiory danych przy jednoczesnym utrzymaniu integralność danych całego kolekcja.Definiowanie widoków indeksowanych na podzielonym na partycje danych można później zwiększyć szybkość i wydajność kwerend.Te widoki zdefiniowane są nazywane wyrównane partycji Widoki indeksowane.

indeksowany widok jest wyrównany partycji z tabela odwołuje się, jeśli są spełnione następujące warunki:

  • Funkcje partycji indeksów indeksowany widok i tabela:

    • Należy określić taką samą liczbę partycji.

    • Definiowanie wartości graniczne dla partycji.

    • Argumenty funkcji partycji musi być taka sama kolumna.

  • Lista rzut definicji widoku zawiera kolumna partycjonowania (w przeciwieństwie do wyrażenie zawierającego kolumna partycjonowania) tabela partycjonowana.

  • W przypadku, gdy definicja widoku wykonuje zgrupowanie, kolumna partycjonowania jest jedną z kolumn grupowanie zawarte w definicji widoku.

  • W przypadku gdy kilka tabel (przy użyciu sprzężeń, podkwerendy, funkcje i tak dalej) odwołuje się do widoku, indeksowany widok jest wyrównany partycji, tylko jedną z tabel podzielonym na partycje.

W SQL Server 2008, mogą być przełączane wyrównane partycji Widoki indeksowane wraz z podzielonym na partycje tabel, widoków zdefiniowanych przeciwko.Operacji konserwacji na partycje lub podzestawów danych są obecnie realizowane skuteczniej, ponieważ te operacje miejsce docelowe dane wymagane zamiast całej tabela.Dodatkowe korzyści do partycjonowanie danych z Widoki indeksowane są:

  • Automatic maintenance.SQL Server 2008 automatically maintains indexed views when INSERT, UPDATE, or DELETE statements are run.

  • Poprawa agregacji.Wydajność kwerendy agregującej może znacząco poprawiona, jeśli indeksowany widok zapewnia wystarczającą ilość redukcji wiersza do agregacja.W SQL Server 2008 przedsiębiorstwa, gdy optymalizator kwerendy automatycznie dopasowuje zapytanie agregujące do odpowiednich indeksowany widok lub kwerendy bezpośrednio odnosi się do indeksowany widok za pomocą wskazówki NOEXPAND, wydajność kwerendy może być bardziej efektywne niż gdy kwerenda uzyskuje dostęp do całej tabela.

Ograniczenia przy użyciu zmiany tabeli...Instrukcja SWITCH Widoki indeksowane

Podczas korzystania z Transact-SQL ALTER TABLE...Instrukcja SWITCH transferu podzbiory danych między źródło i tabel miejsce docelowe, które odwołuje się indeksowany widok, tabele oraz indeksy muszą spełniać warunki wymienione w Efektywne przesyłania danych przy użyciu przełączania partycji.W sekcji tabeli i indeks wymagania tego rozdziału.

Aby uzyskać więcej informacji o przenoszeniu partycji z widoków zdefiniowanych indeksu zobacz sekcję "Dodatkowe wymagania dla przenoszenia partycje" of Efektywne przesyłania danych przy użyciu przełączania partycji.

Typowy scenariusz, w którym mogą być używane widoki indeksowane wyrównane partycji jest z magazyn danych.W magazynie danych, dużych tabela fakt zwykle na partycje według daty, i kwerend agregujących są często uruchamiane przeciwko tabela fakt się z kilku tabel wymiar.Przełączanie partycji lub przy użyciu instrukcji ALTER TABLE … Instrukcja SWITCH zapewnia następujące korzyści:

  • Szybko archiwizować wieku dane najstarsze partycji tabela fakt.

  • Szybko przenieść do partycji najnowsze duża nowe dane tabela fakt.

Na poniższej ilustracji przedstawiono działanie indeksowany widok wyrównany do partycji na nowych danych jest umieszczany w najnowsze partycji tabela fakt.Nowa partycja, która przełączane do tabela fakt prowadzi wzdłuż agregacja, utworzonego na nowej partycji.

Przełączanie widoków indeksu dopasowanych do partycji

Przykłady

Poniższy przykład pokazuje sposób używania ALTER tabela … Instrukcja SWITCH, aby przełączyć się starej partycji tabela, która przenosi część partycji wyrównane indeksowany widok z nim.

W tym przykładzie sprzedaży tabela fakt [f_sales] zawiera jeden rok dane sprzedaży dla danych sprzedaży 2006.The roku jest podzielony na partycje na podstawie kwartalnych.Często wykonywania kwerend tego łączna kwota sprzedaży według data i magazynu i indeksowany widok jest tworzony do przyspieszenia kwerendy agregującej, która została określona na tabela fakt.Teraz jest pierwsze dane kwartału 2006 do archiwizacji do tabeli archiwalnej, podczas indeksowany widok na tabela fakt pozostaje poprawne i użyteczne.

USE MASTER
GO

DROP DATABASE test_partition
GO

--Create database with the file groups that will be used by the partition schemes.
CREATE DATABASE test_partition
ON PRIMARY (NAME = 'paiv_Dat0', FILENAME='C:\temp\test_partition_DataFile0.mdf'),
FILEGROUP FG1 (NAME = 'paiv_Dat1', FILENAME = 'C:\temp\test_partition_DataFile1.ndf'),
FILEGROUP FG2 (NAME = 'paiv_Dat2', FILENAME = 'C:\temp\test_partition_DataFile2.ndf'),
FILEGROUP FG3 (NAME = 'paiv_Dat3', FILENAME = 'C:\temp\test_partition_DataFile3.ndf'),
FILEGROUP FG4 (NAME = 'paiv_Dat4', FILENAME = 'C:\temp\test_partition_DataFile4.ndf'),
FILEGROUP FG5 (NAME = 'paiv_Dat5', FILENAME = 'C:\temp\test_partition_DataFile5.ndf')
LOG ON (NAME = 'paiv_log', filename='C:\temp\test_partition_log.ldf')
GO
USE test_partition
GO

-- Create partition function and partition scheme.
CREATE PARTITION FUNCTION [PF1] (int)
AS RANGE LEFT FOR VALUES (20060331, 20060630, 20060930, 20061231);
GO
CREATE PARTITION SCHEME [PS1]
AS PARTITION [PF1] 
TO ([FG1], [FG2], [FG3], [FG4], [FG5]
, [PRIMARY]);
GO

-- Create fact table.
CREATE TABLE dbo.f_sales (date_key INT NOT NULL, cust_key INT, store_key INT, amt MONEY) ON PS1(date_key);
GO

-- Populate data into table f_sales. 
SET NOCOUNT ON
GO
DECLARE @d INT, @ds INT, @cs INT, @s INT
SET @d = 20060101
SET @ds = 7  -- date_key increment step

WHILE (@d <= 20061231) 
BEGIN
WHILE @d%100 > 0 AND @d%100 < 29
BEGIN
SET @cs = 10  -- # of records for customer/store for that date
SET @s = CAST ( RAND() * 1000 as INT )
WHILE (@cs > 0)
BEGIN
INSERT dbo.f_sales (date_key, cust_key, store_key, amt)
VALUES (@d, CAST ( RAND() * 1000 as INT ), @s, CAST ( RAND() * 1000 as MONEY ) )
SET @cs = @cs - 1
END
SET @d = @d + @ds
END
SET @d = @d + @ds
END
GO


-- The table with clustered index is partitioned using the partition scheme specified.
CREATE CLUSTERED INDEX UCIdx_f_sales on dbo.f_sales (date_key, cust_key, store_key) ON PS1(date_key)
GO

--Create indexed view, which aggregates on the date and store.
CREATE VIEW dbo.v_f_sales_sumamt WITH SCHEMABINDING AS
(
SELECT date_key, store_key, sum(ISNULL(amt,0)) AS amt, count_big(*) AS cnt
FROM dbo.f_sales AS sales
GROUP BY date_key, store_key
)
GO

-- Materialize the view. The indexed view is now partition-aligned with table f_sales.
CREATE UNIQUE CLUSTERED INDEX ucidx_v_sales_sum
ON dbo.v_f_sales_sumamt (date_key) ON PS1(date_key)
GO

-- Check data distribution in various partitions of the table & the indexed view.
SELECT OBJECT_NAME(p.object_id) as obj_name, p.index_id, p.partition_number, p.rows, a.type, a.filegroup_id 
FROM sys.system_internals_allocation_units a
JOIN sys.partitions p
ON p.partition_id = a.container_id
WHERE p.object_id IN (OBJECT_ID(N'dbo.f_sales'), OBJECT_ID(N'dbo.v_f_sales_sumamt '))
ORDER BY obj_name, p.index_id, p.partition_number

-- Create archive table to receive the partition that will be switched out of table f_sales. 
CREATE TABLE dbo.sales_archive (date_key INT NOT NULL, cust_key INT, store_key INT, amt MONEY) ON FG1
GO
CREATE CLUSTERED INDEX UCIdx_sales_archive on dbo.sales_archive (date_key, cust_key, store_key) ON FG1
GO
--Create indexed view with view definition matching v_f_sales_sumamt on table f_sales.
CREATE VIEW dbo.v_sales_archive_sumamt WITH SCHEMABINDING AS
(
SELECT date_key, store_key, sum(ISNULL(amt,0)) AS amt, count_big(*) AS cnt
FROM dbo.sales_archive AS sales
GROUP BY date_key, store_key
)
GO

-- Materialize the view. The indexed view is partition-aligned with table sales_archive.
CREATE UNIQUE CLUSTERED INDEX ucidx_v_sales_sum
ON dbo.v_sales_archive_sumamt(date_key) ON FG1
GO

-- Check data distribution in various partitions of the table and the indexed view. 
SELECT OBJECT_NAME(p.object_id) as obj_name, p.index_id, p.partition_number, p.rows, a.type, a.filegroup_id 
FROM sys.system_internals_allocation_units a
JOIN sys.partitions p
ON p.partition_id = a.container_id
WHERE p.object_id IN (OBJECT_ID(N'dbo.sales_archive'), OBJECT_ID(N'dbo.v_sales_archive_sumamt '))
ORDER BY obj_name, p.index_id, p.partition_number

-- Data associated with the old partition of the source table - [f_sales] and the indexed view [v_f_sales_sumamt] - 
-- is switched out to archive table [sales_archive] and the indexed view [v_sales_archive_sumamt].
ALTER TABLE dbo.f_sales SWITCH PARTITION 1 TO dbo.sales_archive

-- Data distribution in various partitions shows that 
-- partition 1 of [f_sales] and the indexed view [v_f_sales_sumamt] are now empty 
-- and these rows are now in [sales_archive] and [v_sales_archive_sumamt], respectively.
SELECT OBJECT_NAME(p.object_id) as obj_name, p.index_id, p.partition_number, p.rows, a.type, a.filegroup_id 
FROM sys.system_internals_allocation_units a
JOIN sys.partitions p
ON p.partition_id = a.container_id
WHERE p.object_id IN (OBJECT_ID(N'dbo.sales_archive'), OBJECT_ID(N'dbo.v_sales_archive_sumamt '), 
OBJECT_ID(N'dbo.f_sales'), OBJECT_ID(N'dbo.v_f_sales_sumamt '))
ORDER BY obj_name, p.index_id, p.partition_number

Jak pokazano w poprzednim przykładzie po przełączył partycji, wszystkie dane w partycji 1 tabela [f_sales] i indeksowany widok [v_f_sales_sumamt] są przeniesiony do odpowiedniej tabela [sales_archive] i indeksowany widok [v_sales_archive_sumamt].

Uzyskać kwoty sprzedaży według data według magazynu lipca 2006, kwerendy można albo tabela [f_sales] lub indeksowany widok [v_f_sales_sumamt], jak pokazano w następującej kwerendy dwóch.Wyniki są takie same w obu przypadkach, ale uruchomiony przed indeksowany widok znacznie zwiększa wydajność kwerendy, ponieważ indeksowany widok zostaje agregatów wstępnie obliczane i zmniejsza liczbę wierszy przez współczynnik równy 10, jak pokazano w następującym przykładzie.

-- This query runs against the table [f_sales]
SELECT date_key, store_key AS [Store Number], sum(ISNULL(amt,0)) AS Sales_Amount
FROM dbo.f_sales
WHERE date_key >= '20060701' AND date_key < '20060801'
GROUP BY date_key, store_key
ORDER BY date_key, store_key
OPTION (EXPAND VIEWS)

-- This query runs against the indexed view [v_f_sales_sumamt]
-- the result of this query is the same as the one against the table
-- the indexed view materializes the pre-calculated aggregate, resulting in significant improvements in query performance   
SELECT date_key, store_key AS [Store Number], sum(ISNULL(amt,0)) AS Sales_Amount
FROM dbo.v_f_sales_sumamt WITH (NOEXPAND)
WHERE date_key >= '20060701' AND date_key < '20060801'
GROUP BY date_key, store_key

Przełączanie za pomocą substancji ZMIENIA partycjiPrzełącznik instrukcja jest szybkie, tylko do metadane operacji.Gdy widoki indeksowane są wyrównane partycji z źródło i tabela miejsce docelowe przełączania partycji można przełączyć podzbiór danych z źródło tabela do tabela miejsce docelowe, a także skojarzone części wyrównany Widoki indeksowane.Zachowanie integralności zbierania danych, ponieważ wszystkie obiekty, które są skojarzone z źródło tabela (na przykład tabele, indeksów i widoki indeksowane) są uwzględniane w przełącznik partycji.Za pomocą widoków indeksowanych na tabela partycjonowana, można znacznie zwiększyć wydajność kwerend agregujących, które odwołują się do tabeli.