【问题标题】:Query Execution Time Varies - IBM Informix - Data Studio查询执行时间变化 - IBM Informix - Data Studio
【发布时间】: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


【解决方案1】:

..用很简单的话。

如果你创建一个函数,sql 会被解析并与一些优化的东西一起存储在数据库中。如果您调用该函数,优化器会知道该 sql 并执行它。因此,如果您创建函数,优化只进行一次。

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

【讨论】:

  • 如何将执行时间从 35 秒缩短到 MS in function?
  • 仅在函数中执行需要更多时间
  • 您是否对您加入表格的 id 字段编制了索引?你有关于“generated_date”的索引吗?我会在这个字段上创建一个索引。
【解决方案2】:

我会说时间上的差异是由于参数化查询造成的。 第一个 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

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

【讨论】:

    猜你喜欢
    • 2017-05-02
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2011-07-19
    • 1970-01-01
    相关资源
    最近更新 更多