Array
(
)

Index NONCLUSTERED, lentidao

Eduardo.padilha
   - 09 mai 2005

Ola amigos.

Estou com um certo problema.

Tenho uma tabela onde existe milhares de registros, e tenho um Select q faço uma selecao entre data1>= ´01/01/2003´ and data2 <=getdate(),
para ficar rápido criei um indice NONCLUSTERED para esse campo data.

Muito bem se eu simplesmente mandar executar um select count(*), o resultado de 301538 linhas eh retornado em 00:00:02, ou seja eh muito rápido, mas nao eh o q preciso, preciso q me retorne a soma de um campo Select Sum(valor), dai o problema demora 00:02:40, ou seja um tempo DEMORADO.

Entao pergunto além do indice criado existe alguma outra coisa que posso fazer para melhorar a performance do resultado ? Para q me retorne a soma em menos tempo ?

Tentei em ver a possibilidade de criar um indice CLUSTERED, porém o meu primeiro indice já eh CLUSTERED, entao quando tento criar, aparece erro e nao deixa cria-los.

Se alguém tiver alguma idéia ficarei feliz.

Obrigado.

Marcus.magalhaes
   - 10 mai 2005

Boa tarde.

No seu select count(*), ele simplesmente utiliza só o índice para retornar o total, enquanto no seu segundo select, ele usa o índice NC, mas tb tem q descer até a página de dados para buscar os dados.

Para vc melhor isso e se o objetivo do índice NC era somente atender a esta query, inclua a coluna valor nele.

Ex.: Create NonClustered Index idx_datavalor On tbl(data, valor) With FillFactor = 75.

Usei FillFactor = 75 para evitar que haja muito split de página, porém se vc tem certeza que as datas são inseridas SEMPRE em ordem crescente, ou seja, em nenhum momento uma data menor que a última será inserida, utilize FillFactor = 100.

PS.: Só pode haver 1 índice CLUSTER, pois o objetivo dele é que a tabela fique físicamente ordenada por ele, sendo assim é impossível a tabela tenha + de 1 ordenação física, ou seja, + de 1 índice clustered.

Espero ter ajudado.

Att,

Eduardo.padilha
   - 10 mai 2005

Boa Tarde ..

Ola Marcus.Magalhaes novamente vc para socorrer nossa dúvidas, obrigado pelo apoio q vc tem contribuido para esse forum.

Bom a respeito da duvida q eu tinha, pelo q vc sugeriu em colocar o valor da sum(valor) no indice, putz melhorou 100¬, foi realmente uma grande dica e o agradeço por ela.

Agora uma pergunta se eu mando somar, q eh relamente o meu proprosito eu verificou através do Execution Plan q a execusao realmente vai pelo indice q criei q no caso eh o de numero indice_16, mas se ao inves de sum(valor), eu colocar select * ele faz a busca pelo indice_01, que eh o meu indice Clustered dai te pergunto pq isso ? Ele nao deveria fazer a busca pelo indice mais proximo da selecao ?

Obrigado.

Marcus.magalhaes
   - 10 mai 2005

Blz Eduardo.

Vamos lá. A sua soma ficou mais rápida, pq o otimizador sabe que tem um índice que filtra os dados pelo filtro q vc quer (data) e q este índice tb possui a coluna que vc quer usar como resultado (valor), sendo assim ele não precisa ir até à página de dados para recuperar os as colunas que estão sendo utilizadas.

Já quando vc faz um Select *, vc quer retornar TODAS as colunas da tabela, sendo assim, o índice NC não atende à sua necessidade, pq se ele fosse efetuar a pesquisa por ele, o otimizador teria q executar o dobro de leituras necessárias (ler o índice NC e depois ler a página de dados). Como o índice cluster como eu havia citado, ordena a tabela físicamente pelas colunas selecionadas para cria-lo, ele É A PRÓPRIA página de dados. Sendo assim, é mais rápido lê-lo, pois ele já está na posição para retornar os dados.

Espero ter conseguido esclarecer sua dúvida.

Att,

Eduardo.padilha
   - 11 mai 2005

Boa Tarde.

Sim dúvida esclarecida.

Obrigado e ate + .....