Digamos que eu tenha uma linha de ID (int) em um banco de dados definida como a chave primária. Se eu consultar o ID com frequência, também preciso indexá-lo? Ou por ser uma chave primária significa que já está indexada?
A razão pela qual pergunto é porque no MS SQL Server posso criar um índice neste ID, que, como afirmei, é minha chave primária.
Editar: uma pergunta adicional - causará algum dano indexar adicionalmente a chave primária?
fonte
Como todo mundo já disse, as chaves primárias são indexadas automaticamente.
Criar mais índices na coluna de chave primária só faz sentido quando você precisa otimizar uma consulta que usa a chave primária e algumas outras colunas específicas. Ao criar outro índice na coluna de chave primária e incluir algumas outras colunas com ele, você pode alcançar a otimização desejada para uma consulta.
Por exemplo, você tem uma tabela com muitas colunas, mas está apenas consultando as colunas de ID, Nome e Endereço. Tomando ID como a chave primária, podemos criar o seguinte índice que é construído em ID, mas inclui colunas de nome e endereço.
Então, quando você usa esta consulta:
O SQL Server fornecerá o resultado apenas usando o índice que você criou e não lerá nada da tabela real.
fonte
NOTA: Esta resposta aborda o desenvolvimento de classe empresarial em geral .
Este é um problema de RDBMS, não apenas do SQL Server, e o comportamento pode ser muito interessante. Por um lado, embora seja comum que as chaves primárias sejam indexadas automaticamente (exclusivamente), NÃO é absoluto. Há momentos em que é essencial que uma chave primária NÃO seja indexada exclusivamente.
Na maioria dos RDBMSs, um índice exclusivo será criado automaticamente em uma chave primária, caso ainda não exista . Portanto, você pode criar seu próprio índice na coluna de chave primária antes de declará-lo como uma chave primária, então esse índice será usado (se aceitável) pelo mecanismo de banco de dados quando você aplicar a declaração de chave primária. Freqüentemente, você pode criar a chave primária e permitir que seu índice exclusivo padrão seja criado e, em seguida, criar seu próprio índice alternativo nessa coluna e, em seguida, eliminar o índice padrão.
Agora, a parte divertida - quando você NÃO quer um índice de chave primária exclusivo? Você não quer um, e não pode tolerar um, quando sua tabela adquire dados (linhas) suficientes para tornar a manutenção do índice muito cara. Isso varia com base no hardware, no mecanismo RDBMS, nas características da tabela e do banco de dados e na carga do sistema. No entanto, geralmente começa a se manifestar quando uma tabela atinge alguns milhões de linhas.
O problema essencial é que cada inserção de uma linha ou atualização da coluna da chave primária resulta em uma varredura de índice para garantir a exclusividade. Essa varredura de índice exclusivo (ou seu equivalente em qualquer RDBMS) se torna muito mais cara à medida que a tabela cresce, até que domine o desempenho da tabela.
Já lidei com esse problema muitas vezes com tabelas de até 2 bilhões de linhas, 8 TB de armazenamento e 40 milhões de inserções de linha por dia. Fui encarregado de redesenhar o sistema envolvido, o que incluiu descartar o índice de chave primária exclusivo praticamente como primeiro passo. Na verdade, a redução desse índice foi necessária na produção simplesmente para se recuperar de uma interrupção, antes mesmo de chegarmos perto de um redesenho. Essa reformulação incluiu encontrar outras maneiras de garantir a exclusividade da chave primária e fornecer acesso rápido aos dados.
fonte
IDENTITY
campo não tem garantia de ser único. Afinal, os usuários podem inserir valores duplicados se forem usuáriosIDENTITY_INSERT
.As chaves primárias são sempre indexadas por padrão.
http://technet.microsoft.com/en-us/library/ms189039.aspx
fonte
Aqui está a passagem do MSDN :
fonte
um PK se tornará um índice clusterizado, a menos que você especifique o não clusterizado
fonte
Declarar uma restrição
PRIMARY KEY
ouUNIQUE
faz com que o SQL Server crie automaticamente um índice.Um índice exclusivo pode ser criado sem corresponder a uma restrição, mas uma restrição (chave primária ou única) não pode existir sem ter um índice exclusivo.
A partir daqui, a criação de uma restrição irá:
e, ao mesmo tempo, eliminar a restrição eliminará o índice associado.
Então, há diferença real entre um
PRIMARY KEY
ouUNIQUE INDEX
:NULL
os valores não são permitidosPRIMARY KEY
, mas permitidos noUNIQUE
índice; e como em operadores de conjunto (UNION, EXCEPT, INTERSECT), aqui oNULL = NULL
que significa que você pode ter apenas um valor já que doisNULL
s são encontrados como duplicatas um do outro;PRIMARY KEY
pode existir por tabela, enquanto 999 índices exclusivos podem ser criadosPRIMARY KEY
restrição é criada, ela é criada como clusterizada, a menos que já haja um índice clusterizado na tabela ouNONCLUSTERED
seja usado em sua definição; quando oUNIQUE
índice é criado, ele é criado como, aNONCLUSTERED
menos que não seja específico para serCLUSTERED
e tal já não exista;fonte
Torná-la uma chave primária também deve criar automaticamente um índice para ela.
fonte
Bem, no SQL Server, geralmente, a chave primária é indexada automaticamente. Isso é verdade, mas não garante uma consulta mais rápida. A chave primária proporcionará um desempenho excelente quando houver apenas 1 campo como chave primária. Mas, quando há vários campos como chave primária, o índice é baseado nesses campos.
Por exemplo: os campos A, B, C são a chave primária, portanto, quando você faz uma consulta com base nesses 3 campos em sua CLÁUSULA WHERE, o desempenho é bom, MAS quando você deseja consultar apenas o campo C na CLÁUSULA WHERE, você não obterá um bom desempenho. Portanto, para obter seu desempenho em pleno funcionamento, você precisará indexar o campo C manualmente.
Na maioria das vezes, você não verá o problema até atingir mais de 1 milhão de registros.
fonte
Eu tenho um banco de dados enorme sem índice (separado).
Sempre que faço uma consulta pela chave primária, os resultados são, para todos os efeitos intensivos, instantâneos.
fonte
chaves primárias são indexadas automaticamente
você pode criar índices adicionais usando o pk dependendo do seu uso
fonte