1. 程式人生 > >使用倒序索引提升ORDER BY DESC效能

使用倒序索引提升ORDER BY DESC效能

使用倒序索引(INDEX DESC),可以大幅提升帶有order by desc子句的SQL語句效能。

一、場景

1、表名:test_t,有一欄位名為object_id

2、總資料量:580000行,segment_size:72MB

3、Where條件(Owner=’SYS’ and Object_id>50000)的行數:32472行

4、SQL語句:select * from test_t where owner='SYS' and object_id > 50000 order by object_id desc

5、希望藉助倒序索引,提升order by object_id desc的效能

二、B*

樹倒序索引(DESC)比 B*樹索引(預設為ASC升序)帶來的效能提升對比

1、採用B*倒序索引DESC),COST4,執行計劃走的INDEX RANGE SCAN

SQL語句:select * from test_t where owner='SYS' and object_id > 50000 order by object_id desc

索引方式

createindex idx_test_t_id_DESCon test_t(owner,object_iddesc)

COST

與執行計劃

Description

Object owner

Object name

Cost

Cardinality

Bytes

SELECT STATEMENT, GOAL = FIRST_ROWS

4

94298

9806992

TABLE ACCESS BY INDEX ROWID

SYS

TEST_T

4

94298

9806992

INDEX RANGE SCAN

SYS

IDX_TEST_T_ID_DESC

3

1

2、採用B*樹索引(預設為ASC),COST94103,執行計劃走的INDEX RANGE SCAN DESENDING

索引方式

createindex idx_test_t_id_DESC

on test_t(owner,object_id)

COST

與執行計劃

Description

Object owner

Object name

Cost

Cardinality

Bytes

SELECT STATEMENT, GOAL = FIRST_ROWS

94103

93792

9097824

TABLE ACCESS BY INDEX ROWID

SYS

TEST_T

94103

93792

9097824

INDEX RANGE SCAN DESCENDING

SYS

IDX_TEST_T_ID_ASC

287

93792

總結:

索引方式

COST

執行計劃

(owner,object_id desc)

4

INDEX RANGE SCAN

(owner,object_id)

94103

INDEX RANGE SCAN DESENDING

三、實際測試過程

SQL語句:select * from test_t where owner='SYS' and object_id > 50000 order by object_id desc

1、採用B*樹倒序索引(DESC)測試過程與結果

1test_t表上建立(OWNER+OBJECT_ID DESC)的倒序索引

   SQL>create index idx_test_t_id_DESC on test_t(owner,object_id desc)

2)重新收集統計資訊

  SQL> execdbms_stats.gather_table_stats(ownname=>'SYS',tabname => 'TEST_T',estimate_percent=> 20 , cascade=> TRUE );

3SQL執行計劃與COST 

Description

Object owner

Object name

Cost

Cardinality

Bytes

SELECT STATEMENT, GOAL = FIRST_ROWS

4

94298

9806992

TABLE ACCESS BY INDEX ROWID

SYS

TEST_T

4

94298

9806992

INDEX RANGE SCAN

SYS

IDX_TEST_T_ID_DESC

3

1

2B*樹索引(預設為ASC升序)測試過程與結果

1test_t表上建立(OWNER+OBJECT_ID)的普通預設ASC索引

  SQL>create index idx_test_t_id_ASC on test_t(owner,object_id)

2)重新收集統計資訊

  SQL> execdbms_stats.gather_table_stats(ownname=>'SYS',tabname => 'TEST_T',estimate_percent=> 20 , cascade=> TRUE );

3SQL執行計劃與COST

Description

Object owner

Object name

Cost

Cardinality

Bytes

SELECT STATEMENT, GOAL = FIRST_ROWS

94103

93792

9097824

TABLE ACCESS BY INDEX ROWID

SYS

TEST_T

94103

93792

9097824

INDEX RANGE SCAN DESCENDING

SYS

IDX_TEST_T_ID_ASC

287

93792

本文作者:黎俊傑(網名:踩點),從事系統架構、作業系統、儲存裝置、資料庫、中介軟體、應用程式六個層面系統性的效能優化工作

歡迎加入系統性能優化專業群,共同探討效能優化技術。群號:258187244