聽了一堂SQL課,受益良多,做下筆記。 SQL語句的執行計劃 慚愧啊,這個名詞我今天還是第一次接觸,這大概已經是常識了吧呵呵。 沒有太深的研究,暫時想是這樣的,每一種數據庫服務器在執行一條SQL語句的時候,首先都要解析這條SQL語句,每種數據庫服務器的解析方式是不一樣的,這樣,制定出來的執行計劃也就是不一樣的。服務器通常都會在執行前通過某種算法(優化器)計算出很多種執行計劃,然后選擇其中它認為是最優的一種進行執行。 學會查看SQL語句的執行計劃,有助于清晰的理解SQL語句的執行過程,特別是對SQL語句進行優化的時候,會有很大的幫助。 外連接
理解多行子查詢:a.f1會和子查詢結果中的每一個數據進行一次匹配循環,所以,這里值得注意的是: 1. IN和EXISTS的執行計劃正好相反。用IN時,子查詢為內層循環,用EXISTS時,子查詢為外層循環。 2. 用IN時,子查詢的返回條數不要太多,一般幾十個已經夠多了,如果過百的話.....呵呵..... Top-N查詢
這里有個值得注意的地方就是,一定要先排序,再取Top-N。兩個不要寫在一起。 PS: SQL服務器從來都不保證解析出來的數據是有次序的,雖然我們不寫ORDER BY查詢時,每次查詢結果的次序幾乎都是一樣的,但是,不能被表象所迷惑,這是不穩定的次序。 游標 以前理解游標只是一種變量類型,如果把它看成是一種語句執行方式的話,那么任何的SQL語句都是用游標的形式執行的。 游標變量 1. Strong 類型,即強類型。也許是我接觸的比較少,還沒發現有什么用,該類型游標變量必須指定游標的類型,對游標的使用進行了限制。 2. Weak類型,即弱類型。經常用,使用起來比較靈活,可以存儲任意的返回類型。既然靈活,我想,也許會多少占用一些內存吧,還沒深入研究。 異常 預先知道的一些異常,最好不要寫在最后的異常捕獲里。 比如,SELECT a INTO b FROM c. 如果a為null的話,會報no data found異常。象這樣的,我們往往接受為null的情況,不想用異常來捕獲,可以用兩種方法來處理: 1. 使用游標 FETCH ... INTO...的時候,即使為空,也不會出異常,會繼續執行下面的語句。 2. 使用PL/SQL塊 BEGIN ... EXCEPTION // 進行局部異常處理 END;
歡迎來訪!^.^! 本BLOG僅用于個人學習交流! 目的在于記錄個人成長. 所有文字均屬于個人理解. 如有錯誤,望多多指教!不勝感激!
Copyright © 久城