P+R SQLÍndices não agrupados e permissões de retenção

Saleem Hakani and Dan Carollo

Índices não agrupados e seus usos

P O que são índices não agrupados e quais são as vantagens e as desvantagens de usá-los?

R Um índice não agrupado é semelhante a um índice remissivo (encontrado geralmente no final de livros). Todas as informações contidas neste livro são representadas no índice por tópico. Há indicadores na forma de números de página que o direcionam para localização das informações, talvez em várias áreas do livro. Além disso, os dados no índice de um livro não são registrados na mesma ordem em que aparecem no texto do livro. Ocorre o mesmo com os índices não agrupados. Se você tiver um índice agrupado em uma tabela, poderá especificar qual será a ordem dos itens. Caso contrário, não será possível ter certeza de qual será a ordem.

Além disso, os índices não agrupados têm duas limitações: somente 16 colunas podem ser incluídas no índice e o tamanho máximo da chave de índice não pode exceder 900 bytes. Portanto, o que isso significa? Vejamos o que acontece se você quiser indexar as seguintes colunas na tabela Movie do banco de dados MovieList de amostra: MovieTitle NVarchar(50), DirectorName NVarchar(50), ShortStory NVarchar(400).

Suponha que você emita a seguinte instrução para criar a tabela:

Use MovieList;
CREATE INDEX Movie_IDX ON Movie(MovieTitle, DirectorName, ShortStory); 

Isso irá gerar a seguinte na mensagem de erro: “Atenção! O tamanho máximo da chave é de 900 bytes. O índice 'Movie_IDX' tem o comprimento máximo de 1.000 bytes. Para certa combinação de valores maiores, a operação inserir/atualizar falhará." Você receberá a mensagem acima porque o tipo de dados "nvarchar" utilizará dois bytes para cada caractere; um índice contendo as três colunas anteriores excederia o limite de tamanho de 900 bytes.

Com o lançamento do SQL Server® 2005, agora você terá a oportunidade de solucionar esse problema adicionando as colunas à cláusula INCLUDE. Isso é muito útil se você quiser solucionar as limitações de tamanho e de coluna. Você fará isso executando a seguinte instrução:

CREATE INDEX Movie_IDX ON Movie(MovieTitle, DirectorName) INCLUDE (ShortStory);

É importante salientar que quando você usar a cláusula INCLUDE durante a criação de índice, o mecanismo do banco de dados não considerará colunas não chave ao calcular o número das colunas chave de índice ou tamanho de chave de índice.

Para localizar informações mais úteis sobre índices não agrupados, visite "Índices não agrupados" em msdn2.microsoft.com/aa174537 e "Usando índices não agrupados" at msdn2.microsoft.com/aa933130. Para obter dicas sobre a otimização de índices, consulte sql-server-performance.com/optimizing_ indexes.asp.

Preservação dos dados de permissões

P Como posso evitar a perda de permissões quando uma assinatura for reinicializada? Tive o seguinte problema várias vezes: quando um instantâneo é reinicializado, ele perde todas as permissões concedidas.

R Por padrão, todos os objetos no banco de dados de assinaturas são descartados e recriados sempre que uma assinatura é reinicializada. Mas há duas formas de administrar esse cenário.

Primeiro, você pode reaplicar todas as permissões depois da reinicialização. Quando você configurar as permissões de modo manual, deverá criptografar todas as permissões no nível de objeto/instrução e armazená-las separadamente, de modo que possa usá-las de imediato depois de reinicializar a assinatura.

Em segundo lugar, você pode configurar a sua assinatura para que não descarte objetos sempre que você reinicializá-la. Para que você possa usar o procedimento armazenado do sistema SP_CHANGEARTICLE para configurar o valor de PRE_CREATION_CMD para o parâmetro @PROPERTY e um valor de NONE, DELETE ou TRUNCATE para o parâmetro @Value.

Além disso, na caixa de diálogo Article Properties (Propriedades do artigo) na seção do objeto de destino, selecione um valor de "Keep existing object unchanged, delete data." (Manter o objeto existente inalterado, excluir dados.), de "If article has a row filter, delete only what matches the filter." (Se o artigo tiver um filtro de linha, excluir somente o que corresponder ao filtro.) e de "Truncate all data in the existing object." (Truncar todos os dados no objeto existente.) Certifique-se de tentar isso no seu ambiente de teste e, se você precisar de mais ajuda, verifique a última versão dos Manuais Online do SQL Server para obter informações atualizadas.

Saleem Hakani é engenheiro sênior de banco de dados, engenheiro sênior de resolução de problemas e líder da comunidade mundial do Microsoft SQL Server com 14 anos de experiência em sistemas de banco de dados. Ele lidera o site da Comunidade externa do SQL Server sqlcommunity.com e pode ser contatado pelo email Saleem@sqlcommunity.com.

Dan Carollo é engenheiro de operações e administrador de banco de dados SQL Server que trabalha com a equipe de resposta e pesquisa anti-malware do Windows na Microsoft. Ele é MCT em SQL Server.

© 2008 Microsoft Corporation e CMP Media, LLC. Todos os direitos reservados. A reprodução parcial ou completa sem autorização é proibida..