Indices em Tabela

06/04/2005

Tenho uma tabela de um cliente que não foi feita por mim que tem em média 7 milhões de registros. E a tabela para ser consultada é super lenta, as vezes nem retorna a resposta. Ela não possuí nenhum índice. Será que; se eu colocar um índice nessa tabela a performance de pesquisa nela vai aumentar? Qual seria a melhor forma de criar um índice? Vcs podem me explicar como fazer isso? Obrigado. Aguardo respostas...


Foxcyber

Respostas

06/04/2005

Emerson

com certeza a performance aumentará absurdamente.

você deve criar índices para todos os campos utilizados em relacionamento de tabelas e todos aqueles utilizados em critérios de pesquisa (where). geralmente clientes são ´procurados´ pelo cnpj, razao social ou nome fantasia, cidade e bairro.

no caso acima, deveriam ser criados pelo menos 4 índices (fora a chave primária).

if not exists(select * from dbo.sysindexes where id = object_id(N´[dbo&93;.&91;Clientes&93;´) and name=´PK_Clientes´)
  ALTER TABLE &91;dbo&93;.&91;Clientes&93; WITH NOCHECK ADD 
CONSTRAINT &91;PK_Clientes&93; PRIMARY KEY  CLUSTERED 
(
                &91;ID&93;
) WITH  FILLFACTOR = 90  ON &91;PRIMARY&93; 
GO

if not exists(select * from dbo.sysindexes where id = object_id(N´&91;dbo&93;.&91;Clientes&93;´) and name=´IX_Clientes_Cnpj´)
  ALTER TABLE &91;dbo&93;.&91;Clientes&93; WITH NOCHECK ADD 
CONSTRAINT [IX_Clientes_Cnpj&93; UNIQUE CLUSTERED 
(
                &91;CNPJ&93;
) ON &91;PRIMARY&93; 
GO

if not exists(select * from dbo.sysindexes where id = object_id(N´&91;dbo&93;.&91;Clientes&93;´) and name=´IX_Clientes_Razao´)
  ALTER TABLE &91;dbo&93;.&91;Clientes&93; WITH NOCHECK ADD 
CONSTRAINT &91;IX_Clientes_Razao&93; CLUSTERED
(
                &91;RAZAOSOCIAL&93;
) ON &91;PRIMARY&93; 
GO

if not exists(select * from dbo.sysindexes where id = object_id(N´&91;dbo&93;.&91;Clientes&93;´) and name=´IX_Clientes_Fantasia´)
  ALTER TABLE &91;dbo&93;.&91;Clientes&93; WITH NOCHECK ADD 
CONSTRAINT &91;IX_Clientes_Fantasia&93; CLUSTERED
(
                &91;NOMEFANTASIA&93;
) ON &91;PRIMARY&93; 
GO

if not exists(select * from dbo.sysindexes where id = object_id(N´&91;dbo&93;.&91;Clientes&93;´) and name=´IX_Clientes_Local´)
  ALTER TABLE [dbo&93;.&91;Clientes&93; WITH NOCHECK ADD 
CONSTRAINT &91;IX_Clientes_Local&93; CLUSTERED
(
                &91;BAIRRO&93;,
                &91;CIDADE&93;,
                &91;UF&93;
) ON &91;PRIMARY&93; 
GO



Responder Citar

26/04/2005

Marcus.magalhaes

Boa noite.

Me parece que houve um pequeno engano no post acima.

Vc só pode ter 1 índice clustered, todos outros devem ser nonclustered. Portando uma vez criado o mesmo na PK, todos os outros CLUSTERED devem ser trocados por NONCLUSTERED.

Att,


Responder Citar