Usando exibições particionadas
As exibições particionadas permitem que os dados de uma tabela grande sejam divididos em tabelas membro menores. Os dados são particionados entre as tabelas membro com base nos intervalos dos valores de dados de uma das colunas. Os intervalos de dados para cada tabela membro estão definidos em uma restrição CHECK especificada na coluna de particionamento. Uma exibição que usa UNION ALL para combinar seleções de todas as tabelas membro em um único conjunto de resultado é assim definida. Quando as instruções SELECT referentes à exibição especificam um critério de pesquisa na coluna de partição, o otimizador de consultas usa as definições de restrição CHECK para determinar qual tabela membro contém as linhas.
Observação |
---|
O método preferencial para o particionamento dados locais para um servidor é através de tabelas particionadas. Para obter mais informações, consulte Tabelas e índices particionados. |
Por exemplo, uma tabela de vendas que registra as vendas para 1998 foi particionada em 12 tabelas membro, uma para cada mês. Cada tabela membro tem uma restrição definida na coluna OrderMonth:
CREATE TABLE May1998sales
(OrderID INT,
CustomerID INT NOT NULL,
OrderDate DATETIME NULL
CHECK (DATEPART(yy, OrderDate) = 1998),
OrderMonth INT
CHECK (OrderMonth = 5),
DeliveryDate DATETIME NULL
CHECK(DATEPART(mm, DeliveryDate) = 5)
CONSTRAINT OrderIDMonth PRIMARY KEY(OrderID, OrderMonth)
)
O aplicativo que popula o May1998sales deve certificar-se de que todas as linhas tenham 5 na coluna OrderMonth e que a data do pedido especifique uma data em maio de 1998. Isto é imposto pelas restrições definidas na tabela.
Uma exibição é definida para usar o UNION ALL para selecionar os dados de todas as 12 tabelas membro como um único conjunto de resultados:
CREATE VIEW Year1998Sales
AS
SELECT * FROM Jan1998Sales
UNION ALL
SELECT * FROM Feb1998Sales
UNION ALL
SELECT * FROM Mar1998Sales
UNION ALL
SELECT * FROM Apr1998Sales
UNION ALL
SELECT * FROM May1998Sales
UNION ALL
SELECT * FROM Jun1998Sales
UNION ALL
SELECT * FROM Jul1998Sales
UNION ALL
SELECT * FROM Aug1998Sales
UNION ALL
SELECT * FROM Sep1998Sales
UNION ALL
SELECT * FROM Oct1998Sales
UNION ALL
SELECT * FROM Nov1998Sales
UNION ALL
SELECT * FROM Dec1998Sales
Por exemplo, a instrução SELECT a seguir, pesquisa por informações sobre meses específicos.
SELECT *
FROM Year1998Sales
WHERE OrderMonth IN (5,6) AND CustomerID = 64892
O otimizador de consulta SQL Server reconhece que o critério de pesquisa nessa instrução SELECT faz referência somente às linhas nas tabelas de May1998Sales e Jun1998Sales. Portanto, ele limita sua pesquisa a essas tabelas.
Para realizar atualizações na exibição particionada, a coluna de particionamento deve ser uma parte da chave primária da tabela base. Se uma exibição não for atualizável, é possível criar um gatilho INSTEAD OF na exibição que permite atualizações. Você deve projetar um tratamento de erros no gatilho para certificar-se de que linhas duplicadas não sejam inseridas. Para obter um exemplo de um gatilho de INSTEAD OF projetado em uma exibição, consulte Criando gatilhos INSTEAD OF.
As restrições CHECK não são necessárias para que a exibição particionada retorne os resultados corretos. Entretanto, se as restrições CHECK não tiverem sido definidas, o otimizador de consultas deve pesquisar todas as tabelas em vez de pesquisar somente aquelas condizentes com o critério de pesquisa da coluna de particionamento. Sem as restrições CHECK, a exibição opera como qualquer outra exibição com UNION ALL. O otimizador de consultas não pode fazer nenhuma suposição a respeito dos valores armazenados em tabelas diferentes e não pode deixar de pesquisar as tabelas que participam das definições da exibição.
Se todas as tabelas membro referentes a uma exibição particionada estiverem no mesmo servidor, a exibição será uma exibição particionada local. Se as tabelas membro estiverem em diversos servidores, a exibição será uma exibição particionada distribuída. As exibições particionadas distribuídas podem ser usadas para difundir o processamento de carga do banco de dados de um sistema através de um grupo de servidores. Para obter mais informações, consulte Servidores de banco de dados federados.
As exibições particionadas fazem com que a manutenção independentemente das tabelas membro seja mais fácil. Por exemplo, ao final de um período, é possível fazer o seguinte:
A definição de uma exibição particionada para resultados atuais pode ser alterada para adicionar o período mais recente e descartar o período mais antigo.
A definição de uma exibição particionada para resultados anteriores pode ser alterada para adicionar o período que acabou de ser descartado da exibição dos resultados atuais. A exibição dos resultados anteriores também pode ser atualizada para remover e arquivar o período mais antigo coberto.
Ao inserir dados em exibições particionadas, o procedimento armazenado do sistema sp_executesql pode ser usado para criar instruções INSERT com planos de execução que tenham grandes chances de ser usados novamente nos sistemas com muitos usuários simultâneos.
Observação |
---|
A importação em massa em uma exibição particionada não é suportada pelos comandos bcp e BULK INSERT e INSERT ... SELECT * FROM OPENROWSET(BULK...) . No entanto, é possível inserir várias linhas em uma exibição particionada usando uma instrução INSERT. |
Consulte também