Analyze使用場景
之前很多次都說到,對表的索引等信息進行了增刪改之后,需要對表進行analyze更新統計信息,才能使數據庫做出最好的執行計划,沒有注意到,即使是一張很小的空表,如果進行了字段的增刪改,也需要進行analyze,否則,執行計划也會出錯。
實際使用中,在給T1(新建寬表,頻繁更新字段中,但是數據量不大)使用merge進行單列更新時,發現select部分其實執行的很快,但是merge的時候執行效率極差,沒有辦法更新,嘗試給select部分使用parallel並行操作,可以得到結果。后來,對T1表進行analyze之后,可以很好的實現結果。所以,極有可能是是因為T1表進行的字段的增刪改而導致統計信息沒有及時更新而導致這種結果。
Merge into t T1 using (select '1001' as a, 2 as b from dual) T2 on (T1.a = T2.a) when matched then update set T1.b = T2.b;
所以即使是一張空表,如果對字段進行了增刪改,即使merge字段很少時,也需要對表進行analyze。也就是說當前表的查詢或其他性能不好時,都可以對相應的表進行一次分析。
Analyze概述
1. 要是CBO發揮最大的作用,就必須對對象進行分析。Oracle根據結果取cost最小的方案執行SQL。
2. 數據庫的分析可以通過analyze對表執行,也可以通過DBMS_DDL、DBMS_UTILITY、DBMS_STATS(沒有用過)等包批量分析某個用戶或者整個數據庫。
3. 命令truncate不會修改數據的統計信息.
4. 可以對數據庫的所有表每日特定時間進行分析,特殊情況下才手動analyze。
5. 一般使用①對表進行分析即可.
--① 分析表的所有字段,所有索引,所有索引字段。其中:① = ② analyze table student compute statistics; --② 分析表的所有字段,所有索引,所有索引字段。其中:① = ② analyze table student compute statistics for table for all indexes for all columns; --③ 只分析所有有索引的字段 analyze table student compute statistics for table for all indexes for all indexed columns; --④ 抽樣估算法 analyze table student estimate statistics sample 20 percent; --⑤ 刪除分析數據 analyze table student delete statistics; analyze table student delete statistics for table for all indexes for all indexed columns; --查看表的統計信息 select table_name,num_rows,blocks,empty_blocks from user_tables where table_name='student';