在使用基於成本的優化器的優化器時,優化器生產執行計劃時要估算每條SQL的執行成本,選擇最佳的執行計劃來執行sql語句。通過操縱統計信息就可以簡介操縱執行計劃的生成。
當然 需要強調的一點是,這是非常危險的行爲
1 創建測試表
SQL> create table test_stats as 2 select * from dba_objects ; Table created.
2 收集統計信息
SQL> EXEC dbms_stats.gather_table_stats(ownname => 'DAO',tabname => 'TEST_STATS',cascade => TRUE); PL/SQL procedure successfully completed.
3 創建索引
SQL> alter table TEST_STATS 2 add constraint dao_stats_pk primary key (OBJECT_ID); Table altered.
4 統計表行數並查看執行計劃
SQL> select count(*) 2 from dao.test_stats t ; COUNT(*) ---------- 75675 Execution Plan ---------------------------------------------------------- Plan hash value: 2395052010 ------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 44 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | INDEX FAST FULL SCAN| DAO_STATS_PK | 75675 | 44 (0)| 00:00:01 | ------------------------------------------------------------------------------ Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 164 consistent gets 0 physical reads 0 redo size 528 bytes sent via SQL*Net to client 523 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
5 利用dbms_stats.set_table_stats 修改表統計信息
SQL> BEGIN 2 dbms_stats.set_table_stats(ownname =>'DAO',tabname => 'TEST_STATS',numrows => 1,numblks => 1); 3 END ; 4 / PL/SQL procedure successfully completed.
SQL> select t.owner,t.table_name,t.num_rows,t.blocks 2 from dba_tables t 3 where t.table_name ='TEST_STATS' 4 AND T.OWNER='DAO'; OWNER TABLE_NAME NUM_ROWS BLOCKS ------------------------------ ------------------------------ ---------- ---------- DAO TEST_STATS 1 1
6 再次查看統計信息
SQL> select count(*) 2 from dao.test_stats t ; COUNT(*) ---------- 75675 Execution Plan ---------------------------------------------------------- Plan hash value: 1525674154 ------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| TEST_STATS | 1 | 2 (0)| 00:00:01 | ------------------------------------------------------------------------- Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 164 consistent gets 0 physical reads 0 redo size 528 bytes sent via SQL*Net to client 523 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed