获取表空间是否可自动扩展的SQL

好长时间没写SQL了,今天看到同事在使用一个检查表空间是否可自动扩展的SQL,不但效率不高,而且非常的累赘,忍不住自己写了一个。
原始SQL如下:

SQL> SELECT DISTINCT tablespace_name, autoextensible
  2 FROM DBA_DATA_FILES
  3 WHERE autoextensible = 'YES'
  4 UNION
  5 SELECT DISTINCT tablespace_name, autoextensible
  6 FROM DBA_DATA_FILES
  7 WHERE autoextensible = 'NO'
  8 AND tablespace_name NOT IN
  9 (SELECT DISTINCT tablespace_name
 10 FROM DBA_DATA_FILES
 11 WHERE autoextensible = 'YES');
TABLESPACE_NAME                AUT
------------------------------ ---
SYSAUX                         NO
SYSTEM                         NO
UNDOTBS1                       YES
USERS                          NO

这个SQL的唯一优点就是思路比较清晰,通过SQL的写法可以明确的看到作者是如何根据数据文件的可扩展性来判断表空间是否可以扩展的。
当一个表空间中只要包含一个可扩展的数据文件,则这个表空间就是可扩展的,只有表空间下所有的数据文件都是不可扩展的,这个表空间才是不可扩展的。
虽然作者的思路没有问题,但是这个SQL的写法实在不敢恭维,对DBA_DATA_FILES视图查询了三次,每次都使用了DISTINCT,同时还包含了NOT IN连接以及UNION集合。
其他的先不说,UNION在这里就完全没有意义,二者包含的结果是互斥的,那么这里至少应该使用UNION ALL。
其实这个SQL根本不需要这么麻烦,因为AUTOEXTENSIBLE只有两个取值,YES或NO,那么只需要一次查询DBA_DATA_FILES就可以得到结果:

SQL> SELECT TABLESPACE_NAME, MAX(AUTOEXTENSIBLE) 
  2  FROM DBA_DATA_FILES
  3  GROUP BY TABLESPACE_NAME;
TABLESPACE_NAME                MAX
------------------------------ ---
SYSAUX                         NO
UNDOTBS1                       YES
USERS                          NO
SYSTEM                         NO
This entry was posted in ORACLE and tagged , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *