查询执行时间各不相同 - IBM Informix - Data Studio



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

有人可以告诉我这种时间变化的原因是什么吗?

..用非常简单的话说。

如果你创建一个函数,sql被解析并与一些优化内容一起存储在数据库中。如果调用该函数,优化器将知道 sql 并执行它。因此,如果您创建函数,则优化仅执行一次。

如果运行 SQL,则优化器会在每次执行 SQL 时解析 SQL,对其进行优化,然后执行它。这就解释了时差。

我会说时间的差异是由于参数化查询造成的。第一个 SQL 具有硬编码的日期值,SPL 中的 SQL 具有参数。这可能会导致对 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

它解释了如何使用优化器指令来加快查询速度。

最新更新