1............
當連接的表數據量很大,但是SELECT的最終結果不是很多,且SELECT列的個數不是很多的時候,加上DISTINCT之後,這個排序的代價要小於SEMI JOIN連接的代價。這就是增加一個DISTINCT操作查詢效率反而提高,這個似乎不可能發生的情況的真正原因。
不加DISTINCT的情況,由於使用IN子查詢的查詢,Oracle對第二個連接採用了HASH JOIN SEMI,這種HASH JOIN SEMI相對於普通的HASH JOIN,代價要大一些。
SQL> SELECT /*distinct*/ T1.OBJECT_NAME, T1.OBJECT_TYPE, T2.TABLESPACE_NAME
2 FROM T1, T2
3 WHERE T1.OBJECT_NAME = T2.SEGMENT_NAME
4 AND T1.OBJECT_NAME IN
5 (
6 SELECT INDEX_NAME FROM T3
7 WHERE T3.TABLESPACE_NAME = T2.TABLESPACE_NAME
8 );
2.............
-
Oracle 9i數據庫,執行下面語句出現錯誤“ORA-01791: 不是 SELECTed 表達式 ”:
select distinct name from Share_URL_Seeds order by id
原來:SELECT語句中含有DISTINCT關鍵字或者有運算符時,排序用字段必須與SELECT語句中的字段相對應。
網上搜到解釋如下:
在ORDER BY中指定多個列,結果將先按照子句中的第一列排序,然後第二個,依此類推。
在SELECT中未出現的列名也可用於ORDER BY 子句中,只要TABLE中有就行。
但如果SELECT子句中出現了DISTINCT關鍵字,則只能用出現過的列名,
而且如果SELECT子句中使用了任何運算符,在ORDER BY 子句中必須保持和SELECT子句中表達式完全一致,否則出現錯誤:“ORA-01791: 不是 SELECTed 表達式”。
如果想按照id排序,而又使name不重複,可用以下sql語句:
SELECT distinct name, min(id) as b FROM Share_URL_Seeds where Type=1 group by name order by b;