獲取表空間是否可自動擴充套件的SQL

yangtingkun發表於2012-02-21

好長時間沒寫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只有兩個取值,YESNO,那麼只需要一次查詢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

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-716968/,如需轉載,請註明出處,否則將追究法律責任。

相關文章