Problem:
After deleting 52 million rows from a table, the client performed a VACUUM FULL and REINDEX on the table. Following these maintenance operations, the performance of large joins involving this table has significantly deteriorated, with query execution times increasing from minutes to hours. The task is to identify the cause of this performance regression and recommend solutions to restore the original performance levels.
The expert team provided the initial investigation and scheduled the meeting with the client. At the meeting, the expert team discussed the following topics:
Solution:
To improve query performance, experts suggested to the client the following optimizations:
Also, the expert team provided the client with the updated query as an example to improve performance:
SELECT /*+ ORDERED INDEX (CU, cdr_unbilled_xc_ccnt_n_trns) USE_NL(CD CU) */
CU.cdr_data_partition_key,
CU.type_id_usg,
CU.element_id,
CU.provider_id,
CU.point_target,
CU.point_origin,
CU.point_id_target,
CU.point_id_origin,
CU.trans_dt,
CU.msg_id,
CU.msg_id2,
CU.msg_id_serv,
CU.rated_units,
CU.jurisdiction,
CU.amount,
CU.profile_id,
CU.customer_tag,
CU.rate_period,
CU.point_tax_code_origin,
CU.point_tax_code_type_origin,
CU.point_tax_code_target,
CU.point_tax_code_type_target,
CU.base_amt,
CU.unrounded_amount,
CU.bill_class,
CU.zone_class,
CU.ext_tracking_id,
CU.annotation,
CU.rev_rcv_cost_ctr,
CU.aggr_usage_id,
CU.rate_currency_code,
CU.primary_units,
CU.second_units,
CU.third_units,
CU.corridor_plan_id,
CU.split_row_num,
CU.open_item_id,
COALESCE(num_records, 1),
CU.amount_reduction,
CU.amount_reduction_id,
CU.access_region_origin,
CU.access_region_target,
CU.subscr_no,
CU.subscr_no_resets,
CU.tax_pkg_count,
CU.geocode,
CU.aux_tax_info,
CU.tax_rate_active_dt,
CU.tax_rate_inactive_dt,
CU.add_implied_decimal,
CU.rate_class,
CU.point_class_origin,
CU.point_class_target,
CU.component_id,
CU.equip_class_code,
CU.lob_id, --CBS00182254
CU.bill_order_number
FROM arbor.CDR_UNBILLED CU
JOIN arbor.CDR_DATA CD ON CU.account_no = CD.account_no
AND CU.cdr_data_partition_key = CD.cdr_data_partition_key
AND CU.msg_id = CD.msg_id
AND CU.msg_id2 = CD.msg_id2
AND CU.msg_id_serv = CD.msg_id_serv
AND CU.split_row_num = CD.split_row_num
WHERE CU.account_no = 251753520
AND CU.trans_dt >= trunc(current_date - 20)
AND CU.trans_dt < trunc(current_date + 20)
AND CD.cdr_status = 3
AND CD.no_bill = 0
AND (1 = 0 OR (1 = 1 AND CU.rate_dt < trunc(current_date + 20)));
Conclusion:
The client faced significant performance degradation in their billing system after deleting 52M rows and running VACUUM FULL and REINDEX on a table. Queries that previously took minutes now took hours. Following the upgrade from Patroni 11.5 to 11.18, merge queries experienced increased runtimes. The expert team investigated the issue based on shared queries and DB logs. During the meeting, our experts discussed optimizations like index adjustments, partitioning alignment, limiting result sets, query rewriting, data aggregation, sort optimization, and query plan analysis to restore and enhance performance.