如何确定 table 的空 Logical_data_block
How to determine the empty Logical_data_block for a table
假设我的 table 有 1 个片段,其中有 1 个范围。
如果查询
SELECT BLOCKS
FROM DBA_EXTENTS
WHERE owner LIKE 'owner'
AND segment_name LIKE 'segmentname';
您可以取回一个范围正在存储的逻辑块的数量。
如何从这个(例如)8块中判断哪一个是实际使用的,哪一个是空的?
所以如果有人需要这个,你可以通过
获得空逻辑块的数量
- 对非空块求和
SELECT COUNT(*) FROM( SELECT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) FROM yourtable GROUP BY DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID))
- 获取所有块的数量
SELECT SUM(BLOCKS) FROM dba_segments WHERE owner LIKE ownerofyourtable AND segment_name LIKE nameofyourtable'
- 然后你只需要减去 2。我在 pl/sql 中做了,但我认为从这一点来看它应该很容易。
注意第二点中的大写和小写。
假设我的 table 有 1 个片段,其中有 1 个范围。
如果查询
SELECT BLOCKS
FROM DBA_EXTENTS
WHERE owner LIKE 'owner'
AND segment_name LIKE 'segmentname';
您可以取回一个范围正在存储的逻辑块的数量。
如何从这个(例如)8块中判断哪一个是实际使用的,哪一个是空的?
所以如果有人需要这个,你可以通过
获得空逻辑块的数量- 对非空块求和
SELECT COUNT(*) FROM( SELECT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) FROM yourtable GROUP BY DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID))
- 获取所有块的数量
SELECT SUM(BLOCKS) FROM dba_segments WHERE owner LIKE ownerofyourtable AND segment_name LIKE nameofyourtable'
- 然后你只需要减去 2。我在 pl/sql 中做了,但我认为从这一点来看它应该很容易。
注意第二点中的大写和小写。