列長度多於32個字元 NUM_DISTINCT值錯誤
字元長度多於32位,造成NUM_DISTINCT 值錯誤。
這裡給出的建議是 把 直接圖刪掉, 這樣,可以暫時的解決 num_distinct 個數的問題,使個數是正確的。
但是如果這個列,再次被當做where條件使用,並且資料變化達到重新收集的標準時,
就會重新收集統計資訊而
SQL> select dbms_stats.get_param('METHOD_OPT') from dual;
DBMS_STATS.GET_PARAM('METHOD_OPT')
--------------------------------------------------------------------------------
FOR ALL COLUMNS SIZE AUTO
這個預設的是值 是 auto,
會- AUTO : Oracle determines the columns to collect histograms based on data distribution and the workload of the columns.
根據資料的分佈和 列是否使用過 重新收集,如果 重新收集了,那麼原來刪除的直方圖又被重新收集回來了。
還是沒有根本的解決問題。 通過鎖定表的統計資訊可以。
具體過程:
SQL> show user;
USER is "SONG"
SQL> create table mytest (col1 number, col2 varchar2(255));
Table created.
SQL> begin
2 for i in 1..1000
3 loop
4 insert into mytest values (i, 'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC' || to_char(i) );
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> commit;
Commit complete.
SQL> create unique index mytest_uix on mytest(col1, col2);
Index created.
SQL> exec dbms_stats.gather_table_stats('SONG','MYTEST', method_opt=> 'for all indexed columns size 10');
PL/SQL procedure successfully completed.
SQL> select column_name, num_distinct from user_tab_col_statistics where table_name = 'MYTEST';
COLUMN_NAME NUM_DISTINCT
------------------------------------------------------------ ------------
COL1 1000
COL2 1 --只有一個不同值,意思就是值全是一樣的
SQL> set line 200
SQL> col column_name format a30
SQL> select column_name, endpoint_number, endpoint_value from user_histograms where table_name='MYTEST';
COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ --------------- --------------
COL1 0 1
COL1 1 101
COL1 2 201
COL1 3 301
COL1 4 401
COL1 5 501
COL1 6 601
COL1 7 701
COL1 8 801
COL1 9 901
COL1 10 1000
COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ --------------- --------------
COL2 1000 3.4925E+35
12 rows selected.
SQL> exec dbms_stats.gather_table_stats('SONG','MYTEST', method_opt=> 'FOR ALL COLUMNS SIZE 1'); --刪除直方圖
PL/SQL procedure successfully completed.
SQL> select column_name, num_distinct from user_tab_col_statistics where table_name = 'MYTEST';
COLUMN_NAME NUM_DISTINCT
------------------------------ ------------
COL1 1000
COL2 1000 --值是正確的,MOS給出的是 刪掉直方圖
SQL> select column_name, endpoint_number, endpoint_value from user_histograms where table_name='MYTEST';
COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ --------------- --------------
COL1 0 1
COL2 0 3.4925E+35
COL1 1 1000
COL2 1 3.4925E+35
SQL> select * from mytest where col2='CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC1'; --做為謂語條件 查詢一次
COL1
----------
COL2
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC1
SQL> begin
2 for i in 1..1000
3 loop
4 insert into mytest values (i, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' || to_char(i) );
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> commit; --改變數增加,使自動收集統計資訊時,會自動收集
Commit complete.
SQL> exec DBMS_STATS.GATHER_DATABASE_STATS ();
PL/SQL procedure successfully completed.
SQL> select column_name, num_distinct from user_tab_col_statistics where table_name = 'MYTEST';
COLUMN_NAME NUM_DISTINCT
------------------------------ ------------
COL1 1000
COL2 2 --只有兩個不同值,這是錯誤的
SQL> select column_name, endpoint_number, endpoint_value from user_histograms where table_name='MYTEST';
COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ --------------- --------------
COL2 2000 3.4925E+35
COL2 1000 3.3882E+35
COL1 0 1
COL1 1 1000
SQL> EXEC DBMS_STATS.SET_COLUMN_STATS ('SONG','MYTEST','COL2',distcnt=>2000,force =>TRUE); -- 設一個值還是不行
PL/SQL procedure successfully completed.
SQL> select column_name, num_distinct from user_tab_col_statistics where table_name = 'MYTEST';
COLUMN_NAME NUM_DISTINCT
------------------------------ ------------
COL1 1000
COL2 2000
SQL> select * from mytest where col2='CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC1';
COL1
----------
COL2
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC1
SQL> begin
2 for i in 1..1000
3 loop
4 insert into mytest values (i, 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB' || to_char(i) );
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> commit;
Commit complete.
SQL> exec DBMS_STATS.GATHER_DATABASE_STATS (); --再次插入之後,又收集
PL/SQL procedure successfully completed.
SQL> select column_name, num_distinct from user_tab_col_statistics where table_name = 'MYTEST';
COLUMN_NAME NUM_DISTINCT
------------------------------ ------------
COL1 1000
COL2 3 --統計資訊不是真正的
SQL>
SQL> EXEC DBMS_STATS.SET_COLUMN_STATS ('SONG','MYTEST','COL2',distcnt=>2000,force =>TRUE);
PL/SQL procedure successfully completed.
SQL> exec DBMS_STATS.LOCK_TABLE_STATS ('SONG','MYTEST'); --鎖定表的統計資訊
PL/SQL procedure successfully completed.
SQL> delete from mytest where col2 like 'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC%';
1000 rows deleted.
SQL> commit;
Commit complete.
SQL> exec DBMS_STATS.GATHER_DATABASE_STATS ();select * from mytest where col2 like 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB1'
SQL> select * from mytest where col2 like 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB1';
COL1
----------
COL2
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB1
SQL> exec DBMS_STATS.GATHER_DATABASE_STATS ();
PL/SQL procedure successfully completed.
SQL> select column_name, num_distinct from user_tab_col_statistics where table_name = 'MYTEST';
COLUMN_NAME NUM_DISTINCT
------------------------------ ------------
COL1 1000
COL2 2000 --鎖定表的成功
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25099483/viewspace-775456/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 字元陣列的長度字元陣列
- ORACLE字元列長度語義Oracle字元
- C語言中strlen求字串長度,求字元陣列長度(空字元,數字0,字元0,陣列部分初始化)C語言字串字元陣列
- C語言求其字元陣列的長度C語言字元陣列
- 得到字串 位元組 長度 中文 兩個字元 英文一個字元字串字元
- 獲取C/C++字串、字元陣列長度C++字串字元陣列
- 型別長度大於最大值型別
- Mysql資料庫表關於幾個int型別的字元長度MySql資料庫型別字元
- C++中的字元陣列逐個賦值時報錯的解決方法C++字元陣列賦值
- 32:行程長度編碼行程
- JS判斷字串長度(英文佔1個字元,中文漢字佔2個字元)JS字串字元
- mysql 索引長度 767 錯誤 ERROR 1071MySql索引Error
- Jquery Validate自定義驗證規則,一個漢字等於兩個字元長度jQuery字元
- 解決遷移資料庫錯誤,索引長度過長資料庫索引
- 為什麼資料庫列的字元長度為191? - Grouparoo資料庫字元
- js 判斷 字元的長度255JS字元
- ZT:字元長度與共享問題字元
- 關於Mapreduce Text型別賦值的錯誤型別賦值
- c語言的strlen函式計算字元陣列長度不對C語言函式字元陣列
- js查詢包含字元最多的單詞的字元長度JS字元
- JavaScript Replace 多個字元JavaScript字元
- 求給定字串的平均字元長度字串字元
- 第七章——字串(不定長度字元)字串字元
- C++陣列長度C++陣列
- oracle 資料庫對於多列求最大值Oracle資料庫
- C語言中如何求一個陣列的長度C語言陣列
- java 之 給定固定長度根據字元長分割文件Java字元
- PHP 多維陣列排序-按某個 key 的值PHP陣列排序
- JavaScript 擷取字串右邊指定長度字元JavaScript字串字元
- go 語言中的 rune,獲取字元長度Go字元
- 同一個SQL引發多個ORA-7445錯誤SQL
- 往資料型別為clob的表列直接insert或update長度大於4000會報字串太長錯誤資料型別字串
- 程式碼縮寫和長度值
- VS錯誤程式碼列
- C語言應用於LR中-如何得到陣列長度C語言陣列
- GO語言————5.2 測試多返回值函式的錯誤Go函式
- System.AggregateException: 發生一個或多個錯誤.....Exception
- JS獲取瀏覽器位址列的多個引數值的任意值JS瀏覽器