【发布时间】:2017-06-09 06:00:06
【问题描述】:
我正在 Informix Data Studio 12.1 中执行一条 SQL 语句。执行大约需要 50 到 60 毫秒(一天的日期)。
SELECT
sum( (esrt.service_price) * (esrt.confirmed_qty + esrt.pharmacy_confirm_quantity) ) AS net_amount
FROM
episode_service_rendered_tbl esrt,
patient_details_tbl pdt,
episode_details_tbl edt,
ms_mat_service_header_sp_tbl mmshst
WHERE
esrt.patient_id = pdt.patient_id
AND edt.patient_id = pdt.patient_id
AND esrt.episode_id = edt.episode_id
AND mmshst.material_service_sp_id = esrt.material_service_sp_id
AND mmshst.bill_heads_id = 1
AND esrt.delete_flag = 1
AND esrt.customer_sp_code != '0110000006'
AND pdt.patient_category_id IN(1001,1002,1003,1004,1005,1012,1013)
AND edt.episode_type ='ipd'
AND esrt.generated_date BETWEEN '2017-06-04' AND '2017-06-04';
当我试图通过创建函数来执行相同的操作时,执行大约需要 35 到 40 秒。 请在下面找到代码。
CREATE FUNCTION sb_pharmacy_account_summary_report_test1(START_DATE DATE,END_DATE DATE)
RETURNING VARCHAR(100),DECIMAL(10,2);
DEFINE v_sale_credit_amt DECIMAL(10,2);
BEGIN
SELECT
sum( (esrt.service_price) * (esrt.confirmed_qty +
esrt.pharmacy_confirm_quantity) ) AS net_amount
INTO
v_sale_credit_amt
FROM
episode_service_rendered_tbl esrt,
patient_details_tbl pdt,
episode_details_tbl edt,
ms_mat_service_header_sp_tbl mmshst
WHERE
esrt.patient_id = pdt.patient_id
AND edt.patient_id = pdt.patient_id
AND esrt.episode_id = edt.episode_id
AND mmshst.material_service_sp_id = esrt.material_service_sp_id
AND mmshst.bill_heads_id = 1
AND esrt.delete_flag = 1
AND esrt.customer_sp_code != '0110000006'
AND pdt.patient_category_id IN(1001,1002,1003,1004,1005,1012,1013)
AND edt.episode_type ='ipd'
AND esrt.generated_date BETWEEN START_DATE AND END_DATE;
RETURN 'SALE CREDIT','' with resume;
RETURN 'IP SB Credit Amount',v_sale_credit_amt;
END
END FUNCTION;
谁能告诉我这个时间变化的原因是什么?
【问题讨论】:
-
查看存储过程的查询计划。弄清楚为什么开始日期是一个常数并且日期范围的两端都相同,与它的灵活性和日期范围不限于一天相比会产生如此大的差异。原来,优化器可以将
AND esrt.generated_date BETWEEN '2017-06-04' AND '2017-06-04'转换为AND esrt.generated_date = '2017-06-04'。使用存储过程,它不能做到这一点。您是否曾经以不同的开始和结束日期调用该过程?当您在几天范围内运行独立 SQL 时,它的性能是否也一样? -
您可能需要查看表上的索引——尤其是
esrt.generated_date上的索引。
标签: informix