Necessidade de acelerar esta consulta no SQL Server

votos
1
SELECT pe.prodtree_element_id prodID, pe.prodtree_element_name_s, li.line_name, av2.value
    FROM prodtree_element pe
    LEFT JOIN prodtree_link pl
        ON pe.prodtree_element_id = pl.to_prodtree_node_id
    LEFT JOIN line li
        ON pe.line_code = li.line_code
    INNER JOIN attribute_values av
        ON av.attribute_definition_id = #statusCode# 
    LEFT JOIN attribute_values av2
        ON pe.prodtree_element_id = av.prodtree_element_id
    WHERE pe.prodtree_element_func_type <> 'WIZARD'
        AND pe.prodtree_element_topo_type = 'NODE'

# StatusCode # é um ID de estática que coincida com um id na tabela de definição de atributo (digamos que 22 por causa do argumento). O problema é que a consulta tem algum problema enorme terminando em qualquer quantidade sã de tempo. O maior problema é, eu meio que precisa dele para terminar mais cedo, mas o número de registros é enorme que tem que chamar de volta (cerca de 30-50,000). Eu preciso de dados de várias tabelas, que é onde ele começa a desacelerar. Este é apenas um pedaço do que eu preciso, eu também preciso todo um outras tabelas no valor de dados correspondentes a prodtree_elment_id atual.

Estou usando ColdFusion mas mesmo executar a consulta diretamente no SQL Server 2005 cria a 15-30 + minutos esperar para esta consulta (se ele ainda termina). Existe alguma maneira concebível para acelerar esta consulta a tomar, no máximo, 5 minutos ou menos?

Publicado 09/12/2008 em 20:54
fonte usuário
Em outras línguas...                            


6 respostas

votos
9

INNER JOIN attribute_values av
    ON av.attribute_definition_id = #statusCode# 
LEFT JOIN attribute_values av2
    ON pe.prodtree_element_id = av.prodtree_element_id

Este é o problema. Existe uma junção cruzada entre PE e av, seguido por uma associação externa para a junção cruzada. Você tem sorte que leva apenas 30 minutos :-)

Eu acho que você quer este:

SELECT pe.prodtree_element_id prodID, pe.prodtree_element_name_s, li.line_name, av2.value
FROM prodtree_element pe
LEFT JOIN prodtree_link pl
    ON pe.prodtree_element_id = pl.to_prodtree_node_id
LEFT JOIN line li
    ON pe.line_code = li.line_code
--replacement
LEFT JOIN
attribute_values av 
         ON pe.prodtree_element_id = av.prodtree_element_id AND
         av.attribute_definition_id = #statusCode# 
--end replacement
WHERE pe.prodtree_element_func_type <> 'WIZARD'
    AND pe.prodtree_element_topo_type = 'NODE'
Respondeu 09/12/2008 em 21:05
fonte usuário

votos
0
SELECT pe.prodtree_element_id prodID, pe.prodtree_element_name_s, li.line_name, av2.value
    FROM prodtree_element pe
    LEFT JOIN prodtree_link pl
        ON (pe.prodtree_element_id = pl.to_prodtree_node_id)
    LEFT JOIN line li
        ON (pe.line_code = li.line_code)
    LEFT JOIN attribute_values av2
        ON (pe.prodtree_element_id IN (SELECT av.prodtree_element_id FROM attribute_values av WHERE av.attribute_definition_id = #statusCode#))
    WHERE pe.prodtree_element_func_type <> 'WIZARD'
        AND pe.prodtree_element_topo_type = 'NODE'

gbn acertou em cheio eu acho. Mesmo que você restringir o INNER JOIN para attribute_values ​​para um valor específico, ainda não se juntou em tudo ao seu tabela primária ou de seus relacionamentos. Assim, mesmo se você está recebendo os resultados da consulta, o meu palpite é que existem muitos.

Dependendo do que você destina e como seus dados estão na tabela de attribute_values ​​quer sua consulta ou a minha, provavelmente seria mais rápido.

Respondeu 09/12/2008 em 21:15
fonte usuário

votos
0

certificar-se de todos os seus IDs são índices também se você pode mapear o seguinte:

pe.prodtree_element_func_type <> 'WIZARD'
        AND pe.prodtree_element_topo_type = 'NODE'

para ser algo como

pe.prodtree_element_func_type_ID <> 1
            AND pe.prodtree_element_topo_type_ID = 2

a fim de reduzir as comparações de corda que leva mais tempo para concluir

Respondeu 09/12/2008 em 21:07
fonte usuário

votos
0

Você pode pesquisar milhões de registros em poucos segundos com boa otimização. Embora StingyJack está certo em que, sem saber o DDL, otimização de qualquer consulta é difícil.

Coisas para fazer embora quando otimizar uma consulta, porém, é olhar para o plano de execução. loops aninhados e similares são ruins. Também certifique-se que você está totalmente indexadas também. Você menciona nada sobre os índices das tabelas em questão. Sem índices 30 - 50k linhas pode demorar um pouco com que muitos se junta.

Respondeu 09/12/2008 em 21:06
fonte usuário

votos
0

Primeira coisa que eu sugiro é que você executá-lo através do utilitário SQL otimizador no gerenciador de empresa desde que tenha que instalou. Ele geralmente sugere índices e coisas desse tipo que poderia ter um impacto positivo sobre a velocidade de consulta.

Outras coisas a considerar seria dividindo-se a consulta. De olhares iniciais parece que você está lendo todos os elementos de produto que possuem um determinado atributo correspondente ao valor que você dá (ou algo parecido). Eu sugeriria talvez:

select * from [bigLongjoin to producttree_element]
where prodtree_element_id
in(
select prodtree_element_id from 
  attribute_values where attribute_definition_id = #statusCode#)

Executá-lo no gerenciador de empresa com o plano de consulta apresentada pode também mostrar onde os gargalos são

Respondeu 09/12/2008 em 21:03
fonte usuário

votos
0

Sem saber o DDL é muito difícil teste. 30-50K linhas ainda deve demorar apenas alguns segundos.

Tente mudar a ordenação cláusula onde. Você deveria ter isto implementado

 INNER JOIN attribute_values av
        ON av.attribute_definition_id = #statusCode# 

na cláusula onde.

Respondeu 09/12/2008 em 21:01
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more