5544992 发表于 2018-10-16 06:05:22

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 的列全部在索引中,并且列的属性不能为空,优化潜力很大的,我测了小数据量的

页: [1]
查看完整版本: SQL优化一例:GROUP BY的语句