Необходимо ускорить этот запрос в SQL Server

голоса
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» статический идентификатор, который соответствует идентификатору в таблице определения атрибутов (скажем, 22 ради аргумента). Проблема заключается в том, запрос имеет некоторые массивные проблемы отделки в любой здравомыслящий количество времени. Чем больше проблема, я своего рода нужно, чтобы закончить раньше, но количество записей велико, что он должен сделать обратно (около 30-50,000). Мне нужны данные из нескольких таблиц, которые, где она начинает замедляться. Это только часть того, что мне нужно, мне также нужна целые другие таблицы на сумму данных, соответствующих текущий «prodtree_elment_id».

Я использую ColdFusion, но даже при выполнении запроса непосредственно в SQL Server 2005 создает 15-30 + минутное ожидание для запроса (если это даже заканчивается). Есть ли мыслимо способ ускорить этот запрос, чтобы взять максимум 5 минут или меньше?

Задан 09/12/2008 в 20:54
источник пользователем
На других языках...                            


6 ответов

голоса
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

Это проблема. Существует поперечное соединение между ре и пр, а затем с помощью внешнего соединения на перекрестное соединение. Тебе повезло, что это займет всего 30 минут :-)

Я думаю, что вы хотите:

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'
Ответил 09/12/2008 в 21:05
источник пользователем

голоса
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'

ГБН прибил его, я думаю. Даже если ограничить внутреннее соединение с attribute_values ​​к определенному значению, оно все еще не присоединились вообще к вашей основной таблице или ее отношениям. Таким образом, даже если вы получаете результаты из запроса, я думаю, что есть слишком много.

В зависимости от того, что вы хотели и как ваши данные в таблице attribute_values ​​либо его запрос или мина, вероятно, будет быстрее.

Ответил 09/12/2008 в 21:15
источник пользователем

голоса
0

убедитесь, что все идентификаторы ваши являются индексы также, если вы можете отобразить следующее:

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

чтобы быть что-то вроде

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

для того, чтобы уменьшить сравнение строк, что требуется больше времени для завершения

Ответил 09/12/2008 в 21:07
источник пользователем

голоса
0

Вы можете найти миллионы записей в течение нескольких секунд с хорошей оптимизацией. Хотя StingyJack прав в том, что, не зная DDL, оптимизация любого запроса является жесткой.

Вещи, чтобы сделать хотя при оптимизации запроса, хотя это посмотреть план выполнения. Вложенные циклы и т.п. плохо. Кроме того, убедитесь, что вы полностью проиндексированы, а также. Вы не говоря уже о индексах таблиц в вопросе. Без индексов 30 - 50k строк могут занять некоторое время с этим многими соединениями.

Ответил 09/12/2008 в 21:06
источник пользователем

голоса
0

Первое, что я хотел бы предложить, что вы запустите его с помощью утилиты SQL оптимизатора в менеджер предприятия при условии, что у вас есть установлен. Как правило, он предполагает, индексы и тому подобное, которые могут оказать положительное влияние на скорость запроса.

Другие вещи, чтобы рассмотреть бы раскалывается запрос. От первоначальных взглядов он выглядит, как вы читаете все элементы продукта, которые имеют определенный атрибут, соответствующее значение вы даете (или что-то подобное). Я хотел бы предложить, может быть:

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

Запуск его в менеджере предприятия с планом запроса отображается также может показать вам, где бутылку шейки

Ответил 09/12/2008 в 21:03
источник пользователем

голоса
0

Не зная DDL его очень трудно проверить. 30-50K строки должны по-прежнему занимает всего несколько секунд.

Попробуйте изменить порядок ИНЕК. Вы должны, вероятно, это реализовано

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

в пункте где.

Ответил 09/12/2008 в 21:01
источник пользователем

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