Oracle存储的疑问

YY_MM_DD 2010-12-06 06:20:13

[code=SQL]
SQL> DROP TABLE TINY.ETEST;

Table dropped

SQL>
SQL> create table tiny.etest
2 (
3 id number,
4 name varchar2(100)
5 )
6 pctfree 15
7 pctused 40
8 initrans 2
9 maxtrans 255
10 storage
11 (
12 initial 14k
13 next 1m
14 minextents 1
15 maxextents unlimited
16 )
17 /

Table created

SQL> select
SQL> select segment_name,bytes,initial_extent from dba_segments s where s.owner = 'TINY' and s.segment_name = 'ETEST'
2 ;

SEGMENT_NAME BYTES INITIAL_EXTENT
-------------------------------------------------------------------------------- ---------- --------------
ETEST 65536 16384

SQL> ------我这里的inital 14k,为什么在我的表dba_segment表里是16348?
SQL> DROP TABLE TINY.ETEST;

Table dropped

[/code]
...全文
181 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangren 2010-12-07
  • 打赏
  • 举报
回复
使用dbms_space包很方便,网上很多关于此的讨论。
YY_MM_DD 2010-12-07
  • 打赏
  • 举报
回复
[code=SQL]
SQL> select * from tiny.ftest;

ID
----------

SQL> select * from dba_tablespaces where tablespace_name = 'TINY';

TABLESPACE_NAME BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE MIN_EXTLEN STATUS CONTENTS LOGGING FORCE_LOGGING EXTENT_MANAGEMENT ALLOCATION_TYPE PLUGGED_IN SEGMENT_SPACE_MANAGEMENT DEF_TAB_COMPRESSION RETENTION BIGFILE
------------------------------ ---------- -------------- ----------- ----------- ----------- ------------ ---------- --------- --------- --------- ------------- ----------------- --------------- ---------- ------------------------ ------------------- ----------- -------
TINY 8192 65536 65536 1 2147483645 0 65536 ONLINE PERMANENT LOGGING NO LOCAL UNIFORM NO AUTO DISABLED NOT APPLY NO

SQL> SELECT ceil(7 * 1024 / 8192) * 8192 FROM dual;

CEIL(7*1024/8192)*8192
----------------------
8192

SQL>

1.又不对了,我现在的initial是为7K,应该我分配的的blocks是MIN_EXTLEN(因为7K小于65536),但是为什么指派了17个extents呢?到底谁在起作用啊?
2.找唐大侠的解释dba_segment的initial_extents应该是ceil(7 * 1024 / 8192) * 8192,但为什么是1064960?
YY_MM_DD 2010-12-07
  • 打赏
  • 举报
回复

SQL> select * from dba_extents where segment_name = 'FTEST';

OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------ ------------------------------ ---------- ---------- ---------- ---------- ---------- ------------
TINY FTEST TABLE TINY 0 5 9 65536 8 5
TINY FTEST TABLE TINY 1 5 17 65536 8 5
TINY FTEST TABLE TINY 2 5 25 65536 8 5
TINY FTEST TABLE TINY 3 5 33 65536 8 5
TINY FTEST TABLE TINY 4 5 41 65536 8 5
TINY FTEST TABLE TINY 5 5 49 65536 8 5
TINY FTEST TABLE TINY 6 5 57 65536 8 5
TINY FTEST TABLE TINY 7 5 65 65536 8 5
TINY FTEST TABLE TINY 8 5 73 65536 8 5
TINY FTEST TABLE TINY 9 5 81 65536 8 5
TINY FTEST TABLE TINY 10 5 89 65536 8 5
TINY FTEST TABLE TINY 11 5 97 65536 8 5
TINY FTEST TABLE TINY 12 5 105 65536 8 5
TINY FTEST TABLE TINY 13 5 113 65536 8 5
TINY FTEST TABLE TINY 14 5 121 65536 8 5
TINY FTEST TABLE TINY 15 5 129 65536 8 5
TINY FTEST TABLE TINY 16 5 137 65536 8 5

17 rows selected
YY_MM_DD 2010-12-07
  • 打赏
  • 举报
回复

SQL> create tablespace tiny datafile 'E:\oracle\product\10.2.0\oradata\myorcl\tiny01.dbf' size 10M
2 extent management local uniform size 64k;

Tablespace created

SQL> create table ftest(id number)
> tablespace tiny
> pctfree 10
> pctused 40
> initrans 2
> maxtrans 255
> storage(
> initial 7k
> next 1m
> minextents 2
> maxextents 255);

Table created

SQL> select * from dba_segments where segment_name='FTEST';

OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME HEADER_FILE HEADER_BLOCK BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE FREELISTS FREELIST_GROUPS RELATIVE_FNO BUFFER_POOL
-------------------------------------------------------------------------------- ------------------------------ ------------------ ------------------------------ ----------- ------------ ---------- ---------- ---------- -------------- ----------- ----------- ----------- ------------ ---------- --------------- ------------ -----------
TINY FTEST TABLE TINY 5 11 1114112 136 17 1064960 65536 1 2147483645 0 5 DEFAULT

心中的彩虹 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 minitoy 的回复:]
http://lj2007331.blog.51cto.com/979238/294679这篇文章可能对你有所帮助
[/Quote]

这个很全
gelyon 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 minitoy 的回复:]
http://lj2007331.blog.51cto.com/979238/294679这篇文章可能对你有所帮助
[/Quote]
嗯,不错,学习下
minitoy 2010-12-07
  • 打赏
  • 举报
回复
http://lj2007331.blog.51cto.com/979238/294679这篇文章可能对你有所帮助
YY_MM_DD 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tangren 的回复:]
引用 7 楼 yy_mm_dd 的回复:

引用 4 楼 tangren 的回复:
1、ORACLE总是分配块大小整数倍的空间。

SQL code
SQL> SELECT ceil(14 * 1024 / 8192) * 8192 FROM dual;

CEIL(14*1024/8192)*8192
-----------------------
16384

SQL>……
[/Quote]
明天我再试下,
我还有个疑问,我有办法查出在HWM下面的block块的使用情况不?
tangren 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yy_mm_dd 的回复:]

引用 4 楼 tangren 的回复:
1、ORACLE总是分配块大小整数倍的空间。

SQL code
SQL> SELECT ceil(14 * 1024 / 8192) * 8192 FROM dual;

CEIL(14*1024/8192)*8192
-----------------------
16384

SQL> SELECT ceil(65 * 1024 ……
[/Quote]
应该是,创建表空间不指定默认本地管理表空间都是这样的。
你可以创建一个表空间,指定UNIFORM SIZE 试试。
YY_MM_DD 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tangren 的回复:]
1、ORACLE总是分配块大小整数倍的空间。

SQL code
SQL> SELECT ceil(14 * 1024 / 8192) * 8192 FROM dual;

CEIL(14*1024/8192)*8192
-----------------------
16384

SQL> SELECT ceil(65 * 1024 / 81……
[/Quote]
Good!
那你说我现在的表空间是自动分配的吗?而且没有定义uniform size 所以我现在的extent的分配才出现了8blocks和128block吗?
YY_MM_DD 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 java3344520 的回复:]
我记得ORACLE的块是按照操作系统的8K的整数倍来进行分配的,有个标准块和非标准块的区别,我查查
[/Quote]
1。被分配的区大小是大于等于你定义的inital,取得minnum_extent的整数倍,但是我疑问的
为什么在dba_segment里initial_extent不是我定义的initial呢?他是咋来的呢?
2.为什么前面的extent都是分配的8 blocks,为什么最后两个分配了128个block呢?
iihero_ 2010-12-06
  • 打赏
  • 举报
回复
SQL> show parameter db_block_size;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
跟db_block_size的缺省值有关系。

initial_extent必须是它的整数倍。
tangren 2010-12-06
  • 打赏
  • 举报
回复
1、ORACLE总是分配块大小整数倍的空间。
SQL> SELECT ceil(14 * 1024 / 8192) * 8192 FROM dual;

CEIL(14*1024/8192)*8192
-----------------------
16384

SQL> SELECT ceil(65 * 1024 / 8192) * 8192 FROM dual;

CEIL(65*1024/8192)*8192
-----------------------
73728

SQL>


2、你如果使用10g,将都是使用本地管理的表空间,此时存储参数中的next短语将被忽略。
而使用表空间的存储参数,如果不手动指定,extent将使用AUTOALLOCATE,由oracle自动分配。
相当于指定EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
当然,你可以指定EXTENT MANAGEMENT LOCAL UNIFORM SIZE xxxK;则每次分配相同
大小的EXTENT;
iqlife 2010-12-06
  • 打赏
  • 举报
回复
我记得ORACLE的块是按照操作系统的8K的整数倍来进行分配的,有个标准块和非标准块的区别,我查查
YY_MM_DD 2010-12-06
  • 打赏
  • 举报
回复
日了。。。怎么没人呢?
YY_MM_DD 2010-12-06
  • 打赏
  • 举报
回复

SQL>
SQL> create table tiny.etest
2 (
3 id number,
4 name varchar2(100)
5 )
6 pctfree 15
7 pctused 40
8 initrans 2
9 maxtrans 255
10 storage
11 (
12 initial 65k
13 next 1m
14 minextents 1
15 maxextents unlimited
16 )
17 /

Table created


SQL> select segment_name,bytes,initial_extent from dba_segments s where s.owner = 'TINY' and s.segment_name = 'ETEST';

SEGMENT_NAME BYTES INITIAL_EXTENT
-------------------------------------------------------------------------------- ---------- --------------
ETEST 131072 73728

SQL> -------我把initial 改为了65k,dba_segment表里是变成了73728?这是个什么关系呢?到底dba_segment的initial_extent是取的什么值?
SQL> select segment_name,bytes,blocks from dba_extents where segment_name = 'ETEST';

SEGMENT_NAME BYTES BLOCKS
-------------------------------------------------------------------------------- ---------- ----------
ETEST 65536 8
ETEST 65536 8

SQL> ------这里是申请了2个extent,这个每次申请的大小应该是一样的,为什么不是我建表的next 1M呢,而是65536,而且增大的extent每次都可能不一样

SQL> truncate table tiny.etest;

Table truncated

SQL> insert into tiny.etest select rownum,rownum||'test' from dual connect by rownum<=100000;

100000 rows inserted

SQL> commit;

Commit complete

SQL> select segment_name,bytes,blocks from dba_extents where segment_name = 'ETEST';

SEGMENT_NAME BYTES BLOCKS
-------------------------------------------------------------------------------- ---------- ----------
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 65536 8
ETEST 1048576 128
ETEST 1048576 128

18 rows selected

SQL> --------为什么我的最后两条记录的extent的大小和前面的不一样,有哪个高手给我解答下呢?

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧