我的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本身就是一个逻辑卷,而不是一个物理文件系统,更不用说高速缓存了,这种微观管理毫无意义。