真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Oracle11.1自適應(yīng)游標(biāo)

發(fā)生自適應(yīng)條件:

成都創(chuàng)新互聯(lián)自2013年起,先為深澤等服務(wù)建站,深澤等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為深澤企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

(1)表數(shù)據(jù)傾斜,可能由于綁定變量不同值導(dǎo)致不同執(zhí)行計劃。

(2)表有統(tǒng)計信息,沒有統(tǒng)計信息不會發(fā)生自適應(yīng)。

(3)綁定變量窺視(_optim_peek_user_binds),即在SQL第一次硬解析時,綁定變量窺視,

將V$SQL中IS_BIND_SENSITIVE標(biāo)記為Y,下次執(zhí)行時,如果生成了不同的執(zhí)行計劃,會將V$SQL中IS_BIND_AWARE標(biāo)記為Y同時會將之前執(zhí)行計劃IS_BIND_SHAREABLE標(biāo)記為N,會在shared pool老化時第一批老化cursor,會根據(jù)綁定變量不同傳入值選擇不同的執(zhí)行計劃,

或者生成不同的執(zhí)行計劃,造成SQL多Version Count。

(4)列上有直方圖時。

下面為官方原文對自適應(yīng)游標(biāo)概念說明:

A bind-sensitive cursor is a cursor whose optimal plan may depend on the value of a bind variable.

The database monitors the behavior of a bind-sensitive cursor that uses different bind values to determine whether a different plan is beneficial.

The criteria used by the optimizer to decide whether a cursor is bind-sensitive include the following:

(1)The optimizer has peeked at the bind values to generate selectivity estimates.

(2)A histogram exists on the column containing the bind value.

BIND-AWARE

A bind-aware cursor is a bind-sensitive cursor eligible to use different plans for different bind values. 

After a cursor has been made bind-aware, the optimizer chooses plans for future executions based on the bind value and its selectivity estimate.

(1)When a statement with a bind-sensitive cursor executes, the database decides whether to mark the cursor bind-aware. 

(2)The decision depends on whether the cursor produces significantly different data access patterns for different bind values. 

If the database marks the cursor bind-aware, then the next time that the cursor executes the database does the following:

(1)Generates a new plan based on the new bind value.

(2)Marks the original cursor generated for the statement as not shareable (V$SQL.IS_SHAREABLE is N).

     This cursor is no longer usable and will be among the first to be aged out of the shared SQL area.

Adaptive Cursor Sharing (Bind Sensitivity)

The first step towards ACS is recognising a query as "Bind Sensitive". 

This means that the best plan for a query has potential to be different according to the bind variables supplied to it. 

In effect this just means the cursor is being monitored to see if it should be made bind aware.

A cursor is marked as Bind Sensitive if:

(1)query is executed with bind peeking

(2)binds using any of the following relational operators = < > <= >= != or a user defined bind operator e.g. contains(e.job,:job,1)>0,

From 11.2.0.2 the "LIKE" operator is also supported.

(3)A histogram exists on the column containing the bind value.

(4)In other words, a cursor is marked Bind Sensitive if a change in the bind variable value may lead to a different plan.

Adaptive Cursor Sharing will be disabled Situation

Apart from checking for a valid operator there are also a number of subsequent bind sensitivity checks that need to be performed before it can be marked as bind sensitive. 

If any of these checks fail, the cursor will not be marked as bind sensitive and adaptive cursor sharing will not occur and Adaptive Cursor Sharing will be disabled :-

(1)Extended cursor sharing has been disabled

(2)The query has no binds

(3)Parallel query is used

(4)Certain parameters like ("_optim_peek_user_binds"=false) are set

(5)You are using a /*+ NO_BIND_AWARE */ hint

(6)Outlines are being used

(7)Query is recursive

(8)The number of binds in a given sql statement is greater than 14.  ** Could be less depending on version and setting of fix_control for Bug 10182051.  See Document : 1983132.1

Monitoring View

V$SQL can be used to see whether a cursor is_bind_sensitive, is_bind_aware, or is_shareable.

Bind context information can be viewed via V$SQL_CS_SELECTIVITY, V$SQL_CS_STATISTICS and V$SQL_CS_HISTOGRAM

V$SQL_CS_SELECTIVITY displays  the valid selectivity ranges for a child cursor in extended cursor sharing mode.

A valid range consists of a low and high value for each predicate containing binds. 

Each predicate's selectivity (with the current bind value) must fall between the corresponding low and high values in order for the child cursor to be shared.

V$SQL_CS_STATISTICS contains the raw execution statistics used by the monitoring component of adaptive cursor sharing.

A sample of the executions is monitored. This view shows which executions were sampled, and what the statistics were for those executions. 

The statistics are cumulative for each distinct set of bind values.

V$SQL_CS_HISTOGRAM summarizes the monitoring information stored by adaptive cursor sharing.

This information is used to decide whether to enable extended cursor sharing for a query. 

It  is stored in a histogram, whose bucket's contents are exposed by this view.

測試

相關(guān)參數(shù):

_optimizer_adaptive_cursor_sharing

_optimizer_extended_cursor_sharing

_optim_peek_user_binds

NAME                                     VALUE           ISDEFAULT DESCRIBE                                           ISMOD      ISADJ
---------------------------------------- --------------- --------- -------------------------------------------------- ---------- -----
_optim_peek_user_binds                   TRUE            TRUE      enable peeking of user binds                       FALSE      FALSE
_optimizer_extended_cursor_sharing       UDO             TRUE      optimizer extended cursor sharing                  FALSE      FALSE
_optimizer_adaptive_cursor_sharing       TRUE            TRUE      optimizer adaptive cursor sharing                  FALSE      FALSE

測試開始:

(1)創(chuàng)建表

LIBAI@honor1 > create table test_bind(id number,name varchar2(10));
Table created.

(2)插入傾斜數(shù)據(jù)

declare
i number;
begin
for i in 1..100000
loop
insert into test_bind values(i,'haha');
end loop;
commit;
end;
/
declare
i number;
begin
for i in 100001..100010
loop
insert into test_bind values(i,'test');
end loop;
commit;
end;
/

(3)創(chuàng)建索引

LIBAI@honor1 > select count(*) from test_bind;
                                COUNT(*)
----------------------------------------
                                  100010
                                  
LIBAI@honor1 > create index idx_test_bind on test_bind(name);
Index created.

(4)未收集統(tǒng)計信息時查看執(zhí)行計劃選擇

LIBAI@honor1 > set autotrace on
LIBAI@honor1 > var v_name varchar2(20);
LIBAI@honor1 > exec :v_name:='haha';
LIBAI@honor1 > select * from test_bind where name=:v_name;
Execution Plan
----------------------------------------------------------
Plan hash value: 2889536435
---------------------------------------------------------------------------------------------
| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |               |   982 | 19640 |    67   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST_BIND     |   982 | 19640 |    67   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_TEST_BIND |   393 |       |   112   (0)| 00:00:02 |
---------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("NAME"=:V_NAME)
Note
-----
   - dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
         13  recursive calls
          0  db block gets
       6957  consistent gets
          0  physical reads
          0  redo size
    2209404  bytes sent via SQL*Net to client
      73845  bytes received via SQL*Net from client
       6668  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
     100000  rows processed

     

(5)發(fā)現(xiàn)并沒有因為查詢數(shù)據(jù)有傾斜發(fā)生自適應(yīng),

因為此時Oracle并不知道數(shù)據(jù)有傾斜,CBO會根據(jù)實際表數(shù)據(jù)評估執(zhí)行計劃,選擇最優(yōu)執(zhí)行計劃

     

LIBAI@honor1 > SELECT sql_id,
                               sql_text,
                               IS_BIND_SENSITIVE,
                               IS_BIND_AWARE,
                               IS_SHAREABLE,
                               child_number 
                          FROM v$sql
                            WHERE sql_text LIKE '%select * from test_bind where name=:v_name%';
     
     SQL_ID        SQL_TEXT                                                     I I I                             CHILD_NUMBER
------------- ------------------------------------------------------------ - - - ----------------------------------------
868x3yt87vqhy select * from test_bind where name=:v_name                   N N Y                                        0
                                  0

(6)收集統(tǒng)計

LIBAI@honor1 > exec dbms_stats.gather_table_stats('LIBAI','TEST_BIND');

(7)flush shared pool

SYS@honor1 > alter system flush shared_pool;

(8)第一次執(zhí)行,硬解析,可以看到由于統(tǒng)計信息作用,Oracle知道選擇列上有數(shù)據(jù)傾斜,將IS_BIND_SENSITIVE標(biāo)記為

Y,發(fā)生了自適應(yīng),以便根據(jù)將來綁定變量傳入值,選擇合適或者解析新的執(zhí)行計劃。

LIBAI@honor1 > exec :v_name:='haha';
LIBAI@honor1 > select * from test_bind where name=:v_name;
LIBAI@honor1 > SELECT sql_id,
                               sql_text,
                               IS_BIND_SENSITIVE,
                               IS_BIND_AWARE,
                               IS_SHAREABLE,
                               child_number 
                          FROM v$sql
                            WHERE sql_text LIKE '%select * from test_bind where name=:v_name%';
     
     SQL_ID        SQL_TEXT                                                     I I I                             CHILD_NUMBER
------------- ------------------------------------------------------------ - - - ----------------------------------------
868x3yt87vqhy select * from test_bind where name=:v_name                   Y N Y                                        0

(9)當(dāng)傳入新值時,由于IS_BIND_SENSITIVE作用,Oracle選擇了新的執(zhí)行計劃,并標(biāo)記IS_BIND_AWARE為Y

LIBAI@honor1 > exec :v_name:='test';
LIBAI@honor1 > select * from test_bind where name=:v_name;
LIBAI@honor1 > SELECT sql_id,
                               sql_text,
                               IS_BIND_SENSITIVE,
                               IS_BIND_AWARE,
                               IS_SHAREABLE,
                               child_number 
                          FROM v$sql
                            WHERE sql_text LIKE '%select * from test_bind where name=:v_name%';
     
     SQL_ID        SQL_TEXT                                                     I I I                             CHILD_NUMBER
------------- ------------------------------------------------------------ - - - ----------------------------------------
868x3yt87vqhy select * from test_bind where name=:v_name                   Y Y Y                                        0

當(dāng)前題目:Oracle11.1自適應(yīng)游標(biāo)
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/pjsgii.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部