標籤:
對於VARCHAR2類型,我們在記憶體使用量和效率上需要做出一個權衡。對於VARCHAR2(長度>=2000)變數,PL/SQL動態分配記憶體來存放實際值,但對於VARCHAR2(長度<2000)變數,PL/SQL會預先分配足夠的記憶體。所以,如果我們把同樣一個500位元組的值放入一個VARCHAR2(2000)和一個VARCHAR2(1999)變數中,後者會多佔用1499個位元組的記憶體。
exists : 強調的是是否返回結果集,不要求知道返回什麼, 比如:
select name from student where sex = ‘m‘ and mark exists(select 1 from grade where ...) ,只要
exists引導的子句有結果集返回,那麼exists這個條件就算成立了,大家注意返回的欄位始終為1,如果改成“select 2 from grade where ...”,那麼返回的欄位就是2,這個數字沒有意義。所以exists子句不在乎返回什麼,而是在乎是不是有結果集返回。 通過使用EXISTS,Oracle會首先檢查主查詢,然後運行子查詢直到它找到第一個匹配項,這就節省了時間。Oracle在執行IN子查詢時,首先執行子查詢,並將獲得的結果清單存放在一個加了索引的暫存資料表中。在執行子查詢之前,系統先將主查詢掛起,待子查詢執行完畢,存放在暫存資料表中以後再執行主查詢。 in是把外表和內表作hash串連,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢,一直以來認為exists比in效率高的說法是不準確的。如果查詢的兩個表大小相當,那麼用in和exists差別不大;如果兩個表中一個較小一個較大,則子查詢表大的用exists,子查詢表小的用in;
請盡量不要使用not in(它會調用子查詢),而盡量使用not exists(它會調用關聯子查詢)。如果子查詢中返回的任意一條記錄含有空值,則查詢將不返回任何記錄。如果子查詢欄位有非空限制,這時可以使用not in,並且可以通過提示讓它用hasg_aj或merge_aj串連。
如果查詢語句使用了not in,那麼對內外表都進行全表掃描,沒有用到索引;而not exists的子查詢依然能用到表上的索引。所以無論哪個表大,用not exists都比not in 要快。
ORDER BY 1 表示 所select 的欄位按第一個欄位排序 可以ORDER BY 1 desc
日常積累oracle 有關資訊