0

与通过 psql 调用存储过程相比,我在通过 PostgREST 调用存储过程时遇到了主要的性能问题。两种方法都成功完成,但 PostgREST 需要大约 1 分钟,而 psql 需要 2 秒。由于此过程,有许多语句级别和一些行级别触发器被触发。

这个程序更新数据库,另一个更新程序有同样的问题,

从 psql 调用:

set role myrole;
start transaction;

WITH pgrst_source AS (WITH pgrst_args AS (SELECT NULL) SELECT "api"."docket_creation"('{"dockets":[{"docket":{},"transactions":[{"transaction":{"batch_id":null,"best_before_date":null,"docket_id":1417,"minimum_price":1.5,"note":"","price":3,"product_code":"TL12","product_cost":1,"product_description":"","product_group_id":null,"product_id":217,"product_name":"12 Tray Large","quantity":1,"vat_rate_id":4,"vat_rate_percentage":0,"return_reason_id":null,"transaction_type_id":2},"transaction_discounts":[{"discount_percentage":5,"discount_type_id":10,"discount_value_per_unit":null,"minimum_quantity":null,"note":""}],"transaction_returns":[],"transaction_commissions":[{"commission_id":null,"commission_percentage":0,"commission_type_id":2,"customer_id":1,"delivery_agent_id":0,"effective_from":null,"effective_to":null,"is_cumulative":true,"owner":2,"product_id":217}]}],"docket_buy_x_get_y_discounts":[]}]}'::json) AS pgrst_scalar)
  
  SELECT
    null::bigint AS total_result_set,
    pg_catalog.count(_postgrest_t) AS page_total,
    (json_agg(_postgrest_t.pgrst_scalar)->0)::character varying AS body,
    coalesce(nullif(current_setting('response.headers', true), ''), '[]') AS response_headers
  FROM (SELECT "pgrst_source".* FROM "pgrst_source"    ) _postgrest_t;

或者简单地说:

 SELECT "api"."docket_creation"('{"dockets":[{"docket":{},"transactions":[{"transaction":{"batch_id":null,"best_before_date":null,"docket_id":1417,"minimum_price":1.5,"note":"","price":3,"product_code":"TL12","product_cost":1,"product_description":"","product_group_id":null,"product_id":217,"product_name":"12 Tray Large","quantity":1,"vat_rate_id":4,"vat_rate_percentage":0,"return_reason_id":null,"transaction_type_id":2},"transaction_discounts":[{"discount_percentage":5,"discount_type_id":10,"discount_value_per_unit":null,"minimum_quantity":null,"note":""}],"transaction_returns":[],"transaction_commissions":[{"commission_id":null,"commission_percentage":0,"commission_type_id":2,"customer_id":1,"delivery_agent_id":0,"effective_from":null,"effective_to":null,"is_cumulative":true,"owner":2,"product_id":217}]}],"docket_buy_x_get_y_discounts":[]}]}')

这大约需要 2 秒。

从 web 应用程序或通过 curl 调用时

curl 'https://<server>/hhdb_api/rpc/docket_creation' \
   -X 'POST' \
   -H 'Connection: keep-alive' \
   -H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"' \
   -H 'Prefer: params=single-object' \
   -H 'sec-ch-ua-mobile: ?0' \
   -H 'Authorization: Bearer $bearer_token' \
   -H 'Content-Type: application/json' \
   -H 'Accept: application/json, text/plain, */*' \
   -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36' \
   -H 'DNT: 1' \
   -H 'Origin: https://hh-tincan-dev.srv.handheld.ie' \
   -H 'Sec-Fetch-Site: same-site' \
   -H 'Sec-Fetch-Mode: cors' \
   -H 'Sec-Fetch-Dest: empty' \
   -H 'Referer: https://hh-tincan-dev.srv.handheld.ie/' \
   -H 'Accept-Language: en-GB,en-US;q=0.9,en;q=0.8' \
   --data-raw '{"dockets":[{"docket":{},"transactions":[{"transaction":{"batch_id":null,"best_before_date":null,"docket_id":1428,"minimum_price":1.5,"note":"","price":3,"product_code":"TL12","product_cost":1,"product_description":"","product_group_id":null,"product_id":217,"product_name":"12 Tray Large","quantity":1,"vat_rate_id":4,"vat_rate_percentage":0,"return_reason_id":null,"transaction_type_id":2},"transaction_discounts":[{"discount_percentage":5,"discount_type_id":10,"discount_value_per_unit":null,"minimum_quantity":null,"note":""}],"transaction_returns":[],"transaction_commissions":[{"commission_id":null,"commission_percentage":0,"commission_type_id":2,"customer_id":1,"delivery_agent_id":0,"effective_from":null,"effective_to":null,"is_cumulative":true,"owner":2,"product_id":217}]}],"docket_buy_x_get_y_discounts":[]}]}' \
   --compressed

这将需要一分钟多的时间。

我希望这两个调用都需要相似的时间。

我启用了广泛的日志记录来尝试追踪这两种方法之间的差异似乎是进入嵌套触发器时的延迟~

我在 PostgREST 的 GitHub 上提出了这个问题,其中包含一些配置细节:

https://github.com/PostgREST/postgrest/issues/1836

此问题现已解决,详情请参阅 PostgREST github 问题

4

0 回答 0