SQL несколько таблиц - очень медленно - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь закрепить отчет SQL Server относительно операционной системы IBM OS / 400 для моего отдела продаж.

Мой коллега (который покинул компанию) сделал этот отчет и использовал тонну субселектов.

Отчет обычно занимает около 30 минут для обработки и часто просто не отображается. Я уже пытался вырезать некоторые таблицы / строки в надежде безуспешно ускорить процесс (все это необходимо отделу продаж).

Работает над всеми соответствующими данными (заказы, клиенты, изделия, наш заказ у производителя, у производителя и т. Д.). Есть идеи?

Я не могу индексировать его из-за системы OS / 400; думаю, для нашего подрядчика это станет новой задачей программирования, которая приведет к затратам.

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

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Используете ли вы 4 части имен в вашем запросе? Это, вероятно, ваша проблема ...

С сервера SQL ...

- Вытащить все строки из таблицы (таблиц) обратно на сервер MS SQL и выполнить локальный поиск на сервере MS SQL
select * from LINKEDSVR.MYIBMI.MYLIB.MYTBL where locnbr = '00335';

- отправляет инструкцию на сервер IBM i для обработки, возвращаются только результаты ..
select * from openquery(LINKEDSVR, 'select * from MYTBL where locnbr = ''00335''');

0 голосов
/ 04 июля 2018

Попробуйте сначала запустить подвыборы, отправив вывод каждого из них в свою таблицу.

Обновление статистики по таблицам. Затем запустите оставшуюся часть SQL, заменив исходные подвыборы таблицами, созданными на первом шаге.

Обрабатывайте несколько уровней вложения одинаково: каждый слой является отдельной вставкой в ​​другую таблицу.

Я обнаружил, что оптимизаторам запросов сложно работать со сложным SQL. Разделение подзапросов на отдельные шаги часто решает эту проблему.

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

Ответ на комментарии ластика

Предполагается, что ваш исходный запрос принимает следующую общую форму:

select [columns] from 
(-- subquery
    select [columns] from TableA
) as Subquery
from TableB
where mainquery_where_clause

Re-запись:

-- Create a table to handle results for your subquery:
Create Table A ;

-- Update the data distribution statistics:
update stats (TableA) ;

-- Now run the subquery:
insert into SubQTable select [columns] from TableA

-- Now run the re-written main query:
Select [columns]
from TableA, TableB
where TableA.joincol = TableB.joincol
and mainquery_where_clause ;

Я заметил некоторые синтаксические проблемы с опубликованным вами SQL. Похоже, что-то упущено. Но принцип моего ответа остается прежним. Обратите внимание, что применение моего предложения может не помочь, поскольку в вашем сценарии потенциально много переменных; Вы упомянули подзапросы, поэтому я решил обратиться к этому.

Идея Хальфера отличная: отредактируйте исходный вопрос, добавив код SQL и поместив его в "{}", предоставленный инструментом редактирования текста.

Я настоятельно рекомендую вам получить план выполнения SQL и опубликовать результаты.

...