You can translate the question and the replies:

Performance Issue

We need help here as in what could we be the ways to further optimize as it is taking forever to run. There are two branches on a high level/ Left branch - Union of 6 regions data with required customizations/joins happening for each branch (data - total of approx 25 M rows) and then a right branch Union of 2 sources with required customizations/joins happening for each branch (data - approx 0.13 M rows) 6 regions manipulated data is individually cached in PostgreSQL DB before the Union of all 6 branches and then the whole right branch (Union of 2 sources) is cached again in PostgreSQL. Then we are doing a following join between these two left/right branches which is taking a lot of time forever to run, can you suggest the ways to optimize this? SELECT fv_ktv_union_all_region.ds_source_system_desc AS ds_source_system_desc, fv_ktv_union_all_region.cd_cycle_code AS cd_cycle_code, fv_ktv_union_all_region.gn_cycle_type AS gn_cycle_type, fv_ktv_union_all_region.gn_day_number AS gn_day_number, fv_ktv_union_all_region.gn_group AS gn_group, fv_ktv_union_all_region.gn_brand_name AS gn_brand_name, fv_ktv_union_all_region.ds_product_desc AS ds_product_desc, fv_ktv_union_all_region.cd_segment_code AS cd_segment_code, fv_ktv_union_all_region.cd_vehicle_type_code AS cd_vehicle_type_code, fv_ktv_union_all_region.cd_energy_type_code AS cd_energy_type_code, fv_ktv_union_all_region.cd_market_iso_code AS cd_market_iso_code, fv_ktv_union_all_region.region AS region, fv_ktv_union_all_region.sub_region AS sub_region, fv_ktv_union_all_region.sub_group AS sub_group, fv_ktv_union_all_region.country AS country, fv_ktv_union_all_region.nm_shipment_number AS nm_shipment_number, fv_ktv_union_all_region.nm_shipment_mtd_number AS nm_shipment_mtd_number, fv_ktv_union_all_region.nm_sales_number AS nm_sales_number, fv_ktv_union_all_region.nm_sales_mtd_number AS nm_sales_mtd_number, fv_ktv_union_all_region.nm_production_number AS nm_production_number, fv_ktv_union_all_region.nm_production_mtd_number AS nm_production_mtd_number, fv_ktv_union_all_region.nm_end_customer_order_number AS nm_end_customer_order_number, fv_ktv_union_all_region.nm_end_customer_order_mtd_number AS nm_end_customer_order_mtd_number, fv_ktv_union_all_region.nm_end_customer_order_retail_number AS nm_end_customer_order_retail_number, fv_ktv_union_all_region.nm_end_customer_order_dealer_number AS nm_end_customer_order_dealer_number, fv_ktv_union_all_region.nm_network_stock_number AS nm_network_stock_number, fv_ktv_union_all_region.nm_property_stock_number AS nm_property_stock_number, fv_ktv_union_all_region.nm_property_stock_transit_number AS nm_property_stock_transit_number, fv_ktv_union_all_region.nm_end_customer_order_compound_number AS nm_end_customer_order_compound_number, fv_ktv_union_all_region.nm_property_stock_compound_number AS nm_property_stock_compound_number, fv_ktv_union_all_region.nm_property_stock_direct_number AS nm_property_stock_direct_number, fv_ktv_union_all_region.nm_network_stock_aged_number AS nm_network_stock_aged_number, fv_ktv_union_all_region.nm_property_stock_aged_number AS nm_property_stock_aged_number, fv_ktv_union_all_region.nm_num_work_day_number AS nm_num_work_day_number, fv_ktv_union_all_region.nm_registration_number AS nm_registration_number, fv_ktv_union_all_region.dt_last_modified_timestamp AS dt_last_modified_timestamp, fv_ktv_union_all_region.nm_network_stock_aged_from_prod_number AS nm_network_stock_aged_from_prod_number, fv_ktv_union_all_region.gn_year_number AS gn_year_number, fv_ktv_union_all_region.gn_month_number AS gn_month_number, case WHEN ( fv_ktv_union_all_region.gn_day_number <> 0 ) THEN coalesce( p_bv_tb_calendar_data.nm_market_working_days_month_to_day_number, p_bv_tb_calendar_data1.nm_market_working_days_month_to_day_number ) ELSE 0 END AS nm_market_working_days_month_to_day_number, case WHEN ( ( fv_ktv_union_all_region.gn_day_number = 0 AND coalesce( p_bv_tb_calendar_data.fl_working, p_bv_tb_calendar_data1.fl_working ) = 1 ) ) THEN ( coalesce( p_bv_tb_calendar_data.nm_market_working_days_to_end_month_number, p_bv_tb_calendar_data1.nm_market_working_days_to_end_month_number ) + 1 ) ELSE coalesce( p_bv_tb_calendar_data.nm_market_working_days_to_end_month_number, p_bv_tb_calendar_data1.nm_market_working_days_to_end_month_number ) END AS nm_market_working_days_to_end_month_number FROM ( fv_ktv_union_all_region AS fv_ktv_union_all_region HASH LEFT OUTER JOIN p_bv_tb_calendar_data AS p_bv_tb_calendar_data ON ( fv_ktv_union_all_region.cd_market_iso_code = p_bv_tb_calendar_data.cd_market AND fv_ktv_union_all_region.gn_year_number = p_bv_tb_calendar_data.dt_year AND fv_ktv_union_all_region.gn_month_number = p_bv_tb_calendar_data.dt_month AND case WHEN ( fv_ktv_union_all_region.gn_day_number = 0 ) THEN 1 ELSE fv_ktv_union_all_region.gn_day_number END = p_bv_tb_calendar_data.dt_day ) ) HASH LEFT OUTER JOIN p_bv_tb_calendar_data AS p_bv_tb_calendar_data1 ON ( fv_ktv_union_all_region.gn_year_number = p_bv_tb_calendar_data1.dt_year AND fv_ktv_union_all_region.gn_month_number = p_bv_tb_calendar_data1.dt_month AND p_bv_tb_calendar_data1.cd_market = 'XX' AND coalesce( p_bv_tb_calendar_data.cd_market, 'XX' ) = p_bv_tb_calendar_data1.cd_market AND case WHEN ( fv_ktv_union_all_region.gn_day_number = 0 ) THEN 1 ELSE fv_ktv_union_all_region.gn_day_number END = p_bv_tb_calendar_data1.dt_day ) Execution Trace: QUERY: select count(1) from fv_ktv EXECUTION PLAN ( name = Execution startTime = Wed Feb 16 18:31:02 794 IST 2022 endTime = - responseTime = - numRows = 0 state = STOPPED completed = false waitingTime = 0 STATIC OPTIMIZATION ( staticOptimized = false staticOptimizationTime = 50 staticOptimizationStart = * staticOptimizationEnd = * ) QUERY BLOCKS ( 549274432 ( leafViews = [vdb_commercial_116.fv_ktv_union_all_region, vdb_commercial_116.p_bv_tb_calendar_data] effectiveTime = 1453762 ms comparable = true ) ) CACHE PLAN ( name = _g92e5420c - 3785 - 431f - ba78 - 7604b2ebac50_d1348d6a - 76b0 - 4e93 - 8e74 - 224a93325972 database = vdb_commercial_116 startTime = Wed Feb 16 18:31:02 894 IST 2022 endTime = - responseTime = - numRows = 0 state = STOPPED completed = false queryBlockIds = [549274432] fields = [count] search conditions = [] filter conditions = [] order ByFields = [] ordered = false numOfFilteredTuples = 0 numOfDuplicatedTuples = 0 numOfSwappedTuples = 0 swapping = false memoryLimitReached = false mainTime = 0 ns viewType = GROUP BY indexes = [] JDBC WRAPPER ( name = _g92e5420c - 3785 - 431f - ba78 - 7604b2ebac50_d1348d6a - 76b0 - 4e93 - 8e74 - 224a93325972 database = admin startTime = * endTime = - responseTime = - numRows = 0 state = PROCESSING completed = false searchConditions = [] order ByFields = [] projectedFields = [count] additionalSubPlans = 0 additionalErroneousSubPlans = 0 JDBC ROUTE ( name = _g92e5420c - 3785 - 431f - ba78 - 7604b2ebac50_d1348d6a - 76b0 - 4e93 - 8e74 - 224a93325972 # 0 datasource = vdpcachedatasource datasource database = admin startTime = * endTime = - responseTime = - numRows = 0 state = PROCESSING completed = false SQLSentence = SELECT count( ? ) AS count_1 FROM ( SELECT s1.ds_source_system_desc AS ds_source_system_desc FROM ( ( SELECT u0.gn_day_number AS gn_day_number, u0.gn_year_number AS gn_year_number, u0.gn_month_number AS gn_month_number, u0.ds_source_system_desc AS ds_source_system_desc, u0.cd_market_iso_code AS cd_market_iso_code FROM ( SELECT t0.gn_day_number, t0.gn_year_number, t0.gn_month_number, t0.ds_source_system_desc, t0.cd_market_iso_code FROM c_iv2_ktv_exfca_union_fact117725670279976387632465283348362175 t0 WHERE t0.rowstatus = ? AND t0.expirationdate = ? UNION ALL SELECT t1.gn_day_number, t1.gn_year_number, t1.gn_month_number, t1.ds_source_system_desc, t1.cd_market_iso_code FROM c_iv2_ktv_expsa_union_fact306755170358603730444606379126173382 t1 WHERE t1.rowstatus = ? AND t1.expirationdate = ? UNION ALL SELECT t2.gn_day_number, t2.gn_year_number, t2.gn_month_number, t2.ds_source_system_desc, t2.cd_market_iso_code FROM c_iv2_ktv_maserati_union_fact208050255546932771625493015099572 t2 WHERE t2.rowstatus = ? AND t2.expirationdate = ? UNION ALL SELECT t3.gn_day_number, t3.gn_year_number, t3.gn_month_number, t3.ds_source_system_desc, t3.cd_market_iso_code FROM c_iv2_ktv_apac_union_fact0636907405705869626561022268656205562 t3 WHERE t3.rowstatus = ? AND t3.expirationdate = ? UNION ALL SELECT t4.gn_day_number, t4.gn_year_number, t4.gn_month_number, t4.ds_source_system_desc, t4.cd_market_iso_code FROM c_iv2_ktv_latam_union_fact492364201688037608611625188142497632 t4 WHERE t4.rowstatus = ? AND t4.expirationdate = ? UNION ALL SELECT t5.gn_day_number, t5.gn_year_number, t5.gn_month_number, t5.ds_source_system_desc, t5.cd_market_iso_code FROM c_iv2_ktv_na_union_fact913649351535885618361572436703571990048 t5 WHERE t5.rowstatus = ? AND t5.expirationdate = ? ) u0) s1 LEFT JOIN ( SELECT t6.cd_market AS cd_market, t6.dt_year AS dt_year, t6.dt_month AS dt_month, t6.dt_day AS dt_day FROM c_p_bv_tb_calendar_data903510248835594758733803186042940450098 t6 WHERE t6.rowstatus = ? AND t6.expirationdate = ? ) s2 ON ((s1.cd_market_iso_code = s2.cd_market AND s1.gn_year_number = s2.dt_year AND s1.gn_month_number = s2.dt_month AND CASE WHEN s1.gn_day_number = ? THEN ? ELSE s1.gn_day_number END = s2.dt_day) ) ) LEFT JOIN ( SELECT t7.cd_market AS cd_market, t7.dt_year AS dt_year, t7.dt_month AS dt_month, t7.dt_day AS dt_day FROM c_p_bv_tb_calendar_data903510248835594758733803186042940450098 t7 WHERE t7.rowstatus = ? AND t7.expirationdate = ? ) s3 ON ((s1.gn_year_number = s3.dt_year AND s1.gn_month_number = s3.dt_month AND s3.cd_market = ? AND coalesce(s2.cd_market, ? , null) = s3.cd_market AND CASE WHEN s1.gn_day_number = ? THEN ? ELSE s1.gn_day_number END = s3.dt_day) ) ) s4 LIMIT 150 parameters = [1, V, 0, V, 0, V, 0, V, 0, V, 0, V, 0, V, 0, 0, 1, V, 0, XX, XX, 0, 1] SQLSentence info = DBUri = * ) ) ) )x Please help with the possible options to optimize this, its very urgent and this is the max info I could collate. Thank much in advance for the help.
user
16-02-2022 09:56:41 -0500
code

1 Answer

Hi, In your scenario, i would perform the following steps to identify the performance issues as you have mentioned 1. Enable [Automatic Simplification of Queries](https://community.denodo.com/docs/html/browse/latest/en/vdp/administration/optimizing_queries/automatic_simplification_of_queries/automatic_simplification_of_queries#automatic-simplification-of-queries) and examine the execution trace 2. Validate the [Execution Trace](https://community.denodo.com/docs/html/browse/8.0/en/vdp/administration/creating_derived_views/querying_views/execution_trace_of_a_statement#execution-trace-of-a-statement) by breaking the complex query into smaller subsets or limit the rows to validate the timestamps available in execution trace to identify the performance issue 3. Create derived view to avoid any complex logic in joins with case statements and observe the performance 4. Validate the elapsed time of the final join query by executing the query directly at data source 5. You can take a look at features for [Queries Optimization](https://community.denodo.com/docs/html/browse/latest/en/vdp/administration/server_configuration/queries_optimization/queries_optimization#queries-optimization) and check by enabling the features as applicable For more information , I would refer to the below documentation, which discusses query optimization in great detail [Best Practices to Maximize Performance I: Modeling Big Data and Analytic Use Cases](https://community.denodo.com/kb/view/document/Best%20Practices%20to%20Maximize%20Performance%20I%3A%20Modeling%20Big%20Data%20and%20Analytic%20Use%20Cases?category=Best+Practices) [Best Practices to Maximize Performance II: Configuring the Query Optimizer](https://community.denodo.com/kb/view/document/Best%20Practices%20to%20Maximize%20Performance%20II:%20Configuring%20the%20Query%20Optimizer?category=Best+Practices) If you are a valid Support user, then you can create a Support case on the [Denodo Support Site](https://support.denodo.com/), where the Denodo team will help you. Hope this helps!
Denodo Team
17-02-2022 08:06:21 -0500
code
You must sign in to add an answer. If you do not have an account, you can register here