|
首先lz根本就没有搜集柱状图。
method_opt=>'size 1'代表的就是不搜集柱状图,这样分析之后,默认就会有两条记录在user_histograms中。所以,有两条记录恰好说明的是没有搜集柱状图。
SQL> select * from user_histograms
2 where table_name='TEST2' and column_name='OBJECT_ID';
no rows selected
SQL> exec dbms_stats.gather_table_stats('LONGRAW_USER','TEST2',estimate_percent=>100,cascade=>true,no_invalidate=>true,method_opt=>'for all columns size 1');
PL/SQL procedure successfully completed.
SQL> SQL> select * from user_histograms
2 where table_name='TEST2' and column_name='OBJECT_ID';
TABLE_NAME
------------------------------
COLUMN_NAME
-------------------------------------------------------------------------------------------------------------------------------------------------------------
ENDPOINT_NUMBER ENDPOINT_VALUE
--------------- --------------
ENDPOINT_ACTUAL_VALUE
-------------------------------------------------------------------------------------------------------------------------------------------------------------
TEST2
OBJECT_ID
0 2
TEST2
OBJECT_ID
1 61349
其次,对于where xxx like '%'||:bind_var会显示index range scan,我学习到了,以前没注意过。
果然如棉花糖说的,虽然显示的是range scan,但实际是走的full scan。
这个可以从他们的statistics看出来。
SQL> select /*+index(test)*/ object_id
2 from test where object_name like '%test';
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 569 | 12518 | 255 (1)| 00:00:04 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 569 | 12518 | 255 (1)| 00:00:04 |
|* 2 | INDEX FULL SCAN | IDXTEST | 569 | | 49 (3)| 00:00:01 |
---------------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
48 consistent gets
0 physical reads
0 redo size
326 bytes sent via SQL*Net to client
481 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
SQL> var a char(4);
SQL> exec :a:='test'
PL/SQL procedure successfully completed.
SQL> select /*+index(test)*/ object_id
2 from test where object_name like '%'||:a;
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 569 | 12518 | 34 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 569 | 12518 | 34 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDXTEST | 102 | | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
48 consistent gets
0 physical reads
0 redo size
326 bytes sent via SQL*Net to client
481 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed |
|