我在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;
有人可以告诉我这次变化的原因是什么?
答案 0 :(得分:0)
..非常简单。
如果您创建一个函数,则会解析sql并将其与数据库中的一些优化内容一起存储。如果调用该函数,优化器会知道sql并执行它。因此,如果您创建函数,则只进行一次优化。
如果运行SQL,Optimizer将解析sql,对其进行优化,然后在每次执行SQL时执行它。 这解释了时差。
答案 1 :(得分:0)
我想说时间上的差异是由参数化查询引起的。 第一个SQL具有硬编码日期值,SPL中的一个具有参数。这可能导致不同的查询计划(例如:要遵循的索引)应用于SPL中的查询,而不是从Data Studio执行的查询。
您可以尝试从第一个SQL获取查询计划(使用set explain),然后使用SPL中的指令强制引擎使用相同的路径。
看看:
https://www.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.perf.doc/ids_prf_554.htm
它解释了如何使用优化程序指令来加速查询。