PostgreSQL - CTE减慢了查询

时间:2018-03-06 06:15:20

标签: postgresql common-table-expression postgresql-9.5 postgresql-performance

我担心在查询中使用多个WITH子句,因为 在某些情况下,它会降低查询的性能,如下例所示,

首先WITH条款采用 0.345秒来获取 98948 记录,第二个WITH条款采用 13秒< / strong>获取 68199 记录,即使它与第一个记录相比记录的记录更少,所以唯一的区别是我们在第二个WITH子句中使用了聚合函数来计算总和费。

任何人都可以帮助我们理解为什么第二个查询需要花费太多时间。

1.此条款需要0.318秒才能获取98948记录,

WITH delinquency_lease_details AS (
    SELECT
        dp.cid,
        dp.id AS delinquency_policy_id,
        p.id,
        dp.threshold_amount,
        dp.small_balance_amount,
        dp.delinquency_threshold_type_id,
        cl.id,
        cl.primary_customer_id AS customer_id,
        cl.lease_status_type_id,
        cl.occupancy_type_id,
        COALESCE( cl.building_name || ' - ' || cl.unit_number_cache, cl.building_name, cl.unit_number_cache ) AS unit_number, func_format_customer_name ( cl.name_first, cl.name_last, cl.company_name ) customer_name, cl.property_name, TZ.time_zone_name AS property_timezone
FROM
    cached_leases cl
    JOIN lease_details ld ON ( ld.cid = cl.cid AND ld.lease_id = cl.id )
    JOIN delinquency_policies dp ON ( dp.cid = ld.cid AND ld.delinquency_policy_id = dp.id )
    JOIN properties p ON ( p.cid = lp.cid AND p.id = lp.property_id )
    JOIN time_zones TZ ON ( TZ.id = p.time_zone_id )
WHERE
    cl.cid = 1111
    AND cl.lease_status_type_id IN ( 4, 5 )
    AND cl.occupancy_type_id IN ( 1, 2, 3, 4, 6, 9, 10, 11 )
    AND cl.termination_list_type_id IS NULL
)

SELECT * FROM delinquency_lease_details;

2。这个子句需要13秒才能获取68199条记录,如果我只运行没有WITH条款的查询,则需要0.564秒,

WITH delinquent_balance AS (
    SELECT
        dld.cid,
        dld.id,
        min( c.post_date ) AS min_post_date,
        sum( c.transaction_amount_due ) AS delinquent_amount
    FROM
        cached_leases dld
        JOIN charges at ON ( at.cid = dld.cid AND at.lease_id = dld.id AND c.is_temporary = FALSE AND c.is_deleted = FALSE )
        JOIN charge_codes cc ON ( c.ar_code_id = cc.id AND c.cid = cc.cid AND cc.ledger_filter_id = 27 )
    WHERE
        dld.cid = 1111
        AND ( ( c.transaction_amount_due > 0 AND c.post_date < CURRENT_DATE ) OR c.transaction_amount_due < 0 )
        AND NOT EXISTS (
            select
                1
            from
                repayment_charges
            WHERE
                cid = c.cid
                AND property_id = c.property_id
                AND charge_id = c.id
                AND is_active = true
        )
    GROUP BY
        dld.cid,
        dld.id

) select * from delinquent_balance;

根据这个linkWITH子句是Postgres数据库的优化障碍,因此我们应该使用什么来代替复杂查询的WITH子句,因为我在查询中使用了10个WITH子句,它减慢了查询的性能,但是我已经给出了两个条款才得到一些结论,因为第二个句子比另一个条款花费的时间更长。

0 个答案:

没有答案