We can use some rough estimates to validate things, eg
SQL> create table t as
2 select a.*
3 from all_objects a,
4 ( select 1 from dual connect by level <= 10 )
5 order by owner,object_type,object_id;
Table created.
SQL>
SQL> create index t_idx on t( owner,object_type,object_id );
Index created.
SQL> select avg_col_len
2 from user_tab_cols
3 where table_name = 'T'
4 and column_name in ('OWNER','OBJECT_TYPE','OBJECT_ID' );
AVG_COL_LEN
-----------
6
5
10
So based on that, we would expect a typical index entry to be 6+5+10 bytes plus the rowid (6 bytes in this case). Allowing pctfree=10, then roughly we'd expect
SQL> select 8192*0.9/(6+5+10+6) from dual;
8192*0.9/(6+5+10+6)
-------------------
273.066667
index entries per leaf block. Obviously we're dealing here in averages, but lets say between 260 and 300. Now we can test that by looking at the index data
SQL> select object_id
2 from user_objects
3 where object_name = 'T_IDX';
OBJECT_ID
----------
132008
SQL> select cnt, count(*)
2 from (
3 select /*+ index_ffs(t t_idx) */
4 sys_op_lbid( 132008 ,'L',t.rowid) as blk,
5 count(*) cnt
6 from t
7 group by sys_op_lbid( 132008 ,'L',t.rowid)
8 )
9 group by cnt
10 order by 2 desc;
CNT COUNT(*)
---------- ----------
231 1455
232 432
211 359
287 207
239 177
199 153
217 140
299 123
....
The bulk of the entries are in that ballpark.
Now I'll compress the index and we can look again
SQL> alter index t_idx rebuild compress advanced low;
Index altered.
SQL> select cnt, count(*)
2 from (
3 select /*+ index_ffs(t t_idx) */
4 sys_op_lbid( 132008 ,'L',t.rowid) as blk,
5 count(*) cnt
6 from t
7 group by sys_op_lbid( 132008 ,'L',t.rowid)
8 )
9 group by cnt
10 order by 2 desc;
CNT COUNT(*)
---------- ----------
527 336
525 335
526 167
515 142
530 77
520 68
550 56
551 53
554 34
556 33
...
This a reasonable validation that compression has yielded a benefit.
Hence this could be used in reverse, ie, see how many entries per leaf block you are getting, and then compare to the size of a index key + rowid.