Hi , *Please help in optimizing this query. I need to actually generate reports daily using this query.. It takes almost 15 to 20 min to execute this query due to joins.. * *Here common_details is a jsonB column.*
SELECT T.order_id, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'srType' :: text AS product, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'mobileNumber' :: text AS msisdn, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'alternateNumber' :: text AS alternate_number, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'circle' :: text AS parent_circle, T.circle, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'srNumber' :: text AS complaint_number, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'caseType' :: text AS complaint_type, ( ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'status' :: text ) AS status, T.status AS task_status, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'subType' :: text AS SUBTYPE, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'subSubType' :: text AS subsubtype, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'source' :: text AS source, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'custType' :: text AS customer_type, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'custClass' :: text AS customer_class, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'custValue' :: text AS customer_value, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'accountNumber' :: text AS account_number, To_char(( ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'slaDt' :: text ) :: timestamp, 'DD/MM/YYYY HH24:MI:SS') AS sladt, To_char(( ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'srDt' :: text ) :: timestamp, 'DD/MM/YYYY HH24:MI:SS') AS sr_date, CASE Lower(T.status) WHEN 'reopen' THEN NULL ELSE To_char(( totalTimeJoin.modified_date ), 'DD/MM/YYYY HH24:MI:SS') END AS resolutiondatetime, To_char(reopenJoin.modified_date, 'DD/MM/YYYY HH24:MI:SS') AS reopen_date, T.dynamic_data ->> 'resolution_code' :: text AS rc, T.dynamic_data ->> 'fault_found_code' :: text AS ffc, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'servingCellId' :: text AS serving_cell_id, Coalesce(( ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'servingSiteId' :: text ), ( ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'producthandsetType' :: text ) ) AS servingsiteid, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'customerLat' :: text AS customer_lat, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'customerLng' :: text AS customer_long, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'thanksCustomer' :: text AS thanks_flag, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'custValue' :: text AS black_flag, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'caseType' :: text AS sr_ftr, T.dynamic_data ->> 'dsl_connection' :: text AS dsl, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'appInstalled' :: text AS app_installed, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'voiceMOU' :: text AS voice_mou, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'dataConsumed' :: text AS data_mou, ( T.common_details -> 'commonDetails' :: text ) ->> 'sourceChannel' :: text AS lob, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'issue' :: text AS category, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'handsetType' :: text AS handset_type, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'coverageType' :: text AS technology, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'USIMStatus' :: text AS usim, T.dynamic_data ->> 'solution_suggested' :: text AS solution_suggested, T.dynamic_data ->> 'solution_to_be_implemented' :: text AS solution_to_be_implemented, T.dynamic_data ->> 'solution_implemented' :: text AS solution_implemented, To_char(npiActionJoin.modified_date, 'DD/MM/YYYY HH24:MI:SS') AS npi_action_date, To_char(T.created_date, 'DD/MM/YYYY HH24:MI:SS') AS order_created_date, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'partyName' :: text AS customer_name, T.pincode, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'address' :: text AS address, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'problemLocation' :: text AS problematic_location, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'specialCust' :: text AS customer_type1, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'gridId' :: text AS grid_id, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'dffIndoorOutdoor' :: text AS dff_indoor_outdoor, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'problemSince' :: text AS problem_duration, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'signalsNumber' :: text AS number_of_signals, ( ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'escalationFlag' :: text ) AS escalationflag, ( ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'escalationCount' :: text ) AS escalationCount, To_char(( ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'escalationDate' :: text ) :: timestamp, 'DD/MM/YYYY HH24:MI:SS') AS escalationDate, ( ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'escalationSource' :: text ) AS escalationsource, T.pending_with, T.pending_with_details, T.pending_with_role, T.agency_name AS agency, To_char(( T.dynamic_data ->> 'appoinment_date' :: text ) :: timestamp, 'DD/MM/YYYY HH24:MI:SS') AS survey_visit_date, surveyJoin.pending_with AS survey_engineer, surveyJoin.pending_with_details AS survey_engineer_msisdn, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'serviceImpactingAlarmsName' :: text AS service_impacting_alarm, tsgJoin.pending_with AS tsg_advisor, tsgJoin.pending_with_details AS tsg_advisor_msisdn, T.dynamic_data ->> 'planned_site_id' :: text AS planned_site_id, T.dynamic_data ->> 'planned_site_id_rfs_timeline' :: text AS planned_site_timeline, T.dynamic_data ->> 'status_of_planned_site' :: text AS planned_site_status, T.dynamic_data ->> 'upgrade_site_id' :: text AS upgrade_site, T.dynamic_data ->> 'upgrade_site_id_rfs_timeline' :: text AS upgrade_site_timeline, T.dynamic_data ->> 'status_of_ugrade_planned' :: text AS upgrade_site_status, T.dynamic_data ->> 'sector_addition_status' :: text AS sector_addition_twinbeam_status, To_char(installationJoin.modified_date, 'DD/MM/YYYY HH24:MI:SS') AS installation_date, To_char(repairJoin.modified_date, 'DD/MM/YYYY HH24:MI:SS') AS repair_date, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'haltedSiteId' :: text AS halted_site, engineerDetailsJoin.pending_with AS npi_engineer_name, engineerDetailsJoin.pending_with_details AS npi_engineer_msisdn, To_char(npiBucketJoin.modified_date, 'DD/MM/YYYY HH24:MI:SS') AS npi_bucket_date, T.dynamic_data ->> 'wo_number' :: text AS operations_internal_work_order, T.dynamic_data ->> 'final_2g_serving_cell_id' :: text AS final_2g_serving_cell_id, T.dynamic_data ->> 'final_2g_serving_site_id' :: text AS final_2g_serving_site_id_mo, T.dynamic_data ->> 'final_3g_serving_cell_id' :: text AS final_3g_serving_cell_id, T.dynamic_data ->> 'final_3g_serving_site_id' :: text AS final_3g_serving_site_id_mo, T.dynamic_data ->> 'final_4g_serving_cell_id' :: text AS final_4g_serving_cell_id, T.dynamic_data ->> 'final_4g_serving_site_id' :: text AS final_4g_serving_site_id_mo, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'rm' :: text AS rm_mobile_number, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'tl' :: text AS tl_mobile_number, ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'coordinator' :: text AS coordinator_mobile_number, T.dynamic_data ->> 'dpr_key' :: text AS dpr_key, ( ( ( T.common_details -> 'commonDetails' :: text ) -> 'bundle' :: text ) ->> 'srSummary' :: text ) AS srsummary, T.dynamic_data ->> 'survey_remarks' :: text AS survey_summary, T.dynamic_data ->> 'npi_remarks' :: text AS npi_remarks FROM (((((((((T T left join (SELECT ts.txn_id, ts.pending_with, ts.pending_with_details, ts.pending_with_role, ts.modified_date, Row_number() over ( PARTITION BY ts.txn_id ORDER BY ts.modified_date DESC) AS rn FROM task_history ts WHERE ( ( ts.organisation_process_path = 'B' ) AND ( ( ts.status ) = ANY ( ( array ['Survey Planned', 'Femto SR to Survey Engineer', 'Repeater SR to Survey Engineer' , 'Circle OPS Survey Planned - Femto repair' , 'SR sent for initial survey' ] )) ) )) surveyJoin ON (( ( T.txn_id = surveyJoin.txn_id ) AND ( surveyJoin.rn = 1 ) ))) left join (SELECT ts.txn_id, ts.pending_with, ts.pending_with_details, ts.pending_with_role, ts.modified_date, Row_number() over ( PARTITION BY ts.txn_id ORDER BY ts.modified_date DESC) AS rn FROM task_history ts WHERE ( ( ts.organisation_process_path = 'B' ) AND ( ( ts.status ) = 'SR with TSG hub' ) )) tsgJoin ON (( ( T.txn_id = tsgJoin.txn_id ) AND ( tsgJoin.rn = 1 ) ))) left join (SELECT ts.txn_id, ts.modified_date, Row_number() over ( PARTITION BY ts.txn_id ORDER BY ts.modified_date DESC) AS rn FROM task_history ts WHERE ( ( ts.organisation_process_path = 'B' ) AND ( ( ts.status ) = ANY (( array ['Femto Installed' , 'Repeater Installed' ] )) ) )) installationJoin ON (( ( T.txn_id = installationJoin.txn_id ) AND ( installationJoin.rn = 1 ) ))) left join (SELECT ts.txn_id, ts.modified_date, Row_number() over ( PARTITION BY ts.txn_id ORDER BY ts.modified_date DESC) AS rn FROM task_history ts WHERE ( ( ts.organisation_process_path = 'B' ) AND ( ( ts.status ) = ANY (( array ['FEMTO REPAIRED', 'REPEATER REPAIRED' ] )) ) )) repairJoin ON (( ( T.txn_id = repairJoin.txn_id ) AND ( repairJoin.rn = 1 ) ))) left join (SELECT ts.txn_id, ts.pending_with, ts.pending_with_details, ts.pending_with_role, ts.modified_date, Row_number() over ( PARTITION BY ts.txn_id ORDER BY ts.modified_date DESC) AS rn FROM task_history ts WHERE ( ( ts.organisation_process_path = 'B' ) AND ( ( ts.status ) = ANY (( array ['SR Assigned to NPI' , 'SR Assigned to NPI for Review' ] )) ) )) engineerDetailsJoin ON (( ( T.txn_id = engineerDetailsJoin.txn_id ) AND ( engineerDetailsJoin.rn = 1 ) ))) left join (SELECT ts.txn_id, ts.modified_date, Row_number() over ( PARTITION BY ts.txn_id ORDER BY ts.modified_date DESC) AS rn FROM task_history ts WHERE ( ( ts.organisation_process_path = 'B' ) AND ( ( ts.status ) = 'SR Resolved' ) AND ts.action_performed_by NOT IN ( 'SYSTEM' ) )) totalTimeJoin ON (( ( T.txn_id = totalTimeJoin.txn_id ) AND ( totalTimeJoin.rn = 1 ) AND ( T.status ) IN ( 'SR Resolved', 'CLOSED', 'closed', 'Closed', 'resolved' ) AND Lower(( ( T.common_details -> 'commonDetails' ) -> 'bundle' ) ->> 'status' ) NOT IN ( 'reopen', 're-opened' ) ))) left join (SELECT ts.txn_id, ts.modified_date, Row_number() over ( PARTITION BY ts.txn_id ORDER BY ts.modified_date) AS rn FROM task_history ts WHERE ( ( ts.organisation_process_path = 'B' ) AND ( ( ts.status ) = 'REOPEN' ) )) reopenJoin ON (( ( T.txn_id = reopenJoin.txn_id ) AND ( reopenJoin.rn = 1 ) AND Lower(( ( T.common_details -> 'commonDetails' ) -> 'bundle' ) ->> 'status' ) IN( 'reopen', 're-opened', 'sr resolved', 'closed', 'close', 'closelooped', 'resolved' ) ))) left join (SELECT ts.txn_id, ts.modified_date, Row_number() over ( PARTITION BY ts.txn_id ORDER BY ts.modified_date) AS rn FROM task_history ts WHERE ( ( ts.organisation_process_path = 'B' ) AND ( ( ts.status ) ~~* 'SR Assigned to NPI' ) )) npiBucketJoin ON (( ( T.txn_id = npiBucketJoin.txn_id ) AND ( npiBucketJoin.rn = 1 ) ))) left join (SELECT ts.txn_id, ts.modified_date, Row_number() over ( PARTITION BY ts.txn_id ORDER BY ts.modified_date) AS rn FROM task_history ts WHERE ( ( ts.organisation_process_path = 'B' ) AND ( ( ts.action ) = ANY ( ( array ['other_solutions_available', 'Planning_Solution', 'Hard_Optimization' , 'Repair_Required', 'Specific_Connectivity_Issue_Identified' , 'Soft_Optimization', 'repeater_team_available', 'Deployment_solution', 'sr_initial_survey_required', 'Operations_issue' ] )) ) )) npiActionJoin ON (( ( T.txn_id = npiActionJoin.txn_id ) AND ( npiActionJoin.rn = 1 ) ))) Thanks , Shubham