SQL优化一例:GROUP BY的语句

简介:

SQL语句:
select t.type, count(t.id) as todo_count from mc_job_form t where t.state = '2' and t.customs_code = :a group by t.type

表结构:
ID VARCHAR2(24) N   id
IN_OUT_FLAG CHAR(1) Y   
PROVIDER_ID NUMBER Y   
APPLY_FORM_ID VARCHAR2(24) Y   
DECLARE_APPLY_ID VARCHAR2(24) Y   
PROPOSER_ID VARCHAR2(20) Y   
MANUAL_ID CHAR(12) Y   
TRADE_TYPE VARCHAR2(3) Y   
COMPANY_CODE CHAR(10) Y   
COMPANY_NAME NVARCHAR2(50) Y   
PROVIDER_NAME NVARCHAR2(50) Y   
GROSS_WEIGHT NUMBER(19,5) Y   
NET_WEIGHT NUMBER(19,5) Y  
AMOUNT NUMBER(19,5) Y   
WRAP_TYPE VARCHAR2(32) Y   
TRUNK_NO NVARCHAR2(255) Y   
CREATE_TIME DATE Y   
DECLARE_TIME DATE Y   
IN_TIME DATE Y   
CUSTOMS_CODE CHAR(4) Y   
PORT CHAR(4) Y   
REMARK NVARCHAR2(255) Y   
STATE CHAR(1) Y   
COMMENTS NVARCHAR2(200) Y  
TYPE VARCHAR2(2) Y   
PROPOSER NVARCHAR2(20) Y   
OUT_TIME DATE Y   
PROPOSER_PHONE VARCHAR2(20) Y   
CONTRACT_NO VARCHAR2(32) Y   
TALLY_COMMENTS NVARCHAR2(200) Y   
TALLY_TIME DATE Y   
TALLY_APPROVE_COMMENTS NVARCHAR2(200) Y   
ASSO_JOB_FORM_ID VARCHAR2(24) Y   
DATA_ORIGIN CHAR(1) Y   
GUARANTY_AMOUNT NUMBER(19,5) Y   
ASSO_FLAG CHAR(1) Y   
AREA_TYPE CHAR(1) Y   

优化前执行计划:
SELECT STATEMENT, GOAL = ALL_ROWS   Cost=6 Cardinality=7 Bytes=63
 HASH GROUP BY   Cost=6 Cardinality=7 Bytes=63
  TABLE ACCESS FULL Object owner=INMAN Object name=MC_JOB_FORM Cost=5 Cardinality=23 Bytes=207


无效的优化:(原因是索引未加入GROUPBY列)
-- Create/Recreate indexes 
create index TESTGG on MC_JOB_FORM (STATE, CUSTOMS_CODE)
  tablespace IN_MAN_DATA
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

有效的优化:
-- Create/Recreate indexes 
create index TESTGG on MC_JOB_FORM (STATE, CUSTOMS_CODE, TYPE)
  tablespace IN_MAN_DATA
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

优化后执行计划:
SELECT STATEMENT, GOAL = ALL_ROWS   Cost=1 Cardinality=7 Bytes=63
 SORT GROUP BY NOSORT   Cost=1 Cardinality=7 Bytes=63
  INDEX RANGE SCAN Object owner=INMAN Object name=TESTGG Cost=1 Cardinality=23 Bytes=207

总结:
要确保group by 的列全部在索引中,并且列的属性不能为空,优化潜力很大的,我测了小数据量的



本文转自zylhsy 51CTO博客,原文链接:http://blog.51cto.com/yunlongzheng/410425,如需转载请自行联系原作者

相关文章
|
2月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
187 6
|
10月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
7月前
|
SQL 存储 自然语言处理
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
|
9月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
9月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】如何将mysql含有group by的SQL转换成崖山支持的SQL
本文探讨了在YashanDB(崖山数据库)中执行某些SQL语句时出现的报错问题,对比了MySQL的成功执行结果。问题源于SQL-92标准对非聚合列的严格限制,要求这些列必须出现在GROUP BY子句中,而SQL:1999及更高版本允许非聚合列直接出现在选择列中。YashanDB和Oracle遵循SQL-92标准,因此会报错。文章提供了两种解决方法:使用聚合函数处理非聚合列,或将GROUP BY与ORDER BY拆分为两层查询。最后总结指出,SQL-92标准更为严谨合理,建议开发者遵循此规范以避免潜在问题。
|
10月前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
435 9
|
10月前
|
SQL Oracle 关系型数据库
【YashanDB 知识库】如何将 mysql 含有 group by 的 SQL 转换成崖山支持的 SQL
在崖山数据库中执行某些 SQL 语句时出现报错(YAS-04316 not a single-group group function),而这些语句在 MySQL 中能成功执行。原因是崖山遵循 SQL-92 标准,不允许选择列表中包含未在 GROUP BY 子句中指定的非聚合列,而 MySQL 默认允许这种操作。解决办法包括:使用聚合函数处理非聚合列或拆分查询为两层,先进行 GROUP BY 再排序。总结来说,SQL-92 更严格,确保数据一致性,MySQL 在 5.7 及以上版本也默认遵循此标准。
|
11月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
11月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
3361 11
|
12月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
280 11