日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle 分析及动态采样

發(fā)布時(shí)間:2025/5/22 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle 分析及动态采样 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前在說Oracle Optimizer中的CBO時(shí)講到,當(dāng)表沒有做分析的時(shí)候,Oracle 會(huì)使用動(dòng)態(tài)采樣來收集統(tǒng)計(jì)信息。 獲取準(zhǔn)確的段對象(表,表分區(qū),索引等)的分析數(shù)據(jù),是CBO存在的基石,CBO的機(jī)制就是收集盡可能多的對象信息和系統(tǒng)信息,通過對這些信息進(jìn)行計(jì)算,分析,評估,最終得出一個(gè)成本最低的執(zhí)行計(jì)劃。 所以對于CBO,數(shù)據(jù)段的分析就非常重要。

?

Oracle Optimizer CBO RBO

http://blog.csdn.net/tianlesoftware/archive/2010/08/19/5824886.aspx

?

一.???????? 先演示一個(gè)示例,來理解分析的作用

?

1.1創(chuàng)建表

SQL> create table t as select object_id,object_name from dba_objects where 1=2;

表已創(chuàng)建。

SQL> create index index_t on t(object_id);

索引已創(chuàng)建。

SQL> insert into t select object_id,object_name from dba_objects;

已創(chuàng)建72926行。

SQL> commit;

提交完成。

?

1.2查看分的分析及執(zhí)行計(jì)劃

SQL> select num_rows,avg_row_len,blocks,last_analyzed from user_tables where table_name='T';

? NUM_ROWS AVG_ROW_LEN???? BLOCKS LAST_ANALYZED

---------- ----------- ---------- --------------

?

SQL> select blevel,leaf_blocks,distinct_keys,last_analyzed from user_indexes where table_name='T';

??? BLEVEL LEAF_BLOCKS DISTINCT_KEYS LAST_ANALYZED

---------- ----------- ------------- --------------

????? ???0?????????? 0???????????? 0 25-8月 -10

?

從查詢結(jié)果看出,表的行數(shù),行長,占用的數(shù)據(jù)塊數(shù)及最后的分析時(shí)間都是空。 索引的相關(guān)信息也沒有,說明這個(gè)表和說因都沒有被分析,如果此時(shí)有一條SQL 對表做查詢,CBO 由于無法獲取這些信息,很可能生成錯(cuò)誤的執(zhí)行計(jì)劃,如:

?

SQL> set linesize 200

SQL> set autot trace exp;

SQL> select /*+dynamic_sampling(t 0) */ * from t where object_id>30;

執(zhí)行計(jì)劃

----------------------------------------------------------

Plan hash value: 80339723

?

---------------------------------------------------------------------------------------

| Id? | Operation?????????????????? | Name??? | Rows? | Bytes | Cost (%CPU)| Time???? |

---------------------------------------------------------------------------------------

|?? 0 | SELECT STATEMENT??????????? |???????? |???? 4 |?? 316 |???? 0?? (0)| 00:00:01 |

|?? 1 |? TABLE ACCESS BY INDEX ROWID| T?????? |???? 4 |?? 316 |???? 0?? (0)| 00:00:01 |

|*? 2 |?? INDEX RANGE SCAN????????? | INDEX_T |???? 1 |?????? |???? 0?? (0)| 00:00:01 |

---------------------------------------------------------------------------------------

?

Predicate Information (identified by operation id):

---------------------------------------------------

?? 2 - access("OBJECT_ID">30)

SQL>

?

在Oracle 10g以后,如果一個(gè)表沒有做分析,數(shù)據(jù)庫將自動(dòng)對它做動(dòng)態(tài)采樣分析,所以這里采用hint的方式將動(dòng)態(tài)采樣的級別設(shè)置為0,即不使用動(dòng)態(tài)采樣。

?

???????? 從這個(gè)執(zhí)行計(jì)劃,看書CBO 估計(jì)出表中滿足條件的記錄為4條,索引使用了索引。 我們對表做一下分析,用結(jié)果比較一下。

?

1.3 分析表及查看分析之后的執(zhí)行計(jì)劃

分析可以通過兩中方式:

一種是analyze 命令,如:

analyze table tablename compute statistics for all indexes;

???????? 還有一種就是通過DBMS_STATS包來分析,從9i 開始,Oracle 推薦使用DBMS_STATS包對表進(jìn)行分析操作,因?yàn)镈BMS_STATS 提供了更多的功能,以及靈活的操作方式。

????????

SQL> exec dbms_stats.gather_table_stats('SYS','T');

PL/SQL 過程已成功完成。

SQL> select blevel,leaf_blocks,distinct_keys,last_analyzed from user_indexes where table_name='T';

??? BLEVEL LEAF_BLOCKS DISTINCT_KEYS LAST_ANALYZED

---------- ----------- ------------- --------------

???????? 1???????? 263???????? 72926 25-8月 -10

SQL> select num_rows,avg_row_len,blocks,last_analyzed from user_tables where table_name='T';

? NUM_ROWS AVG_ROW_LEN???? BLOCKS LAST_ANALYZED

---------- ----------- ---------- --------------

???? 72926????????? 29??????? 345 25-8月 -10

?

從上面的結(jié)果,可以看出DBMS_STATS.gather_table_stats已經(jīng)對表和索引都做了分析。 現(xiàn)在我們在來看一下執(zhí)行計(jì)劃。

?

SQL> set autot trace exp;

SQL> select * from t where object_id>30;

執(zhí)行計(jì)劃

----------------------------------------------------------

Plan hash value: 1601196873

--------------------------------------------------------------------------

| Id? | Operation???????? | Name | Rows? | Bytes | Cost (%CPU)| Time???? |

--------------------------------------------------------------------------

|?? 0 | SELECT STATEMENT? |????? | 72899 |? 2064K|??? 96?? (2)| 00:00:02 |

|*? 1 |? TABLE ACCESS FULL| T??? | 72899 |? 2064K|??? 96?? (2)| 00:00:02 |

--------------------------------------------------------------------------

?

Predicate Information (identified by operation id):

---------------------------------------------------

?

?? 1 - filter("OBJECT_ID">30)

?

從這個(gè)計(jì)劃,我們看出CBO 估算出的結(jié)果是72899 條記錄,與實(shí)際的72926很近。 此時(shí)選擇全表掃描更優(yōu)。 通過這個(gè)例子,我們也看出了分析對執(zhí)行計(jì)劃的重要性。

?

?

二.???????? 直方圖(Histogram)

DBMS_STATS 包對段表的分析有三個(gè)層次:

(1)表自身的分析: 包括表中的行數(shù),數(shù)據(jù)塊數(shù),行長等信息。

(2)列的分析:包括列值的重復(fù)數(shù),列上的空值,數(shù)據(jù)在列上的分布情況。

(3)索引的分析: 包括索引葉塊的數(shù)量,索引的深度,索引的聚合因子等。

?

直方圖就是 列分析中 數(shù)據(jù)在列上的分布情況。

?

???????? 當(dāng)Oracle 做直方圖分析時(shí),會(huì)將要分析的列上的數(shù)據(jù)分成很多數(shù)量相同的部分,每一部分稱為一個(gè)bucket,這樣CBO就可以非常容易地知道這個(gè)列上的數(shù)的分布情況,這種數(shù)據(jù)的分布將作為一個(gè)非常重要的因素納入到執(zhí)行計(jì)劃成本的計(jì)算當(dāng)中。

?

???????? 對于數(shù)據(jù)分布非常傾斜的表,做直方圖是非常有用的。 如: 1,10,20,30,40,50. 那么在一個(gè)數(shù)值范圍(bucket)內(nèi),它的數(shù)據(jù)記錄基本上一樣。 如果是:1,5,5,5,5,10,10,20,50,100. 那么它在bucket內(nèi),數(shù)據(jù)分布就是嚴(yán)重的傾斜。

?

???????? 直方圖有時(shí)對于CBO非常重要,特別是對于有字段數(shù)據(jù)非常傾斜的表,做直方圖分析尤為重要。 可以用dbms_stats包來分析。 默認(rèn)情況下,dbms_stats 包會(huì)對所有的列做直方圖分析。 如:??

???????? SQL> exec dbms_stats.gather_table_stats('SYS','T',cascade=>true);

PL/SQL 過程已成功完成。

?

然后從user_histograms視圖上查看到相關(guān)的信息:

?

SQL> select table_name,column_name,endpoint_number,endpoint_value from user_histograms where table_name='T';

TABLE_NAME???????????????????? COLUMN_NAME????????? ENDPOINT_NUMBER ENDPOINT_VALUE

------------------------------ -------------------- --------------- --------------

T????? ????????????????????????OBJECT_ID????????????????????????? 0????????????? 2

T????????????????????????????? OBJECT_NAME??????????????????????? 0???? 2.4504E+35

T????????????????????????????? OBJECT_ID????????????????????????? 1????????? 76685

T???????????? ?????????????????OBJECT_NAME??????????????????????? 1???? 1.0886E+36

?

如果一個(gè)列上的數(shù)據(jù)有比較嚴(yán)重的傾斜,對這個(gè)列做直方圖是必要的,但是,Oracle 對數(shù)據(jù)分析是需要消耗資源的,特別是對于一些很大的段對象,分析的時(shí)間尤其長。對于OLAP系統(tǒng),可能需要幾個(gè)小時(shí)才能完成。

???????? 所以做不做分析就需要DBA 權(quán)衡好了。 但有一點(diǎn)要注意, 不要在生產(chǎn)環(huán)境中隨便修改分析方案,除非你有十足的把握。 否則可能導(dǎo)致非常嚴(yán)重的后果。

?

?

三.???????? DBMS_STATS包

DBMS_STAS包不僅能夠?qū)Ρ磉M(jìn)行分析,它還可以對數(shù)據(jù)庫分析進(jìn)行管理。 按照功能可以分一下幾類:

(1)?????? 性能數(shù)據(jù)的收集

(2)?????? 性能數(shù)據(jù)的設(shè)置

(3)?????? 性能數(shù)據(jù)的刪除

(4)?????? 性能數(shù)據(jù)的備份和恢

?

更多信息參考Oracle 聯(lián)機(jī)文檔:

11g DBMS_STATS

http://download.oracle.com/docs/cd/E11882_01/appdev.112/e10577/d_stats.htm#ARPLS68486

?

10g DBMS_STATS

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i1036461

?

?

3.1 ?DBMS_STATS包的幾個(gè)常用功能:性能的手機(jī),設(shè)定 和刪除

???????? 性能數(shù)據(jù)的收集包含這樣幾個(gè)存儲(chǔ)過程:

GATHER_DATABASE_STATS Procedures
GATHER_DICTIONARY_STATS Procedure
GATHER_FIXED_OBJECTS_STATS Procedure
GATHER_INDEX_STATS Procedure
GATHER_SCHEMA_STATS Procedures
GATHER_SYSTEM_STATS Procedure
GATHER_TABLE_STATS Procedure

?

從名字也可以看出各自的作用,這些存儲(chǔ)過程用來收集數(shù)據(jù)庫不同級別對象的性能數(shù)據(jù),包括:數(shù)據(jù)庫,數(shù)據(jù)字典,表,索引,SCHEMA的性能等。

?

3.1.1? GATHER_TABLE_STATS Procedure 存儲(chǔ)過程

?

在10g中, GATHER_TABLE_STATS的參數(shù)如下:

DBMS_STATS.GATHER_TABLE_STATS (

?? ownname????????? VARCHAR2,

?? tabname????????? VARCHAR2,

?? partname???????? VARCHAR2 DEFAULT NULL,

?? estimate_percent NUMBER?? DEFAULT to_estimate_percent_type

??????????????????????????????????????????????? (get_param('ESTIMATE_PERCENT')),

?? block_sample???? BOOLEAN? DEFAULT FALSE,

?? method_opt?????? VARCHAR2 DEFAULT get_param('METHOD_OPT'),

?? degree?????????? NUMBER?? DEFAULT to_degree_type(get_param('DEGREE')),

?? granularity????? VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),

?? cascade????????? BOOLEAN? DEFAULT to_cascade_type(get_param('CASCADE')),

?? stattab????????? VARCHAR2 DEFAULT NULL,

?? statid?????????? VARCHAR2 DEFAULT NULL,

?? statown????????? VARCHAR2 DEFAULT NULL,

?? no_invalidate??? BOOLEAN? DEFAULT? to_no_invalidate_type (

???????????????????????????????????? get_param('NO_INVALIDATE')),

?? force??????????? BOOLEAN DEFAULT FALSE);

?

到了11g,對參數(shù)做了調(diào)整:

???????? DBMS_STATS.GATHER_TABLE_STATS (

?? ownname????????? VARCHAR2,

?? tabname????????? VARCHAR2,

?? partname???????? VARCHAR2 DEFAULT NULL,

?? estimate_percent NUMBER?? DEFAULT to_estimate_percent_type

??????????????????????????????????????? ????????(get_param('ESTIMATE_PERCENT')),

?? block_sample???? BOOLEAN? DEFAULT FALSE,

?? method_opt?????? VARCHAR2 DEFAULT get_param('METHOD_OPT'),

?? degree?????????? NUMBER?? DEFAULT to_degree_type(get_param('DEGREE')),

?? granularity????? VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),

?? cascade????????? BOOLEAN? DEFAULT to_cascade_type(get_param('CASCADE')),

?? stattab????????? VARCHAR2 DEFAULT NULL,

?? statid?????????? VARCHAR2 DEFAULT NULL,

?? statown????????? VARCHAR2 DEFAULT NULL,

?? no_invalidate??? BOOLEAN? DEFAULT? to_no_invalidate_type (

???????????????????????????????????? get_param('NO_INVALIDATE')),

?? force??????????? BOOLEAN DEFAULT FALSE);

?

對參數(shù)的說明:

Parameter

Description

ownname

Schema of table to analyze

tabname

Name of table

partname

Name of partition

estimate_percent

Percentage of rows to estimate (NULL means compute) The valid range is [0.000001,100]. Use the constant DBMS_STATS.AUTO_SAMPLE_SIZE to have Oracle determine the appropriate sample size for good statistics. This is the default.The default value can be changed using the SET_PARAM Procedure.

block_sample

Whether or not to use random block sampling instead of random row sampling. Random block sampling is more efficient, but if the data is not randomly distributed on disk, then the sample values may be somewhat correlated. Only pertinent when doing an estimate statistics.

method_opt

Accepts:

FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause]

FOR COLUMNS [size clause] column|attribute [size_clause] [,column|attribute [size_clause]...]

size_clause is defined as size_clause := SIZE {integer | REPEAT | AUTO | SKEWONLY}


- integer : Number of histogram buckets. Must be in the range [1,254].
- REPEAT : Collects histograms only on the columns that already have histograms.
- AUTO : Oracle determines the columns to collect histograms based on data distribution and the workload of the columns.
- SKEWONLY : Oracle determines the columns to collect histograms based on the data distribution of the columns.

The default is FOR ALL COLUMNS SIZE AUTO.The default value can be changed using the SET_PARAM Procedure.

degree

Degree of parallelism. The default for degree is NULL. The default value can be changed using the SET_PARAM Procedure NULL means use the table default value specified by the DEGREE clause in the CREATE TABLE or ALTER TABLE statement. Use the constant DBMS_STATS.DEFAULT_DEGREE to specify the default value based on the initialization parameters. The AUTO_DEGREE value determines the degree of parallelism automatically. This is either 1 (serial execution) or DEFAULT_DEGREE (the system default value based on number of CPUs and initialization parameters) according to size of the object.

granularity

Granularity of statistics to collect (only pertinent if the table is partitioned).

'ALL' - gathers all (subpartition, partition, and global) statistics

'AUTO'- determines the granularity based on the partitioning type. This is the default value.

'DEFAULT' - gathers global and partition-level statistics. This option is obsolete, and while currently supported, it is included in the documentation for legacy reasons only. You should use the 'GLOBAL AND PARTITION' for this functionality. Note that the default value is now 'AUTO'.

'GLOBAL' - gathers global statistics

'GLOBAL AND PARTITION' - gathers the global and partition level statistics. No subpartition level statistics are gathered even if it is a composite partitioned object.

'PARTITION '- gathers partition-level statistics

'SUBPARTITION' - gathers subpartition-level statistics.

cascade

Gather statistics on the indexes for this table. Index statistics gathering is not parallelized. Using this option is equivalent to running the GATHER_INDEX_STATS Procedure on each of the table's indexes. Use the constant DBMS_STATS.AUTO_CASCADE to have Oracle determine whether index statistics to be collected or not. This is the default. The default value can be changed using theSET_PARAM Procedure.

stattab

User statistics table identifier describing where to save the current statistics

statid

Identifier (optional) to associate with these statistics within stattab

statown

Schema containing stattab (if different than ownname)

no_invalidate

Does not invalidate the dependent cursors if set to TRUE. The procedure invalidates the dependent cursors immediately if set to FALSE. Use DBMS_STATS.AUTO_INVALIDATE. to have Oracle decide when to invalidate dependent cursors. This is the default. The default can be changed using the SET_PARAM Procedure.

force

Gather statistics of table even if it is locked

?

?

在gather_table_stats 存儲(chǔ)過程的所有參數(shù)中,除了ownname和tabname,其他的參數(shù)都有默認(rèn)值。 所以我們在調(diào)用這個(gè)存儲(chǔ)過程時(shí),Oracle 會(huì)使用參數(shù)的默認(rèn)值對表進(jìn)行分析。如:

SQL> exec dbms_stats.gather_table_STATS('SYS','T');

PL/SQL 過程已成功完成。

?

???????? 如果想查看當(dāng)前的默認(rèn)值,可以使用dbms_stats.get_param函數(shù)來獲取:

?

SQL> select dbms_stats.get_param('method_opt') from dual;

?

DBMS_STATS.GET_PARAM('METHOD_OPT')

------------------------------------------------------------

FOR ALL COLUMNS SIZE AUTO

?

結(jié)合上面對參數(shù)的說明:

???? - AUTO : Oracle determines the columns to collect histograms based on data distribution and the workload of the columns.

我們可以看出,就是對所有的列做直方圖分析,直方圖設(shè)置的bucket值由Oracle自己決定。

?

3.1.1.1? estimate_percent 參數(shù)

???????? 這個(gè)參數(shù)是一個(gè)百分比值,它告訴分析包需要使用表中數(shù)據(jù)的多大比例來做分析。

????????

理論上來講,采樣的數(shù)據(jù)越多,得到的信息就越接近于實(shí)際,CBO做出的執(zhí)行計(jì)劃就越優(yōu)化,但是,采樣越多,消耗的系統(tǒng)資源必然越多。 對系統(tǒng)的影響也越大。 所以對于這個(gè)值的設(shè)置,要根據(jù)業(yè)務(wù)情況來。 如果數(shù)據(jù)的直方圖分布比較均勻,就可以使用默認(rèn)值:AUTO_SAMPLE_SIZE,即讓Oracle 自己來判斷采樣的比例。有時(shí),特別是對于批量加載的表,我們可以預(yù)估表中的數(shù)據(jù)量,可以人工地設(shè)置一個(gè)合理的值。 一般,對于一個(gè)有1000萬數(shù)據(jù)的表分區(qū),可以把這個(gè)參數(shù)設(shè)置為0.000001.

?

3.1. 1.2 ?Method_option 參數(shù)

???????? 這個(gè)參數(shù)用來定義直方圖分析的一些值。

FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause]

FOR COLUMNS [size clause] column|attribute [size_clause] [,column|attribute [size_clause]...]

?

???????? 這里給出了4種指定哪些列進(jìn)行分析的方式:

(1)?????? 所有列:for all column

(2)?????? 索引列:只對有索引的列進(jìn)行分析,for all indexed columns

(3)?????? 影藏列:只對影藏的列進(jìn)行分析,for all hidden columns

(4)?????? 顯示指定列:顯示的指定那些列進(jìn)行分析,for columns columns_name

?

該參數(shù)默認(rèn)值:for all columns size auto.

????????

3.1. 1.3 degree 參數(shù)

用來指定分析時(shí)使用的并行度。 有以下這些設(shè)置:

(1)???? Null: 如果設(shè)置為null,Oracle 將使用被分析表屬性的并行度,比如表在創(chuàng)建時(shí)指定的并行度,或者后者使用alter table 重新設(shè)置的并行度。

(2)???? 一個(gè)數(shù)值: 可以顯示地指定分析時(shí)使用的并行度。

(3)???? Default_degree: 如果設(shè)置為default,Oracle 將根據(jù)初始化參數(shù)中相關(guān)參數(shù)的設(shè)置來決定使用的并行度。

?

這個(gè)參數(shù)的默認(rèn)值是Null,即通過表上的并行度屬性來決定分析使用的并行度。 當(dāng)需要分析的表或表分區(qū)非常大,并且系統(tǒng)資源比較充分的時(shí)候,就可以考慮使用并行的方式來做分析,這樣就會(huì)大大提高分析的速度。 相反,如果你的系統(tǒng)資源比較吃緊,那么啟用并行可能會(huì)適得其反。

?

3.1. 1.4 Granularity

分析的粒度,有以下幾個(gè)配置:

(1)?????? ALL : 將會(huì)對表的全局(global),分區(qū),子分區(qū)的數(shù)據(jù)都做分析

(2)?????? AUTO: Oracle 根據(jù)分區(qū)的類型,自動(dòng)決定做哪一種粒度的分析。

(3)?????? GLOBAL:只做全局級別的分析。

(4)?????? GLOBAL AND PARTITION: 只對全局和分區(qū)級別做分析,對子分區(qū)不做分析,這是和ALL的一個(gè)區(qū)別。

(5)?????? PARTITION: 只在分區(qū)級別做分析。

(6)?????? SUBPARTITION: 只在子分區(qū)做分析。

?

在生產(chǎn)環(huán)境中,特別是OLAP 或者數(shù)據(jù)倉庫的環(huán)境中,這個(gè)參數(shù)的設(shè)置會(huì)直接影響到CBO的執(zhí)行計(jì)劃選擇。

?

在OLAP或者數(shù)據(jù)倉庫系統(tǒng)中,經(jīng)常有這樣的事情,新創(chuàng)建一個(gè)分區(qū),將批量的數(shù)據(jù)(通常是很大的數(shù)據(jù))加載到分區(qū)中,對分區(qū)做分析,然后做報(bào)表或者數(shù)據(jù)挖掘。 在理想的情況下,對表的全局,分區(qū)都做分析,這樣才能得到最充足的數(shù)據(jù),但是通常這樣的表都非常大,如果每增加一個(gè)分區(qū)都需要做一次全局分析,那么會(huì)消耗極大的系統(tǒng)資源。 但是如果只對新加入的分區(qū)進(jìn)行分區(qū)而不做全局分析,oracle 在全局范圍內(nèi)的信息就會(huì)不準(zhǔn)確。

?

???????? 該參數(shù)在默認(rèn)情況下,DBMS_STATS 包會(huì)對表級(全局),分區(qū)級(對應(yīng)參數(shù)partition)都會(huì)進(jìn)行分析。 如果把cascade 設(shè)置為true,相應(yīng)索引的全局和分區(qū)級別也都會(huì)被分析。 如果只對分區(qū)級進(jìn)行分析,而全局沒有分析,那么全局信息沒有更新,依然會(huì)導(dǎo)致CBO 作出錯(cuò)誤的執(zhí)行計(jì)劃。

?

所以當(dāng)一些新的數(shù)據(jù)插入到表中時(shí),如果對這些新的數(shù)據(jù)進(jìn)行分析,是一個(gè)非常重要的問題。 一般參考如下原則:

(1)?????? 看一下新插入的數(shù)據(jù)在全表中所占的比例,如果所占比例不是很大,那么可以考慮不做全局分析,否則就需要考慮,一句是業(yè)務(wù)的實(shí)際運(yùn)行情況。

(2)?????? 采樣比例。 如果載入的數(shù)據(jù)量非常大,比如上千萬或者更大,就要把采樣比例壓縮的盡可能地小,但底線是不能影響CBO做出正確的執(zhí)行計(jì)劃,采樣比例的上線是不能消耗太多的資源而影響到業(yè)務(wù)的正常運(yùn)行。

(3)?????? 新加載的數(shù)據(jù)應(yīng)該要做分區(qū)級的數(shù)據(jù)分析。 至于是否需要直方圖分析,以及設(shè)置多少個(gè)buckets(size參數(shù)指定),需要DBA一句數(shù)據(jù)的分布情況進(jìn)行考慮,關(guān)鍵是視數(shù)據(jù)的傾斜程度而定。

?

?

3.1.2 ?GATHER_SCHEMA_STATS 存儲(chǔ)過程

???????? 這個(gè)存儲(chǔ)過程用于對某個(gè)用戶下所有的對象進(jìn)行分析。如果你的數(shù)據(jù)用戶對象非常多,單獨(dú)對每個(gè)對象進(jìn)行分析設(shè)定會(huì)非常不方便,這個(gè)存儲(chǔ)過程就很方便。 它的好處在于如果需要分析的對象非常多,將可以大大降低DBA的工作量,不足之處是所有分析使用相同的分析策略,可能會(huì)導(dǎo)致分析不是最優(yōu)。 所以要根據(jù)實(shí)際情況來決定。

?

???????? 該存儲(chǔ)過程參數(shù)如下:

???????? DBMS_STATS.GATHER_SCHEMA_STATS (

?? ownname????????? VARCHAR2,

?? estimate_percent NUMBER?? DEFAULT to_estimate_percent_type

??????????????????????????????????????????????? (get_param('ESTIMATE_PERCENT')),

?? block_sample???? BOOLEAN? DEFAULT FALSE,

?? method_opt?????? VARCHAR2 DEFAULT get_param('METHOD_OPT'),

?? degree?????????? NUMBER?? DEFAULT to_degree_type(get_param('DEGREE')),

?? granularity????? VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),

?? cascade????????? BOOLEAN? DEFAULT to_cascade_type(get_param('CASCADE')),

?? stattab????????? VARCHAR2 DEFAULT NULL,

?? statid?????????? VARCHAR2 DEFAULT NULL,

?? options????????? VARCHAR2 DEFAULT 'GATHER',

?? objlist????????? OUT????? ObjectTab,

?? statown????????? VARCHAR2 DEFAULT NULL,

?? no_invalidate??? BOOLEAN? DEFAULT to_no_invalidate_type (

???????????????????????????????????? get_param('NO_INVALIDATE')),

? force???????????? BOOLEAN DEFAULT FALSE,

? obj_filter_list? ObjectTab DEFAULT NULL);

?

參數(shù)說明如下:

Parameter

Description

ownname

Schema to analyze (NULL means current schema)

estimate_percent

Percentage of rows to estimate (NULL means compute): The valid range is [0.000001,100]. Use the constant DBMS_STATS.AUTO_SAMPLE_SIZE to have Oracle determine the appropriate sample size for good statistics. This is the default.The default value can be changed using the SET_DATABASE_PREFS Procedure, SET_GLOBAL_PREFS Procedure, SET_SCHEMA_PREFS Procedure and SET_TABLE_PREFS Procedure.

block_sample

Whether or not to use random block sampling instead of random row sampling. Random block sampling is more efficient, but if the data is not randomly distributed on disk, then the sample values may be somewhat correlated. Only pertinent when doing an estimate statistics.

method_opt

Accepts:

FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause]

size_clause is defined as size_clause := SIZE {integer | REPEAT | AUTO | SKEWONLY}


- integer : Number of histogram buckets. Must be in the range [1,254].
- REPEAT : Collects histograms only on the columns that already have histograms.
- AUTO : Oracle determines the columns to collect histograms based on data distribution and the workload of the columns.
- SKEWONLY : Oracle determines the columns to collect histograms based on the data distribution of the columns.

The default is FOR ALL COLUMNS SIZE AUTO.The default value can be changed using the SET_DATABASE_PREFS Procedure, SET_GLOBAL_PREFS Procedure, SET_SCHEMA_PREFS Procedure and SET_TABLE_PREFS Procedure.

degree

Degree of parallelism. The default for degree is NULL. The default value can be changed using the SET_DATABASE_PREFS Procedure, SET_GLOBAL_PREFS Procedure, SET_SCHEMA_PREFS Procedure and SET_TABLE_PREFS Procedure. NULL means use the table default value specified by the DEGREE clause in the CREATE TABLE or ALTER TABLE statement. Use the constant DBMS_STATS.DEFAULT_DEGREE to specify the default value based on the initialization parameters.The AUTO_DEGREE value determines the degree of parallelism automatically. This is either 1 (serial execution) or DEFAULT_DEGREE (the system default value based on number of CPUs and initialization parameters) according to size of the object.

granularity

Granularity of statistics to collect (only pertinent if the table is partitioned).

'ALL' - gathers all (subpartition, partition, and global) statistics

'AUTO'- determines the granularity based on the partitioning type. This is the default value.

'DEFAULT' - gathers global and partition-level statistics. This option is obsolete, and while currently supported, it is included in the documentation for legacy reasons only. You should use the 'GLOBAL AND PARTITION' for this functionality. Note that the default value is now 'AUTO'.

'GLOBAL' - gathers global statistics

'GLOBAL AND PARTITION' - gathers the global and partition level statistics. No subpartition level statistics are gathered even if it is a composite partitioned object.

'PARTITION '- gathers partition-level statistics

'SUBPARTITION' - gathers subpartition-level statistics.

cascade

Gather statistics on the indexes as well. Using this option is equivalent to running the GATHER_INDEX_STATS Procedure on each of the indexes in the schema in addition to gathering table and column statistics. Use the constant DBMS_STATS.AUTO_CASCADE to have Oracle determine whether index statistics to be collected or not. This is the default. The default value can be changed using the SET_DATABASE_PREFS Procedure, SET_GLOBAL_PREFS Procedure, SET_SCHEMA_PREFS Procedure and SET_TABLE_PREFS Procedure.

stattab

User statistics table identifier describing where to save the current statistics

statid

Identifier (optional) to associate with these statistics within stattab

options

Further specification of which objects to gather statistics for:

GATHER: Gathers statistics on all objects in the schema.

GATHER AUTO: Gathers all necessary statistics automatically. Oracle implicitly determines which objects need new statistics, and determines how to gather those statistics. When GATHER AUTO is specified, the only additional valid parameters are ownname, stattab, statid, objlist and statown; all other parameter settings are ignored. Returns a list of processed objects.

GATHER STALE: Gathers statistics on stale objects as determined by looking at the *_tab_modifications views. Also, return a list of objects found to be stale.

GATHER EMPTY: Gathers statistics on objects which currently have no statistics. also, return a list of objects found to have no statistics.

LIST AUTO: Returns a list of objects to be processed with GATHER AUTO.

LIST STALE: Returns list of stale objects as determined by looking at the *_tab_modifications views.

LIST EMPTY: Returns list of objects which currently have no statistics.

objlist

List of objects found to be stale or empty

statown

Schema containing stattab (if different than ownname)

no_invalidate

Does not invalidate the dependent cursors if set to TRUE. The procedure invalidates the dependent cursors immediately if set to FALSE. Use DBMS_STATS.AUTO_INVALIDATE. to have Oracle decide when to invalidate dependent cursors. This is the default. The default can be changed using the SET_DATABASE_PREFS Procedure, SET_GLOBAL_PREFS Procedure, SET_SCHEMA_PREFS Procedure and SET_TABLE_PREFS Procedure.

force

Gather statistics on objects even if they are locked

obj_filter_list

A list of object filters. When provided, GATHER_SCHEMA_STATS will gather statistics only on objects which satisfy at least one object filter in the list as needed. In a single object filter, we can specify the constraints on the object attributes. The attribute values specified in the object filter are case- insensitive unless double-quoted. Wildcard is allowed in the attribute values. Suppose non-NULL values s1, s2, ... are specified for attributes a1, a2, ... in one object filter. An object o is said to satisfy this object filter if (o.a1 like s1) and (o.a2 like s2) and ... is true. See Applying an Object Filter List.

?

?

3.1.3 ?DBMS_STATS.GATHER_INDEX_STATS 存儲(chǔ)過程

???????? 該存儲(chǔ)過程用于對索引的分析,如果我們在使用DBMS_STATS.GATHER_TABLES_STATS的分析時(shí)設(shè)置參數(shù)cascade=>true。 那么Oracle會(huì)同時(shí)執(zhí)行這個(gè)存儲(chǔ)過程來對索引進(jìn)行分析。

?

存儲(chǔ)過程參數(shù):

DBMS_STATS.GATHER_INDEX_STATS (

?? ownname????????? VARCHAR2,

?? indname????????? VARCHAR2,

?? partname???????? VARCHAR2 DEFAULT NULL,

?? estimate_percent NUMBER?? DEFAULT to_estimate_percent_type

??????????????????????????????????????????????? (GET_PARAM('ESTIMATE_PERCENT')),

?? stattab????????? VARCHAR2 DEFAULT NULL,

?? statid?????????? VARCHAR2 DEFAULT NULL,

?? statown????????? VARCHAR2 DEFAULT NULL,

?? degree?????????? NUMBER?? DEFAULT to_degree_type(get_param('DEGREE')),

?? granularity????? VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),

?? no_invalidate??? BOOLEAN? DEFAULT to_no_invalidate_type

??????????????????????????????????????????? ???(GET_PARAM('NO_INVALIDATE')),

?? force??????????? BOOLEAN DEFAULT FALSE);

?

Parameter

Description

ownname

Schema of index to analyze

indname

Name of index

partname

Name of partition

estimate_percent

Percentage of rows to estimate (NULL means compute). The valid range is [0.000001,100]. Use the constant DBMS_STATS.AUTO_SAMPLE_SIZE to have Oracle determine the appropriate sample size for good statistics. This is the default.The default value can be changed using the SET_DATABASE_PREFS Procedure, SET_GLOBAL_PREFS Procedure, SET_SCHEMA_PREFS Procedure and SET_TABLE_PREFS Procedure.

stattab

User statistics table identifier describing where to save the current statistics

statid

Identifier (optional) to associate with these statistics within stattab

statown

Schema containing stattab (if different than ownname)

degree

Degree of parallelism. The default for degree is NULL. The default value can be changed using the SET_DATABASE_PREFS Procedure, SET_GLOBAL_PREFS Procedure, SET_SCHEMA_PREFS Procedure and SET_TABLE_PREFS Procedure. NULL means use of table default value that was specified by the DEGREE clause in the CREATE/ALTER INDEX statement. Use the constant DBMS_STATS.DEFAULT_DEGREE for the default value based on the initialization parameters. The AUTO_DEGREE value determines the degree of parallelism automatically. This is either 1 (serial execution) or DEFAULT_DEGREE (the system default value based on number of CPUs and initialization parameters) according to size of the object.

granularity

Granularity of statistics to collect (only pertinent if the table is partitioned).

'ALL' - gathers all (subpartition, partition, and global) statistics

'AUTO'- determines the granularity based on the partitioning type. This is the default value.

'DEFAULT' - gathers global and partition-level statistics. This option is obsolete, and while currently supported, it is included in the documentation for legacy reasons only. You should use the 'GLOBAL AND PARTITION' for this functionality. Note that the default value is now 'AUTO'.

'GLOBAL' - gathers global statistics

'GLOBAL AND PARTITION' - gathers the global and partition level statistics. No subpartition level statistics are gathered even if it is a composite partitioned object.

'PARTITION '- gathers partition-level statistics

'SUBPARTITION' - gathers subpartition-level statistics.

no_invalidate

Does not invalidate the dependent cursors if set to TRUE. The procedure invalidates the dependent cursors immediately if set to FALSE. Use DBMS_STATS.AUTO_INVALIDATE. to have Oracle decide when to invalidate dependent cursors. This is the default. The default can be changed using the SET_DATABASE_PREFS Procedure, SET_GLOBAL_PREFS Procedure, SET_SCHEMA_PREFS Procedure and SET_TABLE_PREFS Procedure.

force

Gather statistics on object even if it is locked

?

?

上面討論了三個(gè)常用的存儲(chǔ)過程。 分析對CBO 來說非常重要,如果不能按照自己的系統(tǒng)指定出切合實(shí)際的數(shù)據(jù)分析方案,可能會(huì)導(dǎo)致如下問題的發(fā)生:

(1)?????? 分析信息不充分導(dǎo)致CBO 產(chǎn)生錯(cuò)誤的執(zhí)行計(jì)劃,導(dǎo)致SQL執(zhí)行效率低下。

(2)?????? 過多的分析工具帶來系統(tǒng)性能的嚴(yán)重下降。

?

?

?

3.2 ?DBMS_STATS包管理功能

3.2.1 獲取分析數(shù)據(jù)

GET_COLUMN_STATS Procedures
GET_INDEX_STATS Procedures
GET_SYSTEM_STATS Procedure
GET_TABLE_STATS Procedure

?

這四個(gè)存儲(chǔ)過程分別為用戶獲取字段,索引,表和系統(tǒng)的統(tǒng)計(jì)信息。 它的用法是首先定義要獲取性能指標(biāo)的變量,然后使用存儲(chǔ)過程將性能指標(biāo)的值賦給變量,最后將變量的值輸出。 ?如:

?

SQL> set serveroutput on

SQL> declare

? 2? dist number;

? 3? dens number;

? 4? ncnt number;

? 5? orec dbms_stats.statrec;

? 6? avgc number;

? 7? begin

? 8? dbms_stats.get_column_stats('SYS','T','object_ID',distcnt=>dist,density=>dens,nullcnt=>ncnt,srec=>orec,avgclen=>avgc);

? 9? dbms_output.put_line('the distcnt is:' ||to_char(dist));

?10? dbms_output.put_line('the density is:' ||to_char(dens));

?11? dbms_output.put_line('the nullcnt is:' ||to_char(ncnt));

?12? dbms_output.put_line('the srec is:' ||to_char(ncnt));

?13? dbms_output.put_line('the avgclen is:' ||to_char(avgc));

?14? end;

?15? /

the distcnt is:72926

the density is:.0000137125305103804

the nullcnt is:0

the srec is:0

the avgclen is:5

?

PL/SQL 過程已成功完成。

?

更多信息參考:

???????? http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i1036461

?

3.2.2 設(shè)置分析數(shù)據(jù)

SET_COLUMN_STATS Procedures
SET_INDEX_STATS Procedures
SET_SYSTEM_STATS Procedure
SET_TABLE_STATS Procedure

?

這幾個(gè)存儲(chǔ)過程允許我們手工地為字段,索引,表和系統(tǒng)性能數(shù)據(jù)賦值。 它的一個(gè)用處是當(dāng)相應(yīng)的指標(biāo)不準(zhǔn)確導(dǎo)致執(zhí)行計(jì)劃失敗時(shí),可以使用這種方法手工地來為這些性能數(shù)據(jù)賦值。 在極端情況下,這也不失為一個(gè)解決問題的方法。

?

關(guān)于這4個(gè)存儲(chǔ)過程的絕提用法參考 oracle 聯(lián)機(jī)文檔:

???????? http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i1036461

?

?

3.2.3 刪除分析數(shù)據(jù)

DELETE_COLUMN_STATS Procedure
DELETE_DATABASE_STATS Procedure
DELETE_DICTIONARY_STATS Procedure
DELETE_FIXED_OBJECTS_STATS Procedure
DELETE_INDEX_STATS Procedure
DELETE_SCHEMA_STATS Procedure
DELETE_SYSTEM_STATS Procedure
DELETE_TABLE_STATS Procedure

?

當(dāng)性能數(shù)據(jù)出現(xiàn)異常導(dǎo)致CBO判斷錯(cuò)誤時(shí),為了立刻修正這個(gè)錯(cuò)誤,刪除性能數(shù)據(jù)也是一種補(bǔ)救的方法,比如刪除了表的數(shù)據(jù),讓CBO重新對表做動(dòng)態(tài)采樣分析,得到一個(gè)正確的結(jié)果。

???????? 它可以刪除字段,數(shù)據(jù)庫,數(shù)據(jù)字典,基表,索引,表等級別的性能數(shù)據(jù)。

?

具體參考o(jì)racle 聯(lián)機(jī)文檔:

???????? http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i1036461

?

3.2.4 保存分析數(shù)據(jù)

CREATE_STAT_TABLE Procedure
DROP_STAT_TABLE Procedure

????????

???????? 可以用這兩個(gè)存儲(chǔ)過程創(chuàng)建一個(gè)表,用于存放性能數(shù)據(jù),這樣有利于對性能數(shù)據(jù)的管理,也可以刪除這個(gè)表。

?

具體參考o(jì)racle 聯(lián)機(jī)文檔:

???????? http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i1036461

?

?

3.2.5 導(dǎo)入和導(dǎo)出分析數(shù)據(jù)

EXPORT_COLUMN_STATS Procedure
EXPORT_DATABASE_STATS Procedure
EXPORT_DICTIONARY_STATS Procedure
EXPORT_FIXED_OBJECTS_STATS Procedure
EXPORT_INDEX_STATS Procedure
EXPORT_SCHEMA_STATS Procedure
EXPORT_SYSTEM_STATS Procedure
EXPORT_TABLE_STATS Procedure

IMPORT_COLUMN_STATS Procedure
IMPORT_DATABASE_STATS Procedure
IMPORT_DICTIONARY_STATS Procedure
IMPORT_FIXED_OBJECTS_STATS Procedure
IMPORT_INDEX_STATS Procedure
IMPORT_SCHEMA_STATS Procedure
IMPORT_SYSTEM_STATS Procedure
IMPORT_TABLE_STATS Procedure

?

這些存儲(chǔ)過程可以將已經(jīng)有的性能指標(biāo)導(dǎo)入到用戶創(chuàng)建好的表中存放,需要時(shí),可以從表中倒回來。

?

具體參考o(jì)racle 聯(lián)機(jī)文檔:

???????? http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i1036461

?

?

3.2.6 鎖定分析數(shù)據(jù)

LOCK_SCHEMA_STATS Procedure
LOCK_TABLE_STATS Procedure

UNLOCK_SCHEMA_STATS Procedure
UNLOCK_TABLE_STATS Procedure

The LOCK_* procedures either freeze the current set of the statistics or to keep the statistics empty (uncollected).When statistics on a table are locked, all the statistics depending on the table, including table statistics, column statistics, histograms and statistics on all dependent indexes, are considered to be locked.

可能在某些時(shí)候,我們覺得當(dāng)前的統(tǒng)計(jì)信息非常好,執(zhí)行計(jì)劃很準(zhǔn)確,并且表中數(shù)據(jù)幾乎不變化,那么可以使用LOCK_TABLE_STATS Procedure 來鎖定表的統(tǒng)計(jì)信息,不允許對表做分析或者設(shè)定分析數(shù)據(jù)。 當(dāng)表的分析數(shù)據(jù)被鎖定之后,相關(guān)的所有分析數(shù)據(jù),包括表級,列級,直方圖,索引的分析數(shù)據(jù)都將被鎖定,不允許被更新。

?

具體參考o(jì)racle 聯(lián)機(jī)文檔:

???????? http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i1036461

?

?

3.2.7 分析數(shù)據(jù)的恢復(fù)

RESET_PARAM_DEFAULTS Procedure
RESTORE_DICTIONARY_STATS Procedure
RESTORE_FIXED_OBJECTS_STATS Procedure
RESTORE_SCHEMA_STATS Procedure
RESTORE_SYSTEM_STATS Procedure
RESTORE_TABLE_STATS Procedure

Whenever statistics in dictionary are modified, old versions of statistics are saved automatically for future restoring. The old statistics are purged automatically at regular intervals based on the statistics history retention setting and the time of recent statistics gathering performed in the system. Retention is configurable using the ALTER_STATS_HISTORY_RETENTION Procedure.

比如我們重新分析了表,發(fā)現(xiàn)分析的數(shù)據(jù)導(dǎo)致了CBO選擇了錯(cuò)誤的執(zhí)行計(jì)劃,為了挽救這種局面,可以將統(tǒng)計(jì)信息恢復(fù)到從前的那個(gè)時(shí)間點(diǎn),也就是CBO執(zhí)行計(jì)劃正確的時(shí)間點(diǎn),先解決這個(gè)問題,再來分析問題的原因。

?

具體參考o(jì)racle 聯(lián)機(jī)文檔:

???????? http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i1036461

?

?

四.???????? 動(dòng)態(tài)采樣

?

4.1 什么是動(dòng)態(tài)采樣

???????? 動(dòng)態(tài)采樣(Dynamic Sampling)技術(shù)的最初提出是在Oracle 9i R2,在段(表,索引,分區(qū))沒有分析的情況下,為了使CBO 優(yōu)化器得到足夠的信息以保證做出正確的執(zhí)行計(jì)劃而發(fā)明的一種技術(shù),可以把它看做分析手段的一種補(bǔ)充。

???????? 當(dāng)段對象沒有統(tǒng)計(jì)信息時(shí)(即沒有做分析),動(dòng)態(tài)采樣技術(shù)可以通過直接從需要分析的對象上收集數(shù)據(jù)塊(采樣)來獲得CBO需要的統(tǒng)計(jì)信息。

?

一個(gè)簡單的例子:

?

創(chuàng)建表:

SQL> create table t

? 2? as

? 3? select owner,object_type from all_objects;

表已創(chuàng)建。

?

查看表的記錄數(shù):

SQL> select count(*) from t;

COUNT(*)

----------

72236? -- 記錄數(shù)

?

這里創(chuàng)建了一張普通表,沒有做分析,我們在hint中用0級來限制動(dòng)態(tài)采樣,此時(shí)CBO 唯一可以使用的信息就是表存儲(chǔ)在數(shù)據(jù)字典中的一些信息,如有多少個(gè)extent,有多少個(gè)block,但是這些信息是不夠的。

?

SQL> set autot traceonly explain

SQL> select /*+dynamic_sampling(t 0) */ * from t;

?

執(zhí)行計(jì)劃

----------------------------------------------------------

Plan hash value: 1601196873

?

--------------------------------------------------------------------------

| Id? | Operation???????? | Name | Rows? | Bytes | Cost (%CPU)| Time???? |

--------------------------------------------------------------------------

|?? 0 | SELECT STATEMENT? |????? | 15928 |?? 435K|??? 55?? (0)| 00:00:01 |

|?? 1 |? TABLE ACCESS FULL| T??? | 15928 |?? 435K|??? 55?? (0)| 00:00:01 |

?

在沒有做動(dòng)態(tài)分析的情況下,CBO 估計(jì)的記錄數(shù)是15928條,與真實(shí)的72236 相差甚遠(yuǎn)。

?

我們用動(dòng)態(tài)分析來查看一下:

SQL> select * from t;

執(zhí)行計(jì)劃

----------------------------------------------------------

Plan hash value: 1601196873

?

--------------------------------------------------------------------------

| Id? | Operation???????? | Name | Rows? | Bytes | Cost (%CPU)| Time???? |

--------------------------------------------------------------------------

|?? 0 | SELECT STATEMENT? |????? | 80232 |? 2193K|??? 56?? (2)| 00:00:01 |

|?? 1 |? TABLE ACCESS FULL| T??? | 80232 |? 2193K|??? 56?? (2)| 00:00:01 |

--------------------------------------------------------------------------

?

Note

-----

?? - dynamic sampling used for this statement (level=2)

?

在Oracle 10g中默認(rèn)對沒有分析的段做動(dòng)態(tài)采樣,上面的查詢結(jié)果顯示使用了Level 2級的動(dòng)態(tài)采樣,CBO 估計(jì)的結(jié)果是80232 與72236 很接近了。

?

注意一點(diǎn):

???????? 在沒有動(dòng)態(tài)采樣的情況下,對于沒有分析過的段,CBO也可能錯(cuò)誤地將結(jié)果判斷的程度擴(kuò)大話。 如:

SQL> delete from t;

已刪除72236行。

SQL> commit;

提交完成。

SQL> select /*+dynamic_sampling(t 0) */ * from t;

執(zhí)行計(jì)劃

----------------------------------------------------------

Plan hash value: 1601196873

--------------------------------------------------------------------------

| Id? | Operation???????? | Name | Rows? | Bytes | Cost (%CPU)| Time???? |

--------------------------------------------------------------------------

|?? 0 | SELECT STATEMENT? |????? | 15928 |?? 435K|??? 55?? (0)| 00:00:01 |

|?? 1 |? TABLE ACCESS FULL| T??? | 15928 |?? 435K|??? 55?? (0)| 00:00:01 |

--------------------------------------------------------------------------

?

SQL> select * from t;

執(zhí)行計(jì)劃

----------------------------------------------------------

Plan hash value: 1601196873

--------------------------------------------------------------------------

| Id? | Operation???????? | Name | Rows? | Bytes | Cost (%CPU)| Time???? |

--------------------------------------------------------------------------

|?? 0 | SELECT STATEMENT? |????? |??? ?1 |??? 28 |??? 55?? (0)| 00:00:01 |

|?? 1 |? TABLE ACCESS FULL| T??? |???? 1 |??? 28 |??? 55?? (0)| 00:00:01 |

--------------------------------------------------------------------------

Note

-----

?? - dynamic sampling used for this statement (level=2)

?

如果細(xì)心一點(diǎn),可能看出2個(gè)執(zhí)行計(jì)劃的差別。 在沒有采用動(dòng)態(tài)分析的情況下,CBO 對t表估計(jì)的還是15928行記錄,但是用動(dòng)態(tài)分析就顯示1條記錄。 而表中的數(shù)據(jù)在查詢之前已經(jīng)刪除掉了。? 出現(xiàn)這種情況的原因是因?yàn)楦咚弧?雖然表的數(shù)據(jù)已經(jīng)刪除,但是表分配的extent 和block 沒有被回收,所以在這種情況下CBO 依然認(rèn)為有那么多的數(shù)據(jù)在那。

????????

???????? 通過這一點(diǎn),我們可以看出,此時(shí)CBO能夠使用的信息非常有限,也就是這個(gè)表有幾個(gè)extent,有幾個(gè)block。 但動(dòng)態(tài)采樣之后,Oracle 立即發(fā)現(xiàn),原來數(shù)據(jù)塊中都是空的。

?

關(guān)于Oracle 高水位,參考我的blog:Oracle 高水位(HWM)

http://blog.csdn.net/tianlesoftware/archive/2009/10/22/4707900.aspx

?

動(dòng)態(tài)采樣有兩方面的作用:

(1)?????? CBO 依賴的是充分的統(tǒng)計(jì)分析信息,但是并不是每個(gè)用戶都會(huì)非常認(rèn)真,及時(shí)地去對每個(gè)表做分析。 為了保證執(zhí)行計(jì)劃都盡可能地正確,Oracle 需要使用動(dòng)態(tài)采樣技術(shù)來幫助CBO 獲取盡可能多的信息。

(2)?????? 全局臨時(shí)表。 通常來講,臨時(shí)表的數(shù)據(jù)是不做分析的,因?yàn)樗娣诺臄?shù)據(jù)是臨時(shí)性的,可能很快就釋放了,但是當(dāng)一個(gè)查詢關(guān)聯(lián)到這樣的臨時(shí)表時(shí),CBO要想獲得臨時(shí)表上的統(tǒng)計(jì)信息分析數(shù)據(jù),就只能依賴于動(dòng)態(tài)采樣了。

?

動(dòng)態(tài)采樣除了可以在段對象沒有分析時(shí),給CBO提供分析數(shù)據(jù)之外,還有一個(gè)獨(dú)特的能力,它可以對不同列之間的相關(guān)性做統(tǒng)計(jì)。

?

相對的,表分析的信息是獨(dú)立的。 如:

(1)?????? 表的行數(shù),平均行長。

(2)?????? 表的每個(gè)列的最大值,最小值,重復(fù)率,也可能包含直方圖。

(3)?????? 索引的聚合因子,索引葉的塊數(shù)目,索引的高度等。

?

盡管看到動(dòng)態(tài)采樣的優(yōu)點(diǎn),但是它的缺點(diǎn)也是顯而易見,否則Oracle 一定會(huì)一直使用動(dòng)態(tài)采樣來取代數(shù)據(jù)分析:

(1)?????? 采樣的數(shù)據(jù)塊有限,對于海量數(shù)據(jù)的表,結(jié)果難免有偏差。

(2)?????? 采樣會(huì)消耗系統(tǒng)資源,特別是OLTP數(shù)據(jù)庫,尤其不推薦使用動(dòng)態(tài)采樣。

?

?

4.2 動(dòng)態(tài)采樣的級別

???????? Oracle 為動(dòng)態(tài)采樣劃分了11個(gè)級別,在Oracle 的官網(wǎng)上詳細(xì)的介紹。

?????????????????? 13.5.7.4 Dynamic Sampling Levels

????????????? http://download.oracle.com/docs/cd/E11882_01/server.112/e10821/stats.htm#PFGRF94760

?

The sampling levels are as follows if the dynamic sampling level used is from a cursor hint or from the OPTIMIZER_DYNAMIC_SAMPLING initialization parameter:

Level 0: Do not use dynamic sampling.

Level 1: Sample all tables that have not been analyzed if the following criteria are met: (1) there is at least 1 unanalyzed table in the query; (2) this unanalyzed table is joined to another table or appears in a subquery or non-mergeable view; (3) this unanalyzed table has no indexes; (4) this unanalyzed table has more blocks than the number of blocks that would be used for dynamic sampling of this table. The number of blocks sampled is the default number of dynamic sampling blocks (32).

Level 2: Apply dynamic sampling to all unanalyzed tables. The number of blocks sampled is two times the default number of dynamic sampling blocks.

Level 3: Apply dynamic sampling to all tables that meet Level 2 criteria, plus all tables for which standard selectivity estimation used a guess for a predicate that is a potential dynamic sampling predicate. The number of blocks sampled is the default number of dynamic sampling blocks. For unanalyzed tables, the number of blocks sampled is twice the default number of dynamic sampling blocks.

Level 4: Apply dynamic sampling to all tables that meet Level 3 criteria, plus all tables that have single-table predicates that reference 2 or more columns. The number of blocks sampled is the default number of dynamic sampling blocks. For unanalyzed tables, the number of blocks sampled is two times the default number of dynamic sampling blocks.

Levels 5, 6, 7, 8, and 9: Apply dynamic sampling to all tables that meet the previous level criteria using 2, 4, 8, 32, or 128 times the default number of dynamic sampling blocks respectively.

Level 10: Apply dynamic sampling to all tables that meet the Level 9 criteria using all blocks in the table.

?

The sampling levels are as follows if the dynamic sampling level for a table is set using the DYNAMIC_SAMPLING optimizer hint:

Level 0: Do not use dynamic sampling.

Level 1: The number of blocks sampled is the default number of dynamic sampling blocks (32).

Levels 2, 3, 4, 5, 6, 7, 8, and 9: The number of blocks sampled is 2, 4, 8, 16, 32, 64, 128, or 256 times the default number of dynamic sampling blocks respectively.

Level 10: Read all blocks in the table.

4.2.1 Level 0

???????? 不做動(dòng)態(tài)分析

?

4.2.2 Level 1

???????? Oracle 對沒有分析的表進(jìn)行動(dòng)態(tài)采樣,但需要同時(shí)滿足以下4個(gè)條件。

(1)?????? SQL中至少有一個(gè)未分析的表

(2)?????? 未分析的表出現(xiàn)在關(guān)聯(lián)查詢或者子查詢中

(3)?????? 未分析的表沒有索引

(4)?????? 未分析的表占用的數(shù)據(jù)塊要大于動(dòng)態(tài)采樣默認(rèn)的數(shù)據(jù)塊(32個(gè))

?

4.2.3 Level 2

???????? 對所有的未分析表做分析,動(dòng)態(tài)采樣的數(shù)據(jù)塊是默認(rèn)數(shù)據(jù)塊的2倍。

?

4.2.4 Level 3

???????? 采樣的表包含滿足Level 2定義的所有表,同時(shí)包括,那些謂詞有可能潛在地需要?jiǎng)討B(tài)采樣的表,這些動(dòng)態(tài)采樣的數(shù)據(jù)塊為默認(rèn)數(shù)據(jù)塊,對沒有分析的表,動(dòng)態(tài)采樣的默認(rèn)塊為默認(rèn)數(shù)據(jù)塊的2倍。

?

4.2.5 Level 4

???????? 采樣的表包含滿足Level 3定義的表,同時(shí)還包括一些表,他們包含一個(gè)單表的謂詞會(huì)引用另外的2個(gè)列或者更多的列;采樣的塊數(shù)是動(dòng)態(tài)采樣默認(rèn)數(shù)據(jù)塊數(shù);對沒有分析的表,動(dòng)態(tài)采樣的數(shù)據(jù)塊為默認(rèn)數(shù)據(jù)塊的2倍。

?

4.2.6 Level 5,6,7,8,9

???????? 采樣的表包含滿足Level 4定義的表,同時(shí)分別使用動(dòng)態(tài)采樣默認(rèn)數(shù)據(jù)塊的2,4,8,32,128 倍的數(shù)量來做動(dòng)態(tài)分析。

?

4.2.7 Level 10

???????? 采樣的表包含滿足Level 9定義的所有表,同時(shí)對表的所有數(shù)據(jù)進(jìn)行動(dòng)態(tài)采樣。

?

?

采樣的數(shù)據(jù)塊越多,得到的分析數(shù)據(jù)就越接近與真實(shí),但同時(shí)伴隨著資源消耗的也越大。

?

?

4.3 什么時(shí)候使用動(dòng)態(tài)采樣

???????? 動(dòng)態(tài)采樣也需要額外的消耗數(shù)據(jù)庫資源,所以,如果 SQL 被反復(fù)執(zhí)行,變量被綁定,硬分析很少,在這樣一個(gè)環(huán)境中,是不宜使用動(dòng)態(tài)采樣的,就像OLTP系統(tǒng)。 動(dòng)態(tài)采樣發(fā)生在硬分析時(shí),如果很少有硬分析發(fā)生,動(dòng)態(tài)采樣的意義就不大。

?

???????? 而在OLAP或者數(shù)據(jù)倉庫環(huán)境下,SQL執(zhí)行消耗的資源要遠(yuǎn)遠(yuǎn)大于SQL解析,那么讓解析在消耗多一點(diǎn)資源做一些動(dòng)態(tài)采樣分析,從而做出一個(gè)最優(yōu)的執(zhí)行計(jì)劃是非常值得的。 實(shí)際上在這樣的環(huán)境中,硬分析消耗的資源幾乎是可以忽略的。

?

???????? 所以,一般在OLAP 或者數(shù)據(jù)倉庫環(huán)境中,將動(dòng)態(tài)采樣的level 設(shè)置為3或者4 比較好。 相反,在OLTP系統(tǒng)下,不應(yīng)該使用動(dòng)態(tài)采樣。

?

?

FROM:http://blog.csdn.net/tianlesoftware/article/details/5845028

轉(zhuǎn)載于:https://www.cnblogs.com/zlja/archive/2011/07/11/2449092.html

總結(jié)

以上是生活随笔為你收集整理的Oracle 分析及动态采样的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

婷婷婷国产在线视频 | 成年人三级网站 | 国产精品福利视频 | 99产精品成人啪免费网站 | 精品视频免费 | 人人擦 | 91丨九色丨国产在线 | 国产精在线 | 国产理论片在线观看 | 成 人 免费 黄 色 视频 | 色综合天天色综合 | 玖玖爱国产在线 | 天天爱天天射 | 色吧久久 | 一区二区三区av在线 | 国产亚洲精品成人av久久ww | 国产97免费| 欧美影院久久 | 亚洲天堂色婷婷 | 亚洲资源在线网 | 久热久草在线 | 亚洲精品一区二区18漫画 | 久久理伦片 | 欧美视频不卡 | 波多野结衣亚洲一区二区 | 国产麻豆电影 | 91成人网在线 | 久久精品欧美一 | 日日爽日日操 | 天天操婷婷 | 久久香蕉国产精品麻豆粉嫩av | 亚洲精品视频一 | 99国产精品一区二区 | 揉bbb玩bbb少妇bbb | 国产一区福利在线 | 国内精品视频一区二区三区八戒 | 永久免费视频国产 | 91视频久久久久久 | 99在线热播精品免费 | 免费观看性生活大片3 | 综合激情av| 婷婷激情影院 | 日韩在线播放欧美字幕 | 91av网址 | 一区二区三区精品久久久 | 日韩成人精品 | 国产69精品久久99的直播节目 | 麻豆精品在线 | 探花视频免费在线观看 | 99视频精品在线 | 91人人揉日日捏人人看 | 欧美专区日韩专区 | 免费看久久 | 2000xxx影视 | 人人要人人澡人人爽人人dvd | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 人人干在线观看 | 国产日韩中文字幕 | 91免费高清 | 99精品久久久久久久 | 精品国产乱码久久久久久浪潮 | 日韩精品亚洲专区在线观看 | 美女视频又黄又免费 | 国产小视频精品 | 亚洲91av| 色婷婷国产 | 精品99免费 | 亚洲伊人网在线观看 | 狠狠操综合 | 欧美色噜噜噜 | 免费看三级 | 97狠狠操| 中文字幕区 | 免费在线精品视频 | 国产日韩视频在线观看 | 亚洲欧洲日韩 | 人人干人人搞 | 欧美精品三级 | 99电影456麻豆 | 福利视频一区二区 | 91在线免费视频 | 国产剧情一区二区在线观看 | 亚洲精品视频在线观看免费视频 | www.国产在线观看 | 精品一区二区在线免费观看 | 日韩视频一区二区在线 | 国产免费一区二区三区最新6 | 久草男人天堂 | 亚洲va欧美va国产va黑人 | 久久精品视 | 韩日av在线| 日韩在线视频免费看 | 五月天婷婷在线视频 | 最新超碰 | 中文字幕中文字幕在线中文字幕三区 | 在线亚洲激情 | 久久午夜电影院 | 亚洲精品视频网址 | 欧美性天天 | 精品久久久久久亚洲综合网站 | 久久免费公开视频 | 国产明星视频三级a三级点| 国产丝袜美腿在线 | 一区二区三区免费在线 | 国产高清不卡在线 | 日产乱码一二三区别在线 | 亚洲精品视频在 | 西西444www高清大胆 | 日韩视频一区二区三区在线播放免费观看 | 国产精品第三页 | 色97在线| 欧美不卡视频在线 | 成人在线视频论坛 | 国产成人高清在线 | 2020天天干夜夜爽 | 欧美精品在线观看 | 久久99精品波多结衣一区 | 三级黄色网络 | 国产91勾搭技师精品 | 日韩视频在线不卡 | 欧美另类z0zx | 国产一区在线视频播放 | 狠狠色综合欧美激情 | 亚洲天天做 | 久久久久久片 | 欧美一区免费在线观看 | 久久免费av电影 | japanesexxxhd奶水 91在线精品一区二区 | 国产精品久久精品国产 | 成人中文字幕+乱码+中文字幕 | 国产视频导航 | 特级大胆西西4444www | 蜜臀av夜夜澡人人爽人人桃色 | 精品999久久久 | 九九热在线精品视频 | 亚洲精品久久久久中文字幕二区 | 久久婷婷国产 | 国产成人精品一区二三区 | 中文字幕一区二区三区四区在线视频 | 国产一区二区高清视频 | 亚洲一区久久久 | 91综合视频在线观看 | 蜜臀av免费一区二区三区 | 在线观看日韩免费视频 | 人人干人人干人人干 | 久久99国产综合精品免费 | 999久久a精品合区久久久 | 欧美美女一级片 | 亚洲日日射 | 中文字幕免费观看视频 | 欧美性成人 | 国产精品嫩草影院99网站 | 色婷婷综合久久久 | 四虎最新域名 | 精品 激情 | 久久免费精品 | 波多野结衣动态图 | 日韩四虎 | 国产欧美三级 | 国产成人精品在线观看 | 国内精品久久久久久久久久久久 | 久久久www | 日韩av中文在线观看 | 狠狠躁天天躁 | 国产中文伊人 | 国产成人免费观看久久久 | 青青啪| 97av在线视频 | 在线免费观看国产精品 | 精品久久久久久久久久久久久久久久久久 | www.久草.com | 又黄又爽又色无遮挡免费 | 亚洲国产欧洲综合997久久, | 456成人精品影院 | 黄a在线观看 | 日韩精品视频在线免费观看 | 99re视频在线观看 | 俺要去色综合狠狠 | 日日干天天爽 | 中文字幕在线看人 | 亚洲高清av| 国产国产人免费人成免费视频 | 国产精品第一页在线观看 | 国产精品一区二区三区在线播放 | 亚洲码国产日韩欧美高潮在线播放 | 久久精品99国产精品日本 | 久久爱资源网 | 狠狠色丁香婷婷综合久小说久 | 国产在线视频一区二区 | 国产一级精品绿帽视频 | 精品国产一二三 | 少妇bbb好爽| 日韩免费在线观看网站 | 国产精品国产三级国产aⅴ无密码 | 久久好看 | 婷婷伊人五月天 | 欧美a影视 | 91在线看黄 | 亚洲精品视频播放 | 99亚洲视频| 婷婷六月久久 | 久久官网| 久久久久久久久久久影院 | 综合久色 | 日韩精品影视 | 四虎在线免费视频 | 色妞久久福利网 | 最新国产中文字幕 | 欧美在线1区 | 波多野结衣在线播放一区 | 久久综合久久综合这里只有精品 | 国产一级电影免费观看 | 国产专区在线 | 色小说av| 在线观看的av | 网站在线观看你们懂的 | 久久久久黄色 | 日韩欧美一区二区三区视频 | 久久人人爽爽 | 亚洲视频免费在线看 | 久久久久综合网 | 少妇18xxxx性xxxx片 | 免费观看www小视频的软件 | 在线观看电影av | 国产精品人人做人人爽人人添 | 成年人电影免费在线观看 | 免费色av| 丁香婷婷综合五月 | 久久tv视频 | 亚洲一级片免费观看 | 亚洲黄网站 | 日韩在线视频免费看 | 精品一区二区在线免费观看 | 玖玖在线看 | 色综合久久久久综合体桃花网 | 成 人 免费 黄 色 视频 | 免费看国产曰批40分钟 | 狠狠色丁香久久婷婷综合_中 | 又爽又黄又刺激的视频 | 精品一区欧美 | 日韩在线视频二区 | 久久影院一区 | 亚洲男人天堂a | 久草在线资源观看 | 天天插天天操天天干 | 五月天综合激情网 | 国产精品久久久久永久免费 | 色婷婷综合久久久 | 久久99热精品 | 久久久久国产精品视频 | 亚洲综合国产精品 | 国产女v资源在线观看 | 免费看黄的视频 | 色综合天天综合网国产成人网 | 成人黄色在线观看视频 | 麻豆视传媒官网免费观看 | 中文字幕在线字幕中文 | 国产 中文 日韩 欧美 | 一级片免费视频 | 中文字幕网址 | 国产中文视 | 麻豆视频在线免费 | 午夜精品久久久久久久久久久 | 黄色特级片 | 国产一区免费在线观看 | 免费看v片 | 日韩精品在线播放 | 在线不卡的av | 少妇性bbb搡bbb爽爽爽欧美 | 国产精品毛片久久蜜 | 欧美乱淫视频 | 国产欧美最新羞羞视频在线观看 | 久久久国产精华液 | 中文av影院 | 黄色影院在线免费观看 | 一区二区三区免费 | 婷婷新五月 | 中文字幕视频一区 | 国产日韩视频在线播放 | 亚洲九九影院 | 免费在线观看av电影 | av不卡免费看 | 免费大片黄在线 | 91亚洲精| 中文字幕影视 | 国产精品久久久久久久午夜片 | 欧美另类高潮 | 在线观看中文字幕网站 | 91精品国产综合久久福利不卡 | 成人免费大片黄在线播放 | 日韩精品一区电影 | 久久精品视频网站 | 欧美午夜久久 | 久久人操 | 国产黄大片在线观看 | 色wwww| 成人a免费 | 久久a热6 | 成人一级在线 | 久久综合狠狠综合久久激情 | a视频在线播放 | 日本韩国在线不卡 | 久久午夜羞羞影院 | 在线av资源 | 黄色av免费 | 在线观看午夜 | 99精品在线免费观看 | 91精品在线看 | 天天射天天搞 | 天天操福利视频 | 911在线| 热99在线视频 | 天天操天天干天天操天天干 | va视频在线 | 国产精品日韩精品 | aa一级片| av成人在线网站 | 99精品国产高清在线观看 | 九九综合在线 | 91丨九色丨国产在线 | 操一草 | 亚洲毛片在线观看. | 国产原创在线视频 | 国产在线观看不卡 | 久久久久www | 欧美一级电影在线观看 | www日日| 国产精品欧美日韩在线观看 | 免费午夜网站 | 国产美女精品视频免费观看 | 免费情缘| 亚洲开心色 | www国产一区| 天天操天天舔天天爽 | 欧美国产在线看 | 亚洲综合成人婷婷小说 | 天天色天天爱天天射综合 | 日韩有码在线观看视频 | 91看片淫黄大片91 | 精品视频 | 性色视频在线 | 天天天色综合 | 国内小视频 | 人人插超碰 | 久久久国产一区二区三区四区小说 | 日本中文字幕在线免费观看 | 亚洲天堂网视频在线观看 | 亚洲激精日韩激精欧美精品 | 久久久久久久久久久综合 | 97日日碰人人模人人澡分享吧 | 91国内在线 | 国产麻豆精品95视频 | 国产亚洲精品久久久久动 | 久久久精品国产一区二区三区 | 欧美成人精品欧美一级乱黄 | 在线小视频 | 亚洲情影院 | 日日操天天操夜夜操 | 国产精品美女久久久久久免费 | 日日精品 | 久久精品国产免费看久久精品 | 日韩精品在线一区 | 国产在线资源 | 亚洲精品大片www | 色九九影院 | 天天射一射| 中文字幕资源站 | 超碰人人av | 国产精品日韩在线播放 | 97电影在线观看 | 亚洲一区二区视频在线播放 | 天天av综合网 | 久久亚洲影视 | 手机在线看片日韩 | 韩国精品在线观看 | 成人免费视频观看 | 18网站在线观看 | 亚洲国产经典视频 | 久久激五月天综合精品 | 亚洲97在线 | av高清一区二区三区 | 色婷久久 | 91丨九色丨高潮丰满 | 久久99网站| 国产三级av在线 | 午夜精品一区二区三区免费 | 日韩二区在线播放 | 久久久av电影 | 91人人人 | www.色午夜.com | 人人讲 | 国产亚洲精品久 | 一区二区三区电影在线播 | 在线观看黄色免费视频 | 成人免费看黄 | 99亚洲视频| 久久综合久久综合久久 | 成人 国产 在线 | 五月天电影免费在线观看一区 | 欧美日产一区 | 中文字幕黄网 | 国产成人精品久久 | 亚洲欧美视频一区二区三区 | 69人人| 欧美日韩成人 | 国产精品美女免费视频 | 碰天天操天天 | 麻豆国产在线播放 | 日韩精品aaa | 亚洲人成在线观看 | 激情自拍av | 欧美激情综合五月色丁香小说 | 日韩欧三级 | 天堂成人在线 | 免费成人av | 日韩视频免费在线观看 | 激情久久久久 | 成人h在线播放 | 色爱区综合激月婷婷 | 久久久影院 | 日韩美女高潮 | 爱爱av在线 | 干综合网 | 91mv.cool在线观看 | 亚洲天天 | 久久新 | 国产裸体永久免费视频网站 | 91在线视频精品 | 国产黄大片 | 亚洲区另类春色综合小说校园片 | 青青看片 | 成人av观看 | 精品久久久久久久久亚洲 | 欧美日韩精品国产 | 欧美一级高清片 | 国产.精品.日韩.另类.中文.在线.播放 | 精品一区二区日韩 | 亚洲va欧美va人人爽 | 欧美日韩亚洲在线观看 | 国产成人精品午夜在线播放 | 日本中文字幕在线一区 | 色婷在线| 亚洲精品永久免费视频 | 超碰免费97 | 色视频网站在线观看一=区 a视频免费在线观看 | 五月花婷婷 | 精品久久久久国产 | 婷婷丁香在线视频 | 国产99久久九九精品免费 | 国产xxxx性hd极品 | 婷婷国产精品 | 麻豆精品在线视频 | 韩国精品在线观看 | 粉嫩av一区二区三区免费 | 激情开心色 | 天天爽人人爽夜夜爽 | 国产精品美女毛片真酒店 | 日韩欧美观看 | 精品视频国产一区 | 91久久国产综合精品女同国语 | 精品久久久久免费极品大片 | av888.com| 99精品视频免费在线观看 | 91麻豆精品一区二区三区 | 国际精品久久久久 | 日韩在线视频免费观看 | 久久精品99国产精品 | 色婷婷丁香 | 丝袜网站在线观看 | 国产伦理久久精品久久久久_ | 国内免费的中文字幕 | 日韩电影在线观看一区 | 日韩在线观看av | 欧美a性| 99视频免费 | 人人澡超碰碰 | 黄色软件在线观看免费 | 国产精品免费看 | 男女拍拍免费视频 | 亚洲 欧美 综合 在线 精品 | 在线色资源 | 最近中文字幕mv免费高清在线 | 91麻豆产精品久久久久久 | 国产中文字幕一区 | 中文字幕在线观看一区 | 国产精品福利av | 欧美精品一区二区三区四区在线 | 久久一区二区三区日韩 | 少妇bbb搡bbbb搡bbbb | 亚洲精品乱码久久久久久蜜桃欧美 | 亚洲国产人午在线一二区 | 免费av网址大全 | 欧美日韩中文在线观看 | 中文字幕资源在线观看 | 黄色毛片一级片 | 密桃av在线 | 黄色大全视频 | 天天艹天天操 | 欧美片一区二区三区 | 国产不卡av在线播放 | 嫩草伊人久久精品少妇av | 国产手机在线精品 | 亚洲黄色在线免费观看 | 97超碰成人 | 免费午夜av | 一区二区精品 | 亚洲第一中文网 | 91精品啪 | 91大片成人网 | 福利av在线| 日韩有码专区 | 丁香婷婷综合五月 | 日韩综合第一页 | 久久久久久久久久免费视频 | 国产精品毛片一区视频 | 最新99热 | 国产精品三级视频 | 91在线小视频 | 婷婷色av| 色综合国产 | 啪啪激情网 | 成人av影院在线观看 | 美女天天操 | 香蕉视频最新网址 | 国产精品18久久久 | 91福利区一区二区三区 | 国产日产av| 丁香激情综合国产 | 欧美精品久久天天躁 | 国产午夜不卡 | 国产 日韩 欧美 在线 | 日韩最新在线 | 国产精品久久久久久久久婷婷 | 2019天天干天天色 | 91黄色免费看 | 五月天国产 | 久久综合国产伦精品免费 | 亚洲免费在线看 | 色综合久 | 中文字幕乱码电影 | 国产精品久久久久久久久久免费看 | 天天躁日日躁狠狠 | 国产精品k频道 | 在线播放你懂 | 免费日韩一区二区三区 | 麻豆高清免费国产一区 | 日韩中文字幕国产精品 | 美女免费视频网站 | 九九亚洲视频 | 少妇自拍av | 国产二区电影 | 9热精品 | 91成人免费看片 | 国产a级精品 | 色姑娘综合网 | av三级在线免费观看 | 激情五月亚洲 | 在线精品视频在线观看高清 | 97精品国产一二三产区 | 亚洲高清在线精品 | 国产精品毛片一区二区在线 | 国产在线观看你懂得 | 最新国产精品拍自在线播放 | 久久久久国产一区二区三区四区 | 国产亚洲资源 | 亚洲精品永久免费视频 | 天天综合网~永久入口 | 中文字幕一区二区三区四区久久 | 国产日韩在线播放 | 久久精品一二三 | 久久视频在线免费观看 | 又色又爽又黄高潮的免费视频 | av福利电影 | 91精品麻豆 | 午夜久久久久久久久久久 | 色综合天天狠天天透天天伊人 | 337p西西人体大胆瓣开下部 | 高潮久久久 | 国产高清免费在线观看 | 在线观看一级片 | 99久久毛片 | 亚洲五月激情 | 欧美a级在线 | 国产 视频 久久 | 久草精品资源 | 欧美成人一二区 | 中文字幕日本在线 | 亚州精品天堂中文字幕 | 国产精品不卡一区 | 午夜精品视频福利 | 日韩在线观看三区 | 99久久精品国产毛片 | 婷婷在线免费 | 人人搞人人爽 | 在线看国产一区 | 亚洲美女视频在线观看 | 国产护士hd高朝护士1 | av电影av在线 | 中文字幕在线视频国产 | 欧美一级黄色片 | 欧美性精品 | 9在线观看免费高清完整版 玖玖爱免费视频 | 久久国产热 | 日韩高清成人 | 在线免费观看麻豆视频 | 亚洲精品影院在线观看 | 日本黄色特级片 | 激情婷婷久久 | 99精品国产一区二区三区麻豆 | 狠狠操导航| 在线观看精品视频 | 日韩网站在线播放 | 色在线视频网 | 亚洲免费黄色 | 91视频 - 88av | 狠狠的日日 | 亚洲一区 影院 | 亚洲精品视频免费看 | 波多野结衣一区二区三区中文字幕 | 国产精品成人免费一区久久羞羞 | 99热在线看| 久久国产精品久久久久 | 天堂久久电影网 | 在线观看免费高清视频大全追剧 | 五月婷婷色 | 精品视频区| 国产亚洲精品久久久久久 | 69xx视频 | 亚洲一级黄色 | 天天色官网 | 97国产大学生情侣酒店的特点 | 午夜久久久久久久久 | 久久乐九色婷婷综合色狠狠182 | 国产精品地址 | 91精彩视频 | 成人av免费电影 | 国产精品四虎 | 国产二区免费视频 | 中文字幕av有码 | av丝袜制服 | 99精品久久99久久久久 | 国产资源网 | 色婷婷福利 | 91精品国产一区二区三区 | 天天激情在线 | 亚洲电影在线看 | 国产一区二区久久久久 | 日韩精品久久久久久 | 精品免费视频 | 成人在线播放视频 | 日韩精品在线看 | 久久成人高清 | 亚洲综合精品在线 | 国产免费嫩草影院 | 欧美国产不卡 | 久久久国产一区二区三区四区小说 | 一区二区三区免费在线观看视频 | 欧美日韩国产一二三区 | 天天操天天操天天操天天操 | 亚洲精品男人天堂 | 黄色毛片视频免费 | 亚洲精品mv在线观看 | 在线观看国产永久免费视频 | 国产精品人人做人人爽人人添 | 久久夜色精品国产欧美乱 | 欧美国产在线看 | 亚洲精品五月 | 伊人五月天 | 五月天激情综合 | www.久草.com| 亚洲成成品网站 | 午夜精品一区二区三区在线播放 | 丝袜精品视频 | 狠狠干成人综合网 | 天天插伊人 | 久久久久欧美精品 | 91视频 - 114av| 国产精品a久久 | 成人免费观看在线视频 | 人人擦| 国产a级精品 | 日本中文乱码卡一卡二新区 | a级国产乱理论片在线观看 伊人宗合网 | 午夜婷婷网| 久久玖| 日韩av成人 | 久久免费的精品国产v∧ | 久久新 | 成人av一区二区在线观看 | 九九九视频精品 | 婷婷综合五月天 | 成人精品久久久 | 亚洲精品字幕 | 国产精品午夜在线 | 狠狠干成人| 天天插天天操天天干 | 精品一区二区三区电影 | 亚洲高清精品在线 | 亚av在线| 国产成人久久精品一区二区三区 | 国产成人一区二 | 正在播放五月婷婷狠狠干 | av在线亚洲天堂 | 久久亚洲私人国产精品va | 麻豆av一区二区三区在线观看 | 日本高清免费中文字幕 | 久久婷婷一区 | 国产亚洲免费观看 | 久久男人中文字幕资源站 | 亚洲国产精品电影在线观看 | 综合网天天射 | 国产精品一区二区在线观看 | 婷婷在线色| 亚洲少妇xxxx| 日韩中文字幕亚洲一区二区va在线 | 国产成人精品一区一区一区 | 天天色播| 成人超碰在线 | 亚洲成熟女人毛片在线 | 日本中文字幕电影在线免费观看 | 国产精品久久久久久久久久久免费看 | 91影视成人| 在线观看a视频 | 99欧美精品| 国产精品久久久久久久7电影 | 国产精品99久久久精品 | 99热这里只有精品久久 | 天天天在线综合网 | 亚洲成人资源在线观看 | 99精品视频免费 | 在线观看深夜福利 | 中文字幕在线免费看线人 | 国产高清精 | 成人在线免费看视频 | 在线观看精品一区 | 在线观看亚洲成人 | 亚洲国产播放 | 99爱这里只有精品 | 亚洲国产精品va在线看黑人 | 天天操天天操天天干 | 免费在线观看黄 | 色婷婷视频在线观看 | 九九久久精品 | 久久狠狠婷婷 | 狠色狠色综合久久 | 青青草国产精品 | 日韩中文字幕网站 | 成人激情开心网 | 国产午夜精品理论片在线 | 亚洲综合最新在线 | 日韩,精品电影 | 久久99精品久久久久久秒播蜜臀 | 射射射av | 国产在线观看二区 | 久久免费的精品国产v∧ | 草久草久 | 欧美做受高潮电影o | 西西4444www大胆视频 | 国产精品久久久久久久久岛 | 丁香花中文在线免费观看 | 日韩欧美电影在线 | 欧美一区二区三区激情视频 | 欧美色图亚洲图片 | 国产精品综合久久 | 在线亚州 | 日本久久成人 | 特级片免费看 | 国产96精品 | 日韩精品中文字幕一区二区 | 久久精品国产亚洲a | 一级黄色片在线观看 | 中文字幕资源网在线观看 | 精品国产美女在线 | 国产精品久久久久久电影 | 日韩电影在线观看一区 | 久久国产热视频 | 不卡的av在线播放 | 国产小视频在线免费观看视频 | 国产亚洲精品无 | 最近高清中文在线字幕在线观看 | 久久精品国产久精国产 | 久久人人爽人人片 | 成年人视频在线 | 欧美日韩不卡在线 | 91久久久久久国产精品 | www.伊人网 | 午夜丰满寂寞少妇精品 | www.99久久.com | 精品国产一区二区三区久久影院 | 国产看片 色 | 欧美日韩在线观看不卡 | 日韩高清免费无专码区 | 国产精品久久久久久久久久不蜜月 | 久久综合九色综合久99 | 亚洲欧美少妇 | 久久,天天综合 | 在线一二区 | 久久99久国产精品黄毛片入口 | 色网站黄| 午夜视频不卡 | 日韩在线看片 | 伊人丁香| 久久久久久毛片 | 国产精品 国产精品 | 天天操夜操视频 | 日韩有码在线播放 | 精品国产乱码久久久久久久 | 黄色小网站免费看 | 国产a级精品 | 天天操天天爱天天干 | 久久久人| 国产做a爱一级久久 | 欧美a级成人淫片免费看 | 国产精品国内免费一区二区三区 | 日日夜夜免费精品视频 | 国产欧美日韩视频 | 亚洲免费精品一区二区 | 色偷偷男人的天堂av | 三级a视频 | 二区三区在线视频 | 久久视频二区 | 免费a级大片 | 欧洲激情在线 | 狠狠干狠狠色 | 亚洲在线免费视频 | 国产一级片毛片 | 欧美极度另类性三渗透 | 7799av| 久久图 | 亚洲第一色 | 91视频在线看 | 日日夜夜狠狠操 | 久久男女视频 | 不卡中文字幕在线 | 精品高清美女精品国产区 | 在线视频 你懂得 | 激情综合一区 | 中文在线www | 狠狠网 | 91精品久久久久久粉嫩 | 在线观看成人av | 久久精品视频观看 | 欧美午夜性 | 五月婷婷激情六月 | 欧美动漫一区二区三区 | 亚洲在线国产 | 四虎成人精品永久免费av | 九九热re| 一区二区中文字幕在线观看 | 在线观看中文字幕亚洲 | 亚洲成人动漫在线观看 | 日韩免费在线看 | 成人一级在线 | 黄色软件在线观看 | 国产成人综合精品 | 青青河边草观看完整版高清 | 亚洲精品动漫在线 | 久久艹国产 | 91成人天堂久久成人 | 999国内精品永久免费视频 | 美女黄视频免费 | 天天躁日日躁狠狠 | 黄色在线观看污 | 日日夜夜天天操 | 国产高清视频在线 | 午夜丁香视频在线观看 | 一区二区三区日韩在线 | 精品视频区 | 夜夜操天天 | 夜夜骑日日操 | 亚洲精品视频在线观看免费 | 国产免费亚洲高清 | 国产视频精品免费 | 精品在线一区二区 | 免费91在线观看 | 日日麻批40分钟视频免费观看 | 久久高清毛片 | 夜夜躁狠狠躁日日躁 | 韩国一区视频 | 亚洲理论在线观看 | 午夜精品一区二区三区可下载 | 97精品免费视频 | 中文国产字幕 | 中文有码在线视频 | 九九热精品在线 | 2019精品手机国产品在线 | 日本久久久久久久久久 | 久久天堂影院 | 午夜久久久久久久久久久 | 美女视频一区二区 | 日韩美精品视频 | 久久综合五月 | www久久久 | 精品在线观看免费 | 成人午夜电影网站 | 国产高清网站 | a视频在线| 免费看91的网站 | 久久精品国产第一区二区三区 | 91热精品 | 久久免费视频国产 | 日韩黄色一区 | 成全在线视频免费观看 | 欧美专区亚洲专区 | 在线视频观看国产 | www激情com | 久久精品亚洲一区二区三区观看模式 | 久久久久久久影视 | 国产精品美乳一区二区免费 | 在线观看免费视频你懂的 | 91在线视频导航 | 亚洲aⅴ在线观看 | 欧美日韩免费看 | 国产在线观看91 | 日韩69av | 中文字幕亚洲欧美日韩 | 国产手机免费视频 | 福利一区在线 | 亚洲精品久久久久中文字幕二区 | 免费高清在线观看成人 | 又黄又爽又色无遮挡免费 | 国产第一页精品 | 色综合网在线 | 国产精品1000 | 亚洲九九| 韩国av电影在线观看 | 免费热情视频 | 99视频精品免费视频 | 国产成人精品在线播放 | 一区二区精品视频 | 96av视频| 国产视频一区精品 | 国产精品99久久久久久小说 | 99热官网 | 亚洲欧美国产精品久久久久 | 激情综合站| 国产一区免费 | 国语精品久久 | 99视频导航| 六月丁香婷婷在线 | 久久精品免视看 | 九九久久国产 | 91香蕉视频720p| 极品国产91在线网站 | 久久久久久久久久网 | 免费看91的网站 | 黄色毛片观看 | 黄色一区二区在线观看 | 天天色天天艹 | 欧美日韩中文在线观看 | 国产中文字幕网 | 国产日本亚洲 | 亚州欧美视频 | 人人干网| 黄色小说网站在线 | 国产免费黄色 | 色综合在| 久久精品视频在线播放 | 91大神免费在线观看 | 黄色影院在线观看 | 超级碰碰免费视频 | 97超碰人 | 黄色成人小视频 | 中文字幕4 | 五月天综合激情网 | 欧美性生活小视频 | 夜夜躁日日躁狠狠躁 | 伊人久久在线观看 | 成人午夜电影在线播放 | 色94色欧美| 国产美腿白丝袜足在线av | 奇米网444 | 99精品国产一区二区 | 亚洲国产精品成人女人久久 | av线上免费观看 | 黄色免费观看网址 | 国产精品成人国产乱一区 | av免费在线播放 | 免费视频资源 | 精品一区二区精品 | 亚洲国产视频网站 | 精品福利国产 | 国产老妇av | 91精品爽啪蜜夜国产在线播放 | 国产精品一区二区三区免费视频 | 一级免费观看 | 国产精品永久免费视频 | 久久久久久综合网天天 | 夜夜夜夜夜夜操 | 国产精品网址在线观看 | 成人网在线免费视频 | 在线亚洲天堂网 | 国产97在线观看 | 成年人看片网站 | 日日操夜 | 国产a高清| 天天综合中文 | 亚洲免费视频观看 |