好长时间没写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 |