2017-01-12 3 views
0

Я самоучка в SQL, и у меня есть грязный код, который ужасно медленный. Я визуализирую эти данные в Tableau, и представление, которое я создаю, стало настолько медленным, что мне пришлось создать таблицу (обновленную ежедневно) со всей необходимой мне информацией.Раздутый UNION ALL код (MYSQL)

Я считаю, что медленность объясняется огромным количеством заявлений UNION ALL, которые я выполняю здесь. Я делаю это для «Pivot» данных, поэтому каждый вопрос не является его собственным столбцом в БД, а скорее атрибутом каждой строки.

Может ли кто-нибудь дать несколько советов о том, как я мог бы перестроить код, чтобы ускорить его? Любая помощь или критика будут оценены, спасибо! (Ниже только Snippit моего кода, число UNION ALL блоков продолжается ....

CREATE ALGORITHM=UNDEFINED 
[email protected] 
SQL SECURITY DEFINER 
VIEW view_data435386_xxxxx_MASTER AS 


SELECT _data435386_xxxxx_1_job_profile.ID AS ID, 
_data435386_xxxxx_1_job_profile.ID AS Comment_Photos_ID, 
'Job Profile' AS Impact_Area, 
_data435386_xxxxx_1_job_profile.PARENT_RECORD_ID AS PARENT_RECORD_ID, 
_data435386_xxxxx_1_job_profile.pjq1 AS PJQ1, 
_data435386_xxxxx_1_job_profile.pjq_2 AS PJQ2, 
_data435386_xxxxx_1_job_profile.pjq_3 AS PJQ3, 
_data435386_xxxxx_1_job_profile.pjq_4 AS PJQ4, 
_data435386_xxxxx_1_job_profile.pjq_5 AS PJQ5, 
_data435386_xxxxx_1_job_profile.pjq_6 AS PJQ6, 
_data435386_xxxxx_1_job_profile.pjq_7 AS PJQ7, 
_data435386_xxxxx_1_job_profile.pjq_8 AS PJQ8, 
_data435386_xxxxx_1_job_profile.pjq_9 AS PJQ9, 
_data435386_xxxxx_1_job_profile.pjq_10 AS PJQ10, 
_data435386_xxxxx_main_form.additional_comments AS Additional_Comments, 
_data435386_xxxxx_main_form.wr_, 
NULL AS Completion_Due_Date, 
NULL AS Completion_Due_Date_1443, 
NULL AS Training_Needed, 
NULL AS Follow_Up_Description, 
REPLACE(_data435386_xxxxx_main_form.inspector, '_', ' ') AS Inspector, 
REPLACE(_data435386_xxxxx_main_form.crew_leader, '_', ' ') AS Crew_Leader, 
_data435386_xxxxx_main_form.date1 AS date1, 
REPLACE(_data435386_xxxxx_1_job_profile.district, '_', ' ') AS District, 
REPLACE(_data435386_xxxxx_1_job_profile.division, '_', ' ') AS Division, 
REPLACE(_data435386_xxxxx_1_job_profile.contractor_inspected, '_', ' ') AS Contractor_Inspected, 
301 Sample_Size_Req, 
     (CASE 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       38197 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       3734 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       5044 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       55214 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       37742 
      ELSE NULL 
     END) AS Population_size, 
'1_Job Profile' AS Results, 
3438545 AS Parent_Page_ID, 
'1.0 Job Profile' AS Task, 
'1.0 Job Profile' AS Construction_Activity, 
NULL AS Overall_Rating, 
CONCAT('https://xxxxx.xxxxx.com/exzact/dataPDF.php?TABLE_NAME=_data435386_xxxxx_main_form&ID=', 
       `_data435386_xxxxx_main_form`.`ID`, 
       '&PAGE_ID=3438731&USERNAME=xxxxx1&PASSWORD=xxxxx') AS `report_url` 
FROM 
(_data435386_xxxxx_main_form 
LEFT JOIN _data435386_xxxxx_1_job_profile ON((_data435386_xxxxx_main_form.ID = _data435386_xxxxx_1_job_profile.PARENT_RECORD_ID))) 
UNION ALL 


SELECT _data435386_xxxxx_1_job_profile.ID AS ID, 
_data435386_xxxxx_1_job_profile.ID AS Comment_Photos_ID, 
'Safety' AS Impact_Area, 
_data435386_xxxxx_1_job_profile.PARENT_RECORD_ID AS PARENT_RECORD_ID, 
_data435386_xxxxx_1_job_profile.pjq1 AS PJQ1, 
_data435386_xxxxx_1_job_profile.pjq_2 AS PJQ2, 
_data435386_xxxxx_1_job_profile.pjq_3 AS PJQ3, 
_data435386_xxxxx_1_job_profile.pjq_4 AS PJQ4, 
_data435386_xxxxx_1_job_profile.pjq_5 AS PJQ5, 
_data435386_xxxxx_1_job_profile.pjq_6 AS PJQ6, 
_data435386_xxxxx_1_job_profile.pjq_7 AS PJQ7, 
_data435386_xxxxx_1_job_profile.pjq_8 AS PJQ8, 
_data435386_xxxxx_1_job_profile.pjq_9 AS PJQ9, 
_data435386_xxxxx_1_job_profile.pjq_10 AS PJQ10, 
_data435386_xxxxx_main_form.additional_comments AS Additional_Comments, 
_data435386_xxxxx_main_form.wr_, 
NULL AS Completion_Due_Date, 
NULL AS Completion_Due_Date_1443, 
NULL AS Training_Needed, 
NULL AS Follow_Up_Description, 
REPLACE(_data435386_xxxxx_main_form.inspector, '_', ' ') AS Inspector, 
REPLACE(_data435386_xxxxx_main_form.crew_leader, '_', ' ') AS Crew_Leader, 
_data435386_xxxxx_main_form.date1 AS date1, 
REPLACE(_data435386_xxxxx_1_job_profile.district, '_', ' ') AS District, 
REPLACE(_data435386_xxxxx_1_job_profile.division, '_', ' ') AS Division, 
REPLACE(_data435386_xxxxx_1_job_profile.contractor_inspected, '_', ' ') AS Contractor_Inspected, 
301 Sample_Size_Req, 
     (CASE 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       38197 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       3734 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       5044 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       55214 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       37742 
      ELSE NULL 
     END) AS Population_size, 
21_Uses_proper_ppe AS Results, 
3438623 AS Parent_Page_ID, 
'2.1 Uses Proper PPE' AS Task, 
'2.0 Safety' AS Construction_Activity, 
NULL AS Overall_Rating, 
CONCAT('https://xxxxx.xxxxx.com/exzact/dataPDF.php?TABLE_NAME=_data435386_xxxxx_main_form&ID=', 
       `_data435386_xxxxx_main_form`.`ID`, 
       '&PAGE_ID=3438731&USERNAME=xxxxx1&PASSWORD=xxxxx') AS `report_url` 
FROM 
((_data435386_xxxxx_main_form 
LEFT JOIN view_data435386_xxxxx_2_task_successful ON((_data435386_xxxxx_main_form.ID = view_data435386_xxxxx_2_task_successful.PARENT_RECORD_ID))) 
LEFT JOIN _data435386_xxxxx_1_job_profile ON((_data435386_xxxxx_main_form.ID = _data435386_xxxxx_1_job_profile.PARENT_RECORD_ID))) 
WHERE 21_Uses_proper_ppe IS NOT NULL 
UNION ALL 





SELECT _data435386_xxxxx_1_job_profile.ID AS ID, 
view_data435386_xxxxx_2_task_successful.ID AS Comment_Photos_ID, 
'Safety' AS Impact_Area, 
_data435386_xxxxx_1_job_profile.PARENT_RECORD_ID AS PARENT_RECORD_ID, 
_data435386_xxxxx_1_job_profile.pjq1 AS PJQ1, 
_data435386_xxxxx_1_job_profile.pjq_2 AS PJQ2, 
_data435386_xxxxx_1_job_profile.pjq_3 AS PJQ3, 
_data435386_xxxxx_1_job_profile.pjq_4 AS PJQ4, 
_data435386_xxxxx_1_job_profile.pjq_5 AS PJQ5, 
_data435386_xxxxx_1_job_profile.pjq_6 AS PJQ6, 
_data435386_xxxxx_1_job_profile.pjq_7 AS PJQ7, 
_data435386_xxxxx_1_job_profile.pjq_8 AS PJQ8, 
_data435386_xxxxx_1_job_profile.pjq_9 AS PJQ9, 
_data435386_xxxxx_1_job_profile.pjq_10 AS PJQ10, 
_data435386_xxxxx_main_form.additional_comments AS Additional_Comments, 
_data435386_xxxxx_main_form.wr_, 
NULL AS Completion_Due_Date, 
NULL AS Completion_Due_Date_1443, 
NULL AS Training_Needed, 
NULL AS Follow_Up_Description, 
REPLACE(_data435386_xxxxx_main_form.inspector, '_', ' ') AS Inspector, 
REPLACE(_data435386_xxxxx_main_form.crew_leader, '_', ' ') AS Crew_Leader, 
_data435386_xxxxx_main_form.date1 AS date1, 
REPLACE(_data435386_xxxxx_1_job_profile.district, '_', ' ') AS District, 
REPLACE(_data435386_xxxxx_1_job_profile.division, '_', ' ') AS Division, 
REPLACE(_data435386_xxxxx_1_job_profile.contractor_inspected, '_', ' ') AS Contractor_Inspected, 
301 Sample_Size_Req, 
     (CASE 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       38197 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       3734 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       5044 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       55214 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       37742 
      ELSE NULL 
     END) AS Population_size, 
22_Damage_Prevention AS Results, 
3438623 AS Parent_Page_ID, 
'2.2 Damage Prevention' AS Task, 
'2.0 Safety' AS Construction_Activity, 
NULL AS Overall_Rating, 
CONCAT('https://xxxxx.xxxxx.com/exzact/dataPDF.php?TABLE_NAME=_data435386_xxxxx_main_form&ID=', 
       `_data435386_xxxxx_main_form`.`ID`, 
       '&PAGE_ID=3438731&USERNAME=xxxxx1&PASSWORD=xxxxx') AS `report_url` 
FROM 
((_data435386_xxxxx_main_form 
LEFT JOIN view_data435386_xxxxx_2_task_successful ON((_data435386_xxxxx_main_form.ID = view_data435386_xxxxx_2_task_successful.PARENT_RECORD_ID))) 
LEFT JOIN _data435386_xxxxx_1_job_profile ON((_data435386_xxxxx_main_form.ID = _data435386_xxxxx_1_job_profile.PARENT_RECORD_ID))) 
WHERE 22_Damage_Prevention IS NOT NULL 
UNION ALL 





SELECT _data435386_xxxxx_1_job_profile.ID AS ID, 
view_data435386_xxxxx_2_task_successful.ID AS Comment_Photos_ID, 
'Safety' AS Impact_Area, 
_data435386_xxxxx_1_job_profile.PARENT_RECORD_ID AS PARENT_RECORD_ID, 
_data435386_xxxxx_1_job_profile.pjq1 AS PJQ1, 
_data435386_xxxxx_1_job_profile.pjq_2 AS PJQ2, 
_data435386_xxxxx_1_job_profile.pjq_3 AS PJQ3, 
_data435386_xxxxx_1_job_profile.pjq_4 AS PJQ4, 
_data435386_xxxxx_1_job_profile.pjq_5 AS PJQ5, 
_data435386_xxxxx_1_job_profile.pjq_6 AS PJQ6, 
_data435386_xxxxx_1_job_profile.pjq_7 AS PJQ7, 
_data435386_xxxxx_1_job_profile.pjq_8 AS PJQ8, 
_data435386_xxxxx_1_job_profile.pjq_9 AS PJQ9, 
_data435386_xxxxx_1_job_profile.pjq_10 AS PJQ10, 
_data435386_xxxxx_main_form.additional_comments AS Additional_Comments, 
_data435386_xxxxx_main_form.wr_, 
NULL AS Completion_Due_Date, 
NULL AS Completion_Due_Date_1443, 
NULL AS Training_Needed, 
NULL AS Follow_Up_Description, 
REPLACE(_data435386_xxxxx_main_form.inspector, '_', ' ') AS Inspector, 
REPLACE(_data435386_xxxxx_main_form.crew_leader, '_', ' ') AS Crew_Leader, 
_data435386_xxxxx_main_form.date1 AS date1, 
REPLACE(_data435386_xxxxx_1_job_profile.district, '_', ' ') AS District, 
REPLACE(_data435386_xxxxx_1_job_profile.division, '_', ' ') AS Division, 
REPLACE(_data435386_xxxxx_1_job_profile.contractor_inspected, '_', ' ') AS Contractor_Inspected, 
301 Sample_Size_Req, 
     (CASE 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       38197 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       3734 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       5044 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       55214 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       37742 
      ELSE NULL 
     END) AS Population_size, 
23_fire_bottle_and_no_smoking_sign AS Results, 
3438623 AS Parent_Page_ID, 
'2.3 Fire Bottle and No Smoking Sign' AS Task, 
'2.0 Safety' AS Construction_Activity, 
NULL AS Overall_Rating, 
CONCAT('https://xxxxx.xxxxx.com/exzact/dataPDF.php?TABLE_NAME=_data435386_xxxxx_main_form&ID=', 
       `_data435386_xxxxx_main_form`.`ID`, 
       '&PAGE_ID=3438731&USERNAME=xxxxx1&PASSWORD=xxxxx') AS `report_url` 
FROM 
((_data435386_xxxxx_main_form 
LEFT JOIN view_data435386_xxxxx_2_task_successful ON((_data435386_xxxxx_main_form.ID = view_data435386_xxxxx_2_task_successful.PARENT_RECORD_ID))) 
LEFT JOIN _data435386_xxxxx_1_job_profile ON((_data435386_xxxxx_main_form.ID = _data435386_xxxxx_1_job_profile.PARENT_RECORD_ID))) 
WHERE 23_fire_bottle_and_no_smoking_sign IS NOT NULL 
UNION ALL 





SELECT _data435386_xxxxx_1_job_profile.ID AS ID, 
view_data435386_xxxxx_2_task_successful.ID AS Comment_Photos_ID, 
'Safety' AS Impact_Area, 
_data435386_xxxxx_1_job_profile.PARENT_RECORD_ID AS PARENT_RECORD_ID, 
_data435386_xxxxx_1_job_profile.pjq1 AS PJQ1, 
_data435386_xxxxx_1_job_profile.pjq_2 AS PJQ2, 
_data435386_xxxxx_1_job_profile.pjq_3 AS PJQ3, 
_data435386_xxxxx_1_job_profile.pjq_4 AS PJQ4, 
_data435386_xxxxx_1_job_profile.pjq_5 AS PJQ5, 
_data435386_xxxxx_1_job_profile.pjq_6 AS PJQ6, 
_data435386_xxxxx_1_job_profile.pjq_7 AS PJQ7, 
_data435386_xxxxx_1_job_profile.pjq_8 AS PJQ8, 
_data435386_xxxxx_1_job_profile.pjq_9 AS PJQ9, 
_data435386_xxxxx_1_job_profile.pjq_10 AS PJQ10, 
_data435386_xxxxx_main_form.additional_comments AS Additional_Comments, 
_data435386_xxxxx_main_form.wr_, 
NULL AS Completion_Due_Date, 
NULL AS Completion_Due_Date_1443, 
NULL AS Training_Needed, 
NULL AS Follow_Up_Description, 
REPLACE(_data435386_xxxxx_main_form.inspector, '_', ' ') AS Inspector, 
REPLACE(_data435386_xxxxx_main_form.crew_leader, '_', ' ') AS Crew_Leader, 
_data435386_xxxxx_main_form.date1 AS date1, 
REPLACE(_data435386_xxxxx_1_job_profile.district, '_', ' ') AS District, 
REPLACE(_data435386_xxxxx_1_job_profile.division, '_', ' ') AS Division, 
REPLACE(_data435386_xxxxx_1_job_profile.contractor_inspected, '_', ' ') AS Contractor_Inspected, 
NULL Sample_Size_Req, 
     (CASE 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       38197 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       3734 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       5044 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       55214 
      WHEN 
       (_data435386_xxxxx_1_job_profile.division = 'xxxxx') 
      THEN 
       37742 
      ELSE NULL 
     END) AS Population_size, 
24_traffic_control_plan AS Results, 
3438623 AS Parent_Page_ID, 
'2.4 Traffic Control Plan' AS Task, 
'2.0 Safety' AS Construction_Activity, 
NULL AS Overall_Rating, 
CONCAT('https://xxxxx.xxxxx.com/exzact/dataPDF.php?TABLE_NAME=_data435386_xxxxx_main_form&ID=', 
       `_data435386_xxxxx_main_form`.`ID`, 
       '&PAGE_ID=3438731&USERNAME=xxxxx1&PASSWORD=xxxxx') AS `report_url` 
FROM 
((_data435386_xxxxx_main_form 
LEFT JOIN view_data435386_xxxxx_2_task_successful ON((_data435386_xxxxx_main_form.ID = view_data435386_xxxxx_2_task_successful.PARENT_RECORD_ID))) 
LEFT JOIN _data435386_xxxxx_1_job_profile ON((_data435386_xxxxx_main_form.ID = _data435386_xxxxx_1_job_profile.PARENT_RECORD_ID))) 
WHERE 24_traffic_control_plan IS NOT NULL 
UNION ALL 
+0

'UNION's, как правило, не особенно интенсивно работают, поскольку они немного больше, чем добавление одного набора результатов в другое; вам лучше смотреть на результаты запросов, которые объединяются. – Uueerdo

+0

Пожалуйста, выделите разницу между выборами. –

ответ

0

Похоже, некоторые из запросов, являющихся UNIONed почти идентичны и служат только для получения нескольких строк результата с различными Results и Task, вы можете захотеть просмотреть объединение этих запросов или вставить единый (со всеми значениями для полей Results как отдельные поля) версию запроса в промежуточную (псевдо-временную) таблицу, а затем упростить запросы UNIONing что

Под «промежуточным (псевдо-временным)» я имею в виду не временную таблицу, которую вы не намерены ер; Я бы предложил таблицу TEMPORARY, но MySQL не позволяет ссылаться более одного раза в одном запросе (например, UNION или self-JOINs).


Edit: Это также не ясно, какие таблицы в Result значения поступают из; если они не от _data435386_xxxxx_main_form, то у вас есть несколько ЛЕВЫХ СОЕДИНЕНИЙ, которые могут быть ВНУТРЕННЫМИ ОБЪЕДИНЯМИ.