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;