Я хотел бы использовать подзапрос (который принимает разные входные данные) несколько раз и присоединиться к родительскому запросу. Здесь проблема в том, что запрос занимает несколько минут. Каков наилучший способ оптимизировать следующий запрос.

SELECT A.PROJECT_ID,A.PROJECT_BASIC_INFORMATION_ID,B.VALUE AS BU_START_DATE,C.VALUE AS BU_DURATION,D.VALUE AS BU_AMOUNT,E.VALUE AS PLUG FROM 
PROJECT_BASIC_INFORMATION A,
CUSTOM_ATTRIBUTES_VALUES B,
CUSTOM_ATTRIBUTES_VALUES C,
CUSTOM_ATTRIBUTES_VALUES D,
CUSTOM_ATTRIBUTES_VALUES E
WHERE 
A.TENANT_ID = '100' AND
B.MAP_ID = (SELECT MST_ATTRIBUTE_ID FROM `MST_TENANT_CUSTOM_ATTRIBUTES` 
WHERE LABEL='Budget Project Savings Start Date' AND 
TENANT_ID='100') AND
C.MAP_ID = (SELECT MST_ATTRIBUTE_ID FROM `MST_TENANT_CUSTOM_ATTRIBUTES` 
WHERE LABEL='Budget Savings Duration' AND 
TENANT_ID='100') AND
D.MAP_ID = (SELECT MST_ATTRIBUTE_ID FROM `MST_TENANT_CUSTOM_ATTRIBUTES` 
WHERE LABEL='Budget Annualized Savings' AND 
TENANT_ID='100') AND
E.MAP_ID = (SELECT MST_ATTRIBUTE_ID FROM `MST_TENANT_CUSTOM_ATTRIBUTES` 
WHERE LABEL='Plug' AND 
TENANT_ID='100')

GROUP BY A.PROJECT_BASIC_INFORMATION_ID ORDER BY A.PROJECT_ID

Спасибо.

0
eshaa 7 Май 2014 в 16:28

2 ответа

Лучший ответ

Вы убиваете себя всеми подзапросами в таблице master_attribute_id. Я изменил запрос на выполнение СОЕДИНЕНИЙ. Начните с вашего исходного псевдонима «A», но затем выполните СОЕДИНЕНИЕ с каждой таблицей атрибутов на том же «A.TENANT_ID» (не фиксированное значение), но ТАКЖЕ для каждого экземпляра дополнительно И ... LABEL = 'независимо'. Таким образом, каждое соединение получает настраиваемый атрибут для одного и того же клиента и метки. Теперь из каждого из них присоединитесь к таблице атрибутов по MAP_ID. Так что мои псевдонимы связаны с таблицей «CAV» (custom_Addtribute_Values) плюс A, B, C, D по мере необходимости. Следовательно, вам нужен только фактический идентификатор клиента во внешнем предложении WHERE.

Теперь, чтобы помочь обеспечить оптимизацию запроса, вашу таблицу MST_TENANT_CUSTOM_ATTRIBUTES, я хотел бы иметь покрывающий индекс на (tenant_id, label, map_id). Для таблицы Custom_Attributes_Values ​​у меня был бы индекс на (map_id, value)

SELECT 
      A.PROJECT_ID,
      A.PROJECT_BASIC_INFORMATION_ID,
      CAV_A.VALUE AS BU_START_DATE,
      CAV_B.VALUE AS BU_DURATION,
      CAV_C.VALUE AS BU_AMOUNT,
      E.VALUE AS PLUG 
   FROM 
      PROJECT_BASIC_INFORMATION A
         JOIN MST_TENANT_CUSTOM_ATTRIBUTES MT_A
            ON A.TENANT_ID = MT_A.TENANT_ID
            AND MT_A.LABEL = 'Budget Project Savings Start Date' 
            JOIN CUSTOM_ATTRIBUTES_VALUES A
               ON MT_A.MAP_ID = CAV_A.MAP_ID

         JOIN MST_TENANT_CUSTOM_ATTRIBUTES MT_B
            ON A.TENANT_ID = MT_B.TENANT_ID
            AND MA_B.LABEL = 'Budget Savings Duration' 
            JOIN CUSTOM_ATTRIBUTES_VALUES B
               ON MT_B.MAP_ID = CAV_B.MAP_ID

         JOIN MST_TENANT_CUSTOM_ATTRIBUTES MT_C
            ON A.TENANT_ID = MT_C.TENANT_ID
            AND MA_C.LABEL = 'Budget Annualized Savings'
            JOIN CUSTOM_ATTRIBUTES_VALUES C
               ON MT_C.MAP_ID = CAV_C.MAP_ID

         JOIN MST_TENANT_CUSTOM_ATTRIBUTES MT_D
            ON A.TENANT_ID = MT_D.TENANT_ID
            AND MA_D.LABEL = 'Plug' 
            JOIN CUSTOM_ATTRIBUTES_VALUES D
               ON MT_D.MAP_ID = CAV_D.MAP_ID
   WHERE 
      A.TENANT_ID = 100
   GROUP BY 
      A.PROJECT_BASIC_INFORMATION_ID 
   ORDER BY 
      A.PROJECT_ID
0
DRapp 7 Май 2014 в 13:28

Должно быть возможно что-то подобное. К сожалению, не проверял, работает ли он.

SELECT 
      A.PROJECT_ID,
      A.PROJECT_BASIC_INFORMATION_ID,
      IF(MT_A.LABEL='Budget Project Savings Start Date',CAV.VALUE,NULL) AS BU_START_DATE,
      IF(MT_A.LABEL='Budget Savings Duration',CAV.VALUE,NULL) AS BU_DURATION,
      IF(MT_A.LABEL='Budget Annualized Savings',CAV.VALUE,NULL) AS BU_AMOUNT,
      IF(MT_A.LABEL='Plug',CAV.VALUE,NULL) AS PLUG,
   FROM 
      PROJECT_BASIC_INFORMATION A
         JOIN MST_TENANT_CUSTOM_ATTRIBUTES MT_A
            ON A.TENANT_ID = MT_A.TENANT_ID
            AND MT_A.LABEL in ('Budget Project Savings Start Date',
                               'Budget Savings Duration',
                               'Budget Annualized Savings',
                               'Plug')
            JOIN CUSTOM_ATTRIBUTES_VALUES CAV
               ON MT_A.MAP_ID = CAV.MAP_ID
   WHERE 
      A.TENANT_ID = 100
   GROUP BY 
      A.PROJECT_ID,A.PROJECT_BASIC_INFORMATION_ID 
   ORDER BY 
      A.PROJECT_ID
0
Naeel Maqsudov 7 Май 2014 в 14:32