`
c_c
  • 浏览: 85866 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

在日期字段上查询的效率问题

SQL 
阅读更多

背景说明:SO表的APPL_DATE字段上具有normal索引,现在要根据该字段按天归类,形成当天的日报。

困难说明:so表是一个存储海量数据的巨表,完成业务统计要求与提升统计效率之间形成了一对矛盾,如下是先后尝试采用的三个方案,最终我们选择了第3号方案。

1.使用trunc(sysdate)

 

  1. SELECT SO.PROD_ID PROD_ID,  
  2.        SO.CHG_SERV_SPEC_ID SERV_ID,  
  3.        SO.SO_STS SERV_STS,  
  4.        SO.STS ORDER_STS,  
  5.        COUNT(1) STATI_QUAITITY,  
  6.        SYSDATE STATI_DATE  
  7.   FROM SO  
  8.  WHERE 1 = 1  
  9.    AND TRUNC(SO.APPL_DATE) = TRUNC(SYSDATE)  
  10.    AND SO.STS = 'A'  
  11.  GROUP BY SO.PROD_ID, SO.CHG_SERV_SPEC_ID, SO.SO_STS, SO.STS  
  12.  ORDER BY SO.PROD_ID, SO.CHG_SERV_SPEC_ID, COUNT(1) DESC  
 

 

sql效率:

使用方式INDEX FULL SCAN扫描

cost值=63211,cardinality=15774,实际执行时间200s左右

应用分析:

通过使用trunc函数截断得到当天的所有定单,完美的实现了统计要求,但是这种查询耗费的成本是最高的,耗时更是令人无法忍受,这种方案必定不能通过。

2.使用=sysdate

 

  1. SELECT SO.PROD_ID PROD_ID,  
  2.        SO.CHG_SERV_SPEC_ID SERV_ID,  
  3.        SO.SO_STS SERV_STS,  
  4.        SO.STS ORDER_STS,  
  5.        COUNT(1) STATI_QUAITITY,  
  6.        SYSDATE STATI_DATE  
  7.   FROM SO  
  8.  WHERE 1 = 1  
  9.    AND SO.APPL_DATE =SYSDATE  
  10.    AND SO.STS = 'A'  
  11.  GROUP BY SO.PROD_ID, SO.CHG_SERV_SPEC_ID, SO.SO_STS, SO.STS  
  12.  ORDER BY SO.PROD_ID, SO.CHG_SERV_SPEC_ID, COUNT(1) DESC  
 

 

sql效率:

 

使用方式INDEX RANGE SCAN扫描

cost值=11,cardinality=5,实际执行时间0.1s以下

应用分析:

直接和sysdate做等值连接,使用INDEX RANGE SCAN方式扫描,极大的提升了sql查询效率;

但是这种查询只可以获得当前时刻的定单条目,而不能获得统计要求的当天时间范围内的定单条目,因此是完全违背业务要求的,不合格的。

 

3.使用between sysdate-1 and sysdate

 

  1. SELECT SO.PROD_ID PROD_ID,  
  2.        SO.CHG_SERV_SPEC_ID SERV_ID,  
  3.        SO.SO_STS SERV_STS,  
  4.        SO.STS ORDER_STS,  
  5.        COUNT(1) STATI_QUAITITY,  
  6.        SYSDATE STATI_DATE  
  7.   FROM SO  
  8.  WHERE 1 = 1  
  9.    AND so.appl_date BETWEEN SYSDATE-1 AND SYSDATE  
  10.    AND SO.STS = 'A'  
  11.  GROUP BY SO.PROD_ID, SO.CHG_SERV_SPEC_ID, SO.SO_STS, SO.STS  
  12.  ORDER BY SO.PROD_ID, SO.CHG_SERV_SPEC_ID, COUNT(1) DESC  
 

 

sql效率:

使用方式INDEX RANGE SCAN扫描

cost值=266,cardinality=15481,实际执行时间5s以下

应用分析:

    这里使用BETWEEN SYSDATE-1 AND SYSDATE获取定单条目,使用了INDEX RANGE SCAN扫描记录,sql效率介于1号、2号方案之间,5s以下的执行时间也完全在可忍受的范围之内;

    同时,在时间上去了一个相对的一天,并不是完全的从早上0点到晚上24点,实际操作中会有一些偏差,但这是十分微小的。

    因此,这是一个折中的方案。

分享到:
评论

相关推荐

    各种数据库日期字段说明

    在查询中使用日期字段时,需要注意格式化字符串的使用。例如: ```sql SELECT * FROM ti WHERE dscdate = '2008-02-02 00:00:00'; SELECT * FROM ti WHERE dscdate = '2008-02-02'; ``` 第一行代码用于精确匹配特定...

    简单了解mysql存储字段类型查询效率

    MySQL数据库在设计表结构时,选择正确的存储字段类型对于查询效率和存储空间的优化至关重要。以下是对标题和描述中提到的知识点的详细说明: 1. **整数类型**: - 整数类型包括TINYINT、SMALLINT、MEDIUMINT、INT...

    sqlserver中日期型字段设默认值

    假设我们有一个`Titles`表,其中包含一个名为`PubDate`的日期字段,我们想查询所有书籍在21天后的情况,可以使用以下SQL语句: ```sql USE pubs; GO SELECT DATEADD(day, 21, PubDate) AS TimeFrame FROM Titles; ...

    日历插件(在日期下方添加字段)

    本文将深入探讨“日历插件(在日期下方添加字段)”这一主题,详细介绍如何通过定制化的方式在日历日期下方添加自定义字段,以满足用户的个性化需求。 首先,我们要理解日历插件的基本功能。一个标准的日历插件通常...

    Access日期间隔查询.rar

    在Access数据库中,日期间隔查询是一项重要的功能,它允许用户基于日期字段进行复杂的筛选和分析。日期间隔查询常用于统计特定时间段内的数据,比如计算过去一年的销售额、查找某个日期范围内的记录,或者分析周期性...

    NC65开发课件之查询模板

    查询字段名称是指在查询模板中设置的字段名称,可以根据需要修改字段名称以满足业务需求。例如,可以将字段名称设置为“客户名称”、“订单日期”等。 查询字段顺序: 查询字段顺序是指在查询模板中设置的字段显示...

    日期时间段查询功能 截止日期不能小于起止日期

    9. **数据库索引优化**:对于大量日期数据,对日期字段创建索引可以提高查询效率,但也要注意避免索引失效的情况,如在使用`BETWEEN`时。 10. **版本控制**:在开发过程中,使用版本控制系统(如Git)来管理代码,...

    mysql优化字段存储----优化查询效率.pdf

    在本文中,我们将讨论索引和字段存储的优化方法,以提高查询效率。 索引的影响 索引是 MySQL 数据库中的一种机制,它可以提高查询效率。但是,如果设置不当,索引可能会适得其反。因此,在设置索引时一定要谨慎。...

    ArcGIS(ArcPy)脚本excel批量添加字段

    6. **处理错误**:在循环中添加异常处理,以应对可能的错误,如文件不存在或权限问题: ```python try: ... except Exception as e: print(f"Error processing {excel_file}: {e}") ``` 7. **保存并运行脚本*...

    SAP ABAP开发系统字段

    在编写ABAP程序时,理解并正确使用系统字段是提高代码效率和可维护性的关键步骤。 总的来说,SAP ABAP中的系统字段是一组预定义的变量,用于传递运行时信息,它们可以帮助开发者更好地理解和控制程序的执行流程。...

    delphi对access的多表多字段的查询实例

    8. **性能优化**: 对于复杂的多表多字段查询,可能需要考虑索引优化、子查询、联接类型选择等因素,以提高查询效率。 9. **事务处理**: 对于涉及多个操作的查询,可以使用TADOTransaction组件进行事务控制,确保...

    05_JPA详解_日期_枚举等字段类型的JPA映射.zip

    在JPA中,我们可以使用`@Temporal`注解来指定日期字段的存储类型: - `@Temporal(TemporalType.DATE)`:仅存储日期部分。 - `@Temporal(TemporalType.TIME)`:仅存储时间部分。 - `@Temporal(TemporalType....

    在内容查询 Web 部件中显示自定义字段

    【内容查询Web部件】是一种强大的工具,用于在Microsoft Office SharePoint Server 2007网站上展示动态的内容视图。它可以跨多个列表、网站甚至整个网站集执行查询,并将结果显示在页面上。这种功能使得用户无需关注...

    SQLServer常用字段类型

    在数据库设计与管理中,选择合适的字段类型对于数据的存储效率、查询性能以及数据完整性至关重要。SQL Server 提供了丰富的数据类型,覆盖了从基本数值到复杂文本、图像等各类数据的存储需求。下面将详细解析《SQL ...

    泛微OA E-cology字段联动.rar

    1. **表单验证**:当用户填写表单时,某些字段的值可以限制其他字段的输入范围,比如日期范围、选择项等。 2. **智能填充**:根据已输入信息,自动填充相关字段,如地址信息、联系方式等。 3. **流程控制**:字段...

    数据库字段获取

    9. 性能优化:当处理大量数据或频繁查询时,了解数据库的索引、缓存机制以及优化查询语句(如避免全表扫描)能够显著提高字段获取的效率。 10. 多表联合查询:在复杂的应用场景下,可能需要从多个表中获取字段。这...

    Dynamics crm QueryAttributeType (查询字段类型及字段中文名称)

    总的来说,"Dynamics crm QueryAttributeType (查询字段类型及字段中文名称)"工具是Dynamics CRM开发和管理过程中的一个实用助手,通过它,用户可以更高效地管理和操作CRM系统中的数据,提高工作效率。安装并使用...

    数据库字段命名规范

    * 在命名表的字段时,不要重复表的名称。 * 每一张表都有一行名为ID的列,长度为18,数据类型为Int。 * 所有字段的第一个单词的首字母要小写,且一般不超过三个英文单词。 * 第二个及或后面单词的首字母要大写。 * ...

    ACCESS日期查询源码

    在IT行业中,数据库管理和查询是至关重要的技能,尤其是在企业级应用开发中。ACCESS数据库作为一款常用的轻量级数据库管理系统,提供了强大的数据存储和查询功能。本文将深入探讨如何使用SQL语句进行日期查询,这...

    k3数据库字段说明

    正确设置和查询这些字段,可以确保考勤数据的准确性和及时性。 4. 日成本管理系统:关注的是每日运营成本的记录与分析,如成本类别、费用发生日期、成本金额等。掌握这些字段,有助于企业实时监控成本,优化资源...

Global site tag (gtag.js) - Google Analytics