如何知道oracle11g中表空间名称和与表关联的数据文件名



我的sysdba中有一个用户,并在该用户中创建了一个名为"sampletable1"的表,现在我希望该sql查询选择表空间名称,即与表"sampletable 1"关联的数据库文件。

我想你读过评论。

无论如何:对于一个简单的案例;普通的";在我的模式中创建的表:

SQL> connect scott/tiger@pdb1
Connected.
SQL> create table stack_test (id number);
Table created.

您可能会运行这样一个查询:

SQL> connect sys@pdb1 as sysdba
Enter password:
Connected.
SQL> select f.file_name,
2         f.tablespace_name,
3         t.table_name
4  from dba_data_files f join dba_tables t on t.tablespace_name = f.tablespace_name
5  where t.owner = 'SCOTT'
6    and t.table_name = 'STACK_TEST';
FILE_NAME                                           TABLESPACE_NAME TABLE_NAME
--------------------------------------------------- --------------- ---------------
C:ORACLEORACLE_21XEORADATAXEXEPDB1USERS01.DBF USERS           STACK_TEST
SQL>

请记住,一个表的数据可能分布在多个文件中,或者如果它是空的,它可能与任何存储都没有关联。此外,在我的sysdba中,您所说的是什么意思还不清楚——希望您没有在SYS模式中创建或更改任何内容。无论如何,你可以尝试以下方法:

select x.segment_name, f.file_name
from   dba_extents x
join dba_data_files f on f.file_id = x.file_id 
where  x.owner = user  -- or whatever schema owns the table
and    x.segment_name = 'YOURTABLENAME';

一点历史:多年前,曾经有一种在多个磁盘驱动器之间扩展i/o的技术,通过这种技术,您可以将来自不同磁盘组的文件添加到表空间,并使用多个alter table xyz allocate extent (datafile path/to/file.dat)或一些类似的(已经有一段时间了(命令,这样表的物理数据就可以在多个存储设备之间扩展,希望是,如果多个会话同时访问该表,这将在可用硬件上分散负载。如今,数据文件往往是自动分配的,否则它们就在SAN上,而SAN本身就是一个逻辑卷,而不是一个物理文件系统,更不用说高速缓存了,这种微观管理毫无意义。

最新更新