查询执行时间变化 - IBM Informix - Data Studio

时间:2017-06-09 06:00:07

标签: informix

我在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; 

有人可以告诉我这次变化的原因是什么?

2 个答案:

答案 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

它解释了如何使用优化程序指令来加速查询。