Длинный выбор занимает 55 секунд, чтобы отобразить результат, лучший способ проконсультироваться? - PullRequest
0 голосов
/ 11 декабря 2018

Введение

Привет всем, я пытаюсь получить большой выбор, но у меня есть принципиальная проблема, этот запрос занимает более 55 секунд, чтобы отобразить 13 000 строк, потому что есть 4 подзапроса (поиск к одной и той же таблице):

  1. СВЯЗЬ С РОДИТЕЛЕМ ТАК АВТО
  2. СВЯЗЬ С РОДИТЕЛЕМ ТАК ЛИНИЯ АВТО
  3. ДАТА СОЗДАНА PLSO AUT
  4. PLSOAUT SHIPPED DATE

Эти 4 столбца будут получать данные только тогда, когда DEM_TYPE равен 'WO' , поэтому я и включаю каждый подзапрос CASE WHEN .

Если DEM_TYPE не 'WO', эти 4 столбца будут NULL

Мне просто нужна первая строка, найденная в подпрограмме-просмотр, вот почему я использовал TOP 1.

Далее я покажу вам запрос и результат таблицы

CREATE UNIQUE INDEX  IDX_TMP
    ON ENT_DEMAND_SUPPLY(ROWID);
    SELECT ONE.ROWID, ONE.PLANNER, ONE.BUYER, ONE.DEM_TYPE, ONE.DEM_SOURCE, ONE.DEM_SOURCE_LINE, ONE.DEM_PART_ID, ONE.[PART ID DESCRIPTION], ONE.DEM_QTY, ONE.ACUM_ASSIGN_QTY, ONE.ASSIGNED_QTY, ONE.SUPPLY_TYPE, ONE.SUPPLY_SOURCE, ONE.SUPPLY_SOURCE_LINE, ONE.SUPPLY_QTY, ONE.REST_QTY, ONE.SUPPLIER, ONE.[PO STATUS], ONE.[WO STATUS],   ONE.[SO CREATED DATE], ONE.[WO CREATED DATE], ONE.[SO PROMISE SHIP DATE PER LINE], ONE.[WO RELEASE DATE], ONE.[PO PLACE DATE], ONE.[SITE ARRIVAL], ONE.[UPDATE SHIP DATE], ONE.[INITIAL SHIP DATE], ONE.[LEAD TIME PROVIDE]  AS 'LEAD TIME PROVIDE BY SCHEDULER', ONE.[LEAD TIME REQUIRED TO SUPPLIER], ONE.[LEAD TIME STANDARD], ONE.[QUALITY WAREHOUSE], ONE.COMMENTS, ONE.[SO LINK ERP], ONE.[SO LINE LINK ERP], ONE.[PARENT LINK SO ERP], ONE.[PARENT LINK SO LINE ERP], ONE.PLSO_ERP_CREATE_DATE, ONE.PLSO_ERP_SHIPPED_DATE
    ,CASE WHEN ONE.DEM_TYPE = 'WO' THEN  (SELECT TOP 1 DEM_SOURCE FROM ENT_DEMAND_SUPPLY  WHERE SUPPLY_TYPE = 'WO' AND SUPPLY_SOURCE = ONE.DEM_SOURCE AND SUPPLY_SOURCE_LINE = ONE.DEM_SOURCE_LINE ORDER BY DEM_PART_ID, DEM_DATE) ELSE NULL END AS 'PARENT LINK SO AUT'
    ,CASE WHEN ONE.DEM_TYPE = 'WO' THEN  (SELECT TOP 1 DEM_SOURCE_LINE FROM ENT_DEMAND_SUPPLY  WHERE SUPPLY_TYPE = 'WO' AND SUPPLY_SOURCE = ONE.DEM_SOURCE AND SUPPLY_SOURCE_LINE = ONE.DEM_SOURCE_LINE ORDER BY DEM_PART_ID, DEM_DATE) ELSE NULL END AS 'PARENT LINK SO LINE AUT'
    ,CASE WHEN ONE.DEM_TYPE = 'WO' THEN  (SELECT TOP 1 [PLSO_ERP_CREATE_DATE] FROM ENT_DEMAND_SUPPLY  WHERE SUPPLY_TYPE = 'WO' AND SUPPLY_SOURCE = ONE.DEM_SOURCE AND SUPPLY_SOURCE_LINE = ONE.DEM_SOURCE_LINE ORDER BY DEM_PART_ID, DEM_DATE) ELSE NULL END AS 'PLSO AUT CREATED DATE'
    ,CASE WHEN ONE.DEM_TYPE = 'WO' THEN  (SELECT TOP 1 [PLSO_ERP_SHIPPED_DATE] FROM ENT_DEMAND_SUPPLY  WHERE SUPPLY_TYPE = 'WO' AND SUPPLY_SOURCE = ONE.DEM_SOURCE AND SUPPLY_SOURCE_LINE = ONE.DEM_SOURCE_LINE ORDER BY DEM_PART_ID, DEM_DATE) ELSE NULL END AS 'PLSO AUT SHIPPED DATE'
    FROM ENT_DEMAND_SUPPLY ONE
    ORDER BY ONE.DEM_PART_ID, ONE.DEM_DATE
    DROP INDEX ENT_DEMAND_SUPPLY.IDX_TMP

Таблица результатов часть 1 Результат таблицы часть 2

Как видите, в строке №.8 DEM_TYPE представляет собой 'WO' с DEM_SOURCE со значением 12900 и DEM_SOURCE_LINE со значением 1 (часть результатов таблицы 1), поэтому вв этом случае будет выполнен подзапрос 4 (результат таблицы 2)

* На рисунке №.2, столбцы PLSO AUT CREATED DATE и PLSO AUT DIPPED DATE имеют значение ПУСТО (NULL), это верно, поскольку эти записи могут существовать или нет


SubЛогика запросов

Логика этого материала такова: мне нужно найти DEM_SOURCE в SUPPLY_SOURCE и DEM_SOURCE_LINE в SUPPLY_SOURCE_LINE во всей таблице, я имею в виду, например, что мы возвращаемся к строке номер 8.

если мы возьмем строку нет.8 у нас есть эти значения ... DEM_TYPE = 'WO', DEM_SOURCE: 12900 и DEM_SOURCE_LINE = 1, я могу подготовить подзапрос для поиска и получить 4 дополнительных столбца для этой строки, например:

(SELECT TOP 1 DEM_SOURCE FROM ENT_DEMAND_SUPPLY  WHERE SUPPLY_TYPE = 'WO' AND SUPPLY_SOURCE = '12900' AND SUPPLY_SOURCE_LINE = '1')

Результат подзапроса

и если вы проверите номер изображения.2, эти 4 значения будут в последних 4 столбцах с 4 именами, о которых мы говорили в начале ... Этим процессом я должен сделать это для каждой строки, когда DEM_TYPE - «WO», кто-то знает, как я могу улучшить это?Я пытался с индексом, это помогает, но не достаточно быстро.Большое спасибо за то, что нашли время прочитать этот пост, пожалуйста, если у вас есть вопросы или советы, пожалуйста, дайте мне знать!

1 Ответ

0 голосов
/ 12 декабря 2018

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

Я надеюсь, что вы создали индексирование для SUPPLY_TYPE,SUPPLY_SOURCE, SUPPLY_SOURCE_LINE, так как это могло бы улучшить время запроса.

Для вашего вопроса вы можете использовать OUTER APPLY - Sql server cross apply и external apply

Myне проверенный и быстрый ответ будет (все еще есть место для изменения):

SELECT
    ONE.ROWID, ONE.PLANNER, ONE.BUYER, ONE.DEM_TYPE, ONE.DEM_SOURCE, ONE.DEM_SOURCE_LINE, ONE.DEM_PART_ID, ONE.[PART ID DESCRIPTION], ONE.DEM_QTY, ONE.ACUM_ASSIGN_QTY, ONE.ASSIGNED_QTY, ONE.SUPPLY_TYPE, ONE.SUPPLY_SOURCE, ONE.SUPPLY_SOURCE_LINE, ONE.SUPPLY_QTY, ONE.REST_QTY, ONE.SUPPLIER, ONE.[PO STATUS], ONE.[WO STATUS],   ONE.[SO CREATED DATE], ONE.[WO CREATED DATE], ONE.[SO PROMISE SHIP DATE PER LINE], ONE.[WO RELEASE DATE], ONE.[PO PLACE DATE], ONE.[SITE ARRIVAL], ONE.[UPDATE SHIP DATE], ONE.[INITIAL SHIP DATE], ONE.[LEAD TIME PROVIDE]  AS 'LEAD TIME PROVIDE BY SCHEDULER', ONE.[LEAD TIME REQUIRED TO SUPPLIER], ONE.[LEAD TIME STANDARD], ONE.[QUALITY WAREHOUSE], ONE.COMMENTS, ONE.[SO LINK ERP], ONE.[SO LINE LINK ERP], ONE.[PARENT LINK SO ERP], ONE.[PARENT LINK SO LINE ERP], ONE.PLSO_ERP_CREATE_DATE, ONE.PLSO_ERP_SHIPPED_DATE
    ,CASE WHEN ONE.DEM_TYPE = 'WO' THEN [Table2].[DEM_SOURCE] ELSE NULL END AS 'PARENT LINK SO AUT'
    ,CASE WHEN ONE.DEM_TYPE = 'WO' THEN [Table2].[DEM_SOURCE_LINE] ELSE NULL END AS 'PARENT LINK SO LINE AUT'
    ,CASE WHEN ONE.DEM_TYPE = 'WO' THEN [Table2].[PLSO_ERP_CREATE_DATE] ELSE NULL END AS 'PLSO AUT CREATED DATE'
    ,CASE WHEN ONE.DEM_TYPE = 'WO' THEN [Table2].[PLSO_ERP_SHIPPED_DATE] ELSE NULL END AS 'PLSO AUT SHIPPED DATE'
FROM
    ENT_DEMAN_SUPPLY ONE
OUTER APPLY(
    SELECT TOP 1
        DEM_SOURCE
        ,DEM_SOURCE_LINE
        ,PLSO_ERP_CREATE_DATE
        ,PLSO_ERP_SHIPPED_DATE
    FROM
        ENT_DEMAND_SUPPLY [TWO]
    WHERE --These columns should be indexed
        [TWO].SUPPLY_TYPE = 'WO'
        AND [TWO].SUPPLY_SOURCE = ONE.DEM_SOURCE
        AND [TWO].SUPPLY_SOURCE_LINE = ONE.DEM_SOURCE_LINE
) [Table2]
ORDER BY ONE.DEM_PART_ID, ONE.DEM_DATE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...