Compartilhar via


Criando exibições particionadas distribuídas

Antes de implementar uma exibição particionada, você deve, primeiro, particionar uma tabela horizontalmente. Ao projetar um esquema de particionamento, devem estar claro quais dados pertencem a cada tabela membro. A tabela original é substituída por várias tabelas de membro menores. Cada tabela membro tem o mesmo número de colunas que a tabela original, e cada coluna tem os mesmos atributos que a coluna correspondente na tabela original, como tipo de dados, tamanho e agrupamento. Se você estiver criando uma exibição particionada distribuída, cada tabela membro estará em um servidor membro separado. Para maior transparência de local, o nome dos bancos de dados membros devem ser os mesmos em cada servidor membro, apesar de não ser necessário. Por exemplo: Server1.CustomerDB, Server2.CustomerDB, Server3.CustomerDB.

Criando tabelas membro

Você projeta as tabelas membro de forma que cada tabela armazene uma fatia horizontal da tabela original com base em um intervalo de valores chave. Os intervalos têm base nos valores de dados em uma coluna de particionamento. O intervalo de valores em cada tabela membro é imposto por uma restrição CHECK na coluna de particionamento e os intervalos não podem ser sobrepostos. Por exemplo, você não pode ter uma tabela com um intervalo de 1 a 200000 e uma outra com um intervalo de 150000 a 300000, porque não estaria claro qual tabela contém os valores entre 150000 e 200000.

Por exemplo, você está particionando uma tabela Cliente em três tabelas. A restrição CHECK para essas tabelas é a seguinte:

-- On Server1:
CREATE TABLE Customers_33
  (CustomerID   INTEGER PRIMARY KEY
                CHECK (CustomerID BETWEEN 1 AND 32999),
  ... -- Additional column definitions)

-- On Server2:
CREATE TABLE Customers_66
  (CustomerID   INTEGER PRIMARY KEY
                CHECK (CustomerID BETWEEN 33000 AND 65999),
  ... -- Additional column definitions)

-- On Server3:
CREATE TABLE Customers_99
  (CustomerID   INTEGER PRIMARY KEY
                CHECK (CustomerID BETWEEN 66000 AND 99999),
  ... -- Additional column definitions)

Definindo exibições particionadas distribuídas

Após criar as tabelas membro, você definirá uma exibição particionada distribuída em cada servidor membro, com cada exibição tendo o mesmo nome. Isso permite consultas que referenciem o nome da exibição particionada distribuída a ser executada em um ou mais servidores membros. O sistema opera como se uma cópia da tabela original estivesse em cada servidor membro, mas cada servidor tem apenas uma tabela membro e uma exibição particionada distribuída. O local dos dados é transparente ao aplicativo.

Você constrói as exibições particionadas distribuídas executando as seguintes tarefas:

  • Adição de definições de servidor vinculado em cada servidor membro que contenha informações de conexão necessárias para executar as consultas em outros servidores membros. Isto dá um acesso da exibição particionada distribuída aos dados nos outros servidores.

  • Definição da opção lazy schema validation, usando o sp_serveroption, para cada definição de servidor vinculado usado nas exibições particionadas distribuídas. Isso otimiza o desempenho assegurando que o processador de consultas não solicite metadados para qualquer uma das tabelas vinculadas até que os dados sejam realmente necessários da tabela do membro remota.

  • Criação de uma exibição particionada distribuída em cada servidor membro. As exibições usam instruções SELECT distribuídas para acessar os dados de servidores membros vinculados e mescla as linhas distribuídas com linhas da tabela membro local.

Para criar exibições particionadas distribuídas para obter o exemplo anterior, você deve executar o seguinte:

  • Adicionar uma definição de servidor vinculado nomeada Server2 com informações de conexão para Server2 e uma definição de servidor vinculado nomeada Server3 para acesso a Server3.

  • Criar a seguinte exibição particionada distribuída:

    CREATE VIEW Customers AS
       SELECT * FROM CompanyDatabase.TableOwner.Customers_33
    UNION ALL
       SELECT * FROM Server2.CompanyDatabase.TableOwner.Customers_66
    UNION ALL
       SELECT * FROM Server3.CompanyDatabase.TableOwner.Customers_99
    
  • Executar as mesmas etapas em Server2 e Server3.

Regras de tabela

Tabelas membro são definidas na cláusula FROM em cada instrução SELECT na definição da exibição. Cada tabela membro deve estar de acordo com as seguintes regras:

  • As tabelas membro não podem ser referenciadas mais de uma vez na exibição.

  • As tabelas membro não podem ter índices criados em qualquer coluna computada.

  • As tabelas membro devem ter todas as restrições PRIMARY KEY no mesmo número de colunas.

  • As tabelas membro devem ter a mesma configuração de preenchimento ANSI. Para obter mais informações sobre configuração de preenchimento ANSI, consulte SET ANSI_PADDING.

Regras de coluna

As colunas são definidas na lista de seleção de cada instrução SELECT na definição da exibição. Cada coluna deve estar de acordo com as seguintes regras:

  • Todas as colunas em cada tabela membro devem ser incluídas na lista de seleção. SELECT * FROM <tabela membro> é a sintaxe aceitável.

  • As colunas não podem ser referenciadas mais de uma vez na lista de seleção.

  • As colunas devem estar na mesma posição ordinal na lista de seleção

  • As colunas na lista de seleção de cada instrução SELECT devem ser do mesmo tipo. Isto inclui tipo de dados, precisão, escala e agrupamento. Por exemplo, a seguinte definição falha porque a primeira coluna em ambas as instruções SELECT não tem o mesmo tipo de dados:

    CREATE VIEW NonUpdatable
    AS
    SELECT IntPrimaryKey, IntPartNmbr
    FROM FirstTable
      UNION ALL
    SELECT NumericPrimaryKey, IntPartNmbr
    FROM SecondTable
    

Regras de colunas de particionamento

Só uma coluna pode ser usada no particionamento e deve existir em cada tabela membro. Restrições CHECK identificam os dados disponíveis em cada tabela membro. As seguintes regras adicionais se aplicam:

  • Os intervalos de chaves das restrições CHECK em cada tabela não podem sobrepor-se aos intervalos de qualquer outra tabela. Qualquer valor específico da coluna de particionamento deve mapear para só uma tabela. As restrições CHECK só podem usar estes operadores: BETWEEN, IN, AND, OR <, <= >, >=, =.

  • A coluna de particionamento não pode ser uma identidade, padrão ou coluna carimbo de data e hora.

  • As colunas de particionamento devem estar no mesmo local ordinal na lista de seleção de cada instrução SELECT na exibição. Por exemplo, a coluna de particionamento é sempre a primeira coluna em cada lista de seleção ou a segunda de cada na lista de seleção, e assim por diante.

  • A coluna de particionamento não pode permitir nulos.

  • A coluna de particionamento deve ser parte da chave primária da tabela.

  • A coluna de particionamento não pode ser uma coluna computada.

  • Deve haver só uma restrição na coluna de particionamento. Se houver mais de uma restrição, o SQL Server ignorará todas as restrições e não irá considerá-las ao determinar se a exibição é uma exibição particionada.

  • Não há nenhuma restrição na capacidade de atualização da coluna de particionamento.

Uma coluna de particionamento que atende todas essas regras oferecerá suporte a todas as otimizações que o otimizador de consultas dá suporte. Para obter mais informações, consulte Resolvendo exibições particionadas distribuídas.

Regras gerais

ObservaçãoObservação

As seguintes condições não se aplicam às exibições particionadas criadas localmente no mesmo servidor. Esse é um recurso incluído para fins de compatibilidade com versões anteriores.

A seguir estão algumas regras adicionais a serem consideradas:

  • Uma exibição particionada distribuída não pode ser formada usando operadores EXCEPT ou INTERSECT.

  • Uma transação distribuída será iniciada para garantir atomicidade por todos os nós afetados pela atualização.

  • A opção XACT_ABORT SET deve ser definida como ON.

  • As colunas smallmoney e smalldatetime são mapeadas em tabelas remotas respectivamente como money e datetime. Portanto, as colunas correspondentes nas tabelas locais também deveriam ser money e datetime.

  • Qualquer servidor vinculado não pode ser um servidor vinculado de auto-retorno. Este é um servidor vinculado que aponta para a mesma instância do SQL Server.

Uma exibição que referencia tabelas particionadas sem seguir todas essas regras ainda poderá ser atualizável, se houver um gatilho INSTEAD OF na exibição. Entretanto, o otimizador de consulta pode não ser sempre capaz de construir planos de execução para uma exibição com um gatilho INSTEAD OF que seja tão eficaz quanto os planos para a exibição particionada que segue todas as regras.