oracle 11g添加了新特性虛擬字段,而oracle 12c增加在多個表上收集統計信息。通過在12c版本提高查詢性能,開始自動收集信息時會自動創建虛擬列。
通過語句可以查詢創建那些虛擬列。
select column_name, data_default, hidden_column from user_tab_cols where table_name = 'TAB'; COLUMN_NAME DATA_DEFAULT HID ------------------------------ ----------------------------- --- SYS_STUYPW88OE302TFVBNC6$MMQXE SYS_OP_COMBINED_HASH("X","Y") YES Z NO Y NO X NO
可以通過語句刪除和創建虛擬列
exec dbms_stats.drop_extended_stats(user, 'tab', '(x, y)'); alter table tab modify (y timestamp); select dbms_stats.create_extended_stats(user, 'tab', '(x, y)') from dual; DBMS_STATS.CREATE_EXTENDED_STATS(USER,'TAB','(X,Y)') -------------------------------------------------------------------------------- SYS_STUYPW88OE302TFVBNC6$MMQXE
pl sql刪除表上虛擬列
declare --類型定義 cursor c_job is --查找統計擴展的隱藏列信息 select data_default from user_tab_cols where hidden_column='YES' and table_name = 'tab'; --定義一個游標變量v_cinfo c_emp%ROWTYPE ,該類型為游標c_emp中的一行數據類型 c_row c_job%rowtype; sUser varchar(200); begin select user into sUser from dual; for c_row in c_job loop --執行刪除操作 execute immediate 'begin dbms_stats.drop_extended_stats('''||sUser||''', ''tab'', '''||replace(replace(c_row.data_default,'SYS_OP_COMBINED_HASH',''),'"','')||'''); end;'; end loop; end;
