我有以下設定,其中包括磁區。是否有我可以使用的查詢將為表中的每個 PARTITION 提供計數..
我不喜歡通過收集統計資料而不是實際計數(*)來進行可能的估計。注意磁區名稱可以重命名!!
下面是我的測驗用例。感謝所有回答的人。
ALTER SESSION SET NLS_DATE_FORMAT = 'MMDDYYYY HH24:MI:SS';
CREATE TABLE dts (
dt DATE
)
PARTITION BY RANGE (dt)
INTERVAL (NUMTODSINTERVAL(7,'DAY'))
(
PARTITION OLD_DATA values LESS THAN (TO_DATE('2022-01-01','YYYY-MM-DD'))
);
INSERT into dts(dt)
select to_date (
'01-08-2022','mm-dd-yyyy' )
( level / 24 ) dt
from dual
connect by level <= ( 24 ( 24 *
(to_date('01-15-2022' ,'mm-dd-yyyy') - to_date('01-08-2022','mm-dd-yyyy') )
)
) ;
SELECT table_name,
partition_name,
num_rows
FROM user_tab_partitions
WHERE table_name not like 'BIN$%'
ORDER BY table_name, partition_name;
TABLE_NAME PARTITION_NAME NUM_ROWS
DTS OLD_DATA -
DTS SYS_P415755 -
DTS SYS_P415756 -
uj5u.com熱心網友回復:
試試這個:
declare
c integer;
begin
for aPart in (select partition_name FROM user_tab_partitions where table_name = 'DTS') loop
execute immediate 'select count(*) from DTS PARTITION ('||aPart.partition_name||')' INTO c;
DBMS_OUTPUT.PUT_LINE(aPart.partition_name || ' ' || c || ' rows');
end loop;
end;
uj5u.com熱心網友回復:
select table_name ,Partition_name, to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select /* parallel(a,8) */
count(*) c from '||table_name||' partition ('||partition_name||') a ')),'/ROWSET/ROW/C')) as count
from user_tab_partitions
TABLE_NAME PARTITION_NAME COUNT
DTS OLD_DATA 0
DTS SYS_P415799 167
DTS SYS_P415800 25
uj5u.com熱心網友回復:
Oracle提供了一個方便的功能PMARKER 確切為此,
SELECT DBMS_MVIEW.PMARKER(p.rowid) PMARKER, count(*) cnt, min(dt), max(dt)
from dts p
group by DBMS_MVIEW.PMARKER(p.rowid)
order by 1;
PMARKER CNT MIN(DT) MAX(DT)
---------- ---------- ------------------- -------------------
74312 167 08.01.2022 01:00:00 14.01.2022 23:00:00
74313 25 15.01.2022 00:00:00 16.01.2022 00:00:00
請注意,您不需要知道磁區名稱,磁區鍵列值允許您使用磁區擴展名稱訪問磁區:
第一個磁區的示例
select count(*) from dts partition for (DATE'2022-01-08');
COUNT(*)
----------
167
uj5u.com熱心網友回復:
只要您使用默認的樣本大小和演算法,您就可以依靠優化器統計資訊來獲得完美的計數。
begin
dbms_stats.gather_table_stats
(
ownname => user,
tabname => 'DTS',
estimate_percent => dbms_stats.auto_sample_size
);
end;
/
如果您運行上述 PL/SQL 塊,您的原始查詢USER_TAB_PARTITIONS將回傳正確的NUM_ROWS. 從 11g 版本開始,Oracle 掃描整個表以計算統計資訊。雖然它使用近似值來計算諸如非獨特值和直方圖之類的東西,但該演算法獲得完全準確的行數是微不足道的。
手冊對這種行為不是很清楚,但是您可以從手冊和其他討論新演算法如何作業的文章中將其放在一起。來自“SQL Tuning Guide”的“Gathering Optmizer Statistics”一章:
為了在獲得必要的統計準確性的同時最大限度地提高性能,Oracle 建議 ESTIMATE_PERCENT 引數使用默認設定 DBMS_STATS.AUTO_SAMPLE_SIZE。在這種情況下,Oracle 資料庫會自動選擇樣本大小。此設定允許使用以下內容:
一種比采樣快得多的基于哈希的演算法
該演算法讀取所有行并生成幾乎與 100% 樣本的統計資料一樣準確的統計資料。使用這種技術計算的統計資料是確定性的。
最有可能的是,您甚至不需要指定ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE引數。某人極不可能為表或系統設定該偏好。您可以使用以下查詢來查看您的統計資訊通常是如何收集的。查詢很可能會回傳“DBMS_STATS.AUTO_SAMPLE_SIZE”:
select dbms_stats.get_prefs(pname => 'ESTIMATE_PERCENT', ownname => user, tabname => 'DTS')
from dual;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/408192.html
標籤:
下一篇:使用REGEX提取維度
