Array
(
)

Indices em Tabela

Foxcyber
   - 06 abr 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...

Emerson
   - 06 abr 2005

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).

#Código

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

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

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

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

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


Marcus.magalhaes
   - 26 abr 2005

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,