您的位置:首页 > 数据库

SQL优化一例:GROUP BY的语句

2010-10-25 15:46 423 查看
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 的列全部在索引中,并且列的属性不能为空,优化潜力很大的,我测了小数据量的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ORACLE SQL index 语句 GROUP