偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

數(shù)據(jù)庫性能問題總結(jié)--屢次發(fā)生的Oracle謂詞越界

數(shù)據(jù)庫 Oracle
近期在客戶現(xiàn)場屢次遇到由于統(tǒng)計(jì)信息過舊,導(dǎo)致執(zhí)行計(jì)劃選錯(cuò)引發(fā)的數(shù)據(jù)庫性能問題,今天做個(gè)總結(jié)。

 [[392208]]

本文轉(zhuǎn)載自微信公眾號(hào)「數(shù)據(jù)和云」,作者任艷杰。轉(zhuǎn)載本文請(qǐng)聯(lián)系數(shù)據(jù)和云公眾號(hào)。  

近期在客戶現(xiàn)場屢次遇到由于統(tǒng)計(jì)信息過舊,導(dǎo)致執(zhí)行計(jì)劃選錯(cuò)引發(fā)的數(shù)據(jù)庫性能問題,今天做個(gè)總結(jié)。

謂詞越界常見發(fā)生在 where 謂詞是時(shí)間字段的情況,總的來說統(tǒng)計(jì)信息記錄的是一個(gè)過舊的時(shí)間,而 SQL 傳入的時(shí)間是一個(gè)最新的時(shí)間范圍(往往是 <time time1<c<time2)由于統(tǒng)計(jì)信息不全,按照 CBO 計(jì)算出來的結(jié)果集就很小,在多表關(guān)聯(lián)的情況下,CBO 就會(huì)選擇認(rèn)為的最優(yōu)的關(guān)聯(lián)方式,而實(shí)際執(zhí)行時(shí)發(fā)現(xiàn)不是那么回事,有大量結(jié)果集需要掃描,就會(huì)爆發(fā) SQL 性能問題。

謂詞越界就是 select 的謂詞的條件不在統(tǒng)計(jì)信息 low_value 和 high_value 之間,在實(shí)際選擇結(jié)果集要大于 CBO 記錄的結(jié)果集數(shù)量,即實(shí)際的 selectivity 偏大,這種情況下 CBO 評(píng)估出來的 selectivity 會(huì)出現(xiàn)嚴(yán)重的偏差,導(dǎo)致 CBO 選錯(cuò)執(zhí)行計(jì)劃。

測試驗(yàn)證

下面做一組測試,從執(zhí)行計(jì)劃 cost 看謂詞越界的發(fā)生過程,先插入部分?jǐn)?shù)據(jù):

  1. DECLARE 
  2. INT
  3. BEGIN 
  4. i := 78179; 
  5. WHILE(i < 100000) 
  6. LOOP 
  7. i := i + 1; 
  8. INSERT INTO test_obj(object_id) VALUES(i); 
  9. COMMIT
  10. END LOOP; 
  11. END

查看此時(shí)的 num_rows:

  1. TEST@PROD1> select count(*) from test_obj; 
  2.   COUNT(*) 
  3. ---------- 
  4.      94283 
  5. TEST@PROD1> select max(object_ID),dump(max(object_id),16) from test_obj; 
  6.   
  7. MAX(OBJECT_ID) DUMP(MAX(OBJECT_ID),16) 
  8. -------------- ---------------------------------------- 
  9.         100000 Typ=2 Len=2: c3,b     
  10. TEST@PROD1> select min(object_ID),dump(min(object_id),16) from test_obj; 
  11.   
  12. MIN(OBJECT_ID   )               DUMP(MIN(OBJECT_ID),16) 
  13. ------------------------------ ---------------------------------------- 
  14.       2                          Typ=2 Len=2: c1,3        --C103 

不收集統(tǒng)計(jì)信息,此時(shí)統(tǒng)計(jì)列統(tǒng)計(jì)信息過舊,HIGH_VALUE 依然是原來的值 78179。

  1. TEST@PROD1> select  low_value ,high_value,num_distinct,num_nulls from  DBA_TAB_COL_STATISTICS where table_name='TEST_OBJ' and owner='TEST'
  2.   
  3.                                                                   Distinct     Number 
  4. LOW_VALUE                      HIGH_VALUE                           Values      Nulls 
  5. ------------------------------ ------------------------------ ------------ ---------- 
  6. C103                           C3085250                             72,462(原值)  0 

查詢結(jié)果返回 2081 行結(jié)果集。

  1. TEST@PROD1> select count(*) from test_obj where object_id between 78200 and 81000; 
  2.   COUNT(*) 
  3. ---------- 
  4.       2801 
  5. 計(jì)算公式為: 
  6. selectivity=((VAL2 - VAL1) / (HIGH_VALUE - LOW_VALUE)+2 / NUM_DISTINCT) * null_adjust 
  7. null_adjust=(NUM_ROES - NUM_NULLS) / NUM_ROES 
  8.  
  9. 計(jì)算結(jié)果為: 
  10. TEST@PROD1>  select round(((81000-78200)/(100000-2)+2/94283)*(94283-0)/94283*94283) from dual;  
  11.   
  12. ROUND(((81000-78200)/(100000-2)+2/94283)*(94283-0)/94283*94283) 
  13. --------------------------------------------------------------- 
  14.                                                            2642 

查看結(jié)果集發(fā)現(xiàn) dictionary 值為 1,這明顯是一個(gè)錯(cuò)誤的執(zhí)行計(jì)劃,由于統(tǒng)計(jì)信息過舊,已經(jīng)低于謂詞條件區(qū)間(謂詞過界)導(dǎo)致 CBO 低估了查詢成本。

  1. TEST@PROD1>  select count(*) from test_obj where object_id between 78200 and 81000; 
  2.   
  3. Execution Plan 
  4. ---------------------------------------------------------- 
  5. Plan hash value: 2217143630 
  6.   
  7. ------------------------------------------------------------------------------- 
  8. | Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     | 
  9. ------------------------------------------------------------------------------- 
  10. |   0 | SELECT STATEMENT   |          |     1 |     5 |   289   (1)| 00:00:04 | 
  11. |   1 |  SORT AGGREGATE    |          |     1 |     5 |            |          | 
  12. |*  2 |   TABLE ACCESS FULL| TEST_OBJ |     1 |     5 |   289   (1)| 00:00:04 | 
  13. ------------------------------------------------------------------------------- 
  14.   
  15. Predicate Information (identified by operation id): 
  16. --------------------------------------------------- 
  17.   
  18.    2 - filter("OBJECT_ID">=78200 AND "OBJECT_ID"<=81000) 
  19.   
  20.   
  21. Statistics 
  22. ---------------------------------------------------------- 
  23.           1  recursive calls 
  24.           0  db block gets 
  25.        1117  consistent gets 
  26.           0  physical reads 
  27.           0  redo size 
  28.         423  bytes sent via SQL*Net to client 
  29.         419  bytes received via SQL*Net from client 
  30.           2  SQL*Net roundtrips to/from client 
  31.           0  sorts (memory) 
  32.           0  sorts (disk) 
  33.           1  rows processed 

重新收集統(tǒng)計(jì)信息再次查看執(zhí)行計(jì)劃。

  1. TEST@PROD1> exec dbms_stats.gather_table_stats('test','test_obj'); 
  2. TEST@PROD1> select  low_value ,high_value,num_distinct,num_nulls from  DBA_TAB_COL_STATISTICS where table_name='TEST_OBJ' and owner='TEST'
  3.   
  4.                                               Distinct     Number 
  5. LOW_VALUE            HIGH_VALUE                 Values      Nulls 
  6. -------------------- -------------------- ------------ ---------- 
  7. C103                 C30B                       94,283          0 

此時(shí)統(tǒng)計(jì)信息 HIGH_VALUE 已經(jīng)和最初計(jì)算的值相等,Typ=2 Len=2: c3,b。再次查看執(zhí)行計(jì)劃,此時(shí) CBO 已經(jīng)能夠產(chǎn)生了正確的執(zhí)行計(jì)劃了。

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

  1. TEST@PROD1> select count(*) from test_obj where object_id between 78200 and 81000; 
  2.   
  3. Execution Plan 
  4. ---------------------------------------------------------- 
  5. Plan hash value: 2217143630 
  6.   
  7. ------------------------------------------------------------------------------- 
  8. | Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     | 
  9. ------------------------------------------------------------------------------- 
  10. |   0 | SELECT STATEMENT   |          |     1 |     5 |   314   (1)| 00:00:04 | 
  11. |   1 |  SORT AGGREGATE    |          |     1 |     5 |            |          | 
  12. |*  2 |   TABLE ACCESS FULL| TEST_OBJ |  2642 | 13210 |   314   (1)| 00:00:04 | 
  13. ------------------------------------------------------------------------------- 
  14.   
  15. Predicate Information (identified by operation id): 
  16. --------------------------------------------------- 
  17.   
  18.    2 - filter("OBJECT_ID">=78200 AND "OBJECT_ID"<=81000) 
  19.   
  20.   
  21. Statistics 
  22. ---------------------------------------------------------- 
  23.           0  recursive calls 
  24.           0  db block gets 
  25.        1117  consistent gets 
  26.           0  physical reads 
  27.           0  redo size 
  28.         423  bytes sent via SQL*Net to client 
  29.         419  bytes received via SQL*Net from client 
  30.           2  SQL*Net roundtrips to/from client 
  31.           0  sorts (memory) 
  32.           0  sorts (disk) 
  33.           1  rows processed 

謂詞越界主要發(fā)生在大表,按照 Oracle 統(tǒng)計(jì)信息收集機(jī)制,表的數(shù)據(jù)變化量達(dá)到 10% 以上才會(huì)進(jìn)行統(tǒng)計(jì)信息收集,大表不常收集統(tǒng)計(jì)信息就容易爆發(fā)謂詞越界。

預(yù)防方式

可對(duì)關(guān)鍵表實(shí)行按謂詞查詢條件分區(qū),即按天或者按月分區(qū)可規(guī)避此問題發(fā)生。

責(zé)任編輯:武曉燕 來源: 數(shù)據(jù)和云
相關(guān)推薦

2023-11-16 17:12:33

數(shù)據(jù)庫oracle

2010-05-04 17:08:24

Oracle數(shù)據(jù)庫

2010-06-17 12:59:07

Oracle

2010-04-13 10:32:40

Oracle數(shù)據(jù)庫編程

2010-04-20 10:41:49

Oracle數(shù)據(jù)庫

2011-04-12 10:09:33

Oracle數(shù)據(jù)庫關(guān)閉

2011-05-18 09:39:19

Oracle數(shù)據(jù)庫性能優(yōu)化

2011-05-20 10:30:20

ORACLE數(shù)據(jù)庫性能優(yōu)化

2009-02-01 13:33:13

Oracle數(shù)據(jù)庫配置

2010-11-15 16:13:24

Oracle數(shù)據(jù)庫性能

2010-05-07 17:39:02

Oracle數(shù)據(jù)庫性能

2010-05-10 15:50:39

Oracle數(shù)據(jù)庫性能

2011-06-14 15:11:59

ORACLE

2011-03-28 15:44:45

惠普數(shù)據(jù)庫Oracle數(shù)據(jù)庫

2010-04-07 09:31:02

Oracle數(shù)據(jù)庫

2010-12-10 10:17:21

關(guān)系型數(shù)據(jù)庫

2011-09-02 10:06:51

OracleSqlLoad常用技巧

2011-03-17 14:09:25

Oracle數(shù)據(jù)庫字符

2010-04-09 15:08:17

Oracle 數(shù)據(jù)庫性

2010-04-21 14:00:48

Oracle數(shù)據(jù)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)