怎樣編寫效能比較高的sql查詢語句呢?兩個方法:建立合理的索引。書寫高效的sql語句
索引分為聚集索引和非聚集索引。
乙個表僅僅能建立乙個聚集索引和n個非聚集索引,這句話的由來主要是因為索引的原理決定的。
資料庫中的一張表不論你建立不建立索引,或者,不論你建立那種型別的索引。其在硬碟上的儲存是一樣的,那麼,建立索引和不建立索引,或者,建立聚集索引和非聚集索引的差別在什麼地方呢?
其差別是表內資料在記憶體的存在形式。
對於沒有建立索引的表,其載入到記憶體裡時。就僅僅有資料塊。對於有聚集索引的表,其載入到記憶體時,會形成一棵樹,且葉子節點上就是詳細的資料。對於非聚集索引的表(沒有聚集索引時)。其載入記憶體時,真實資料為乙個獨立的塊,其索引會形成乙個索引樹。索引資料的葉子節點相應的是真實資料塊的rowid。對於既有非聚集索引,又有聚集索引的表,其載入到記憶體時,會形成兩棵樹。詳細的資料和聚集索引樹在一起。非聚集索引獨自有一棵樹。此時須要注意,其葉子節點中存放的時聚集索引的index,然後,通過聚集索引的index再去,聚集索引樹中找到詳細的資料。
這個就是為什麼乙個表僅僅能有乙個聚集索引。能夠有多個非聚集索引的原理。
我們寫乙個sql查詢語句。怎麼樣才幹知道這個sql查詢語句是好的還是壞的?
一種方法,我們大家都知道。直接在sql server的查詢器中執行,然後,其執行狀態列會給出我們對應的結果,如:執行時間(秒);另一種方法,通過執行set statistics io on,開啟資源消耗資訊,執行set statistics time on,開啟執行時間,開啟這兩個功能後,我們再次執行sql語句時。其結果檢視旁邊的訊息檢視內,會出現對應的結果。另一種方式就是使用sql server profiler工具(工具—sql
server profiler)。幫助我們監聽執行的sql語句的運**況。這樣的方式更適用於我們在程式中無法提取sql語句的情況。
通過上面的方法。我們能夠知道我們的sql語句的好壞,對於壞的sql,我們要想法設法的進行對應的改變,可是。對於壞的sql語句。我們在優化的時候,總得要知道其問題出在了**吧。不能說我就那麼的改了,所以。此時,我們須要了還有乙個工具,幫助我們分析,即:執行計畫檢視(查詢—顯示執行的查詢計畫),通過執行計畫。可知道我們sql語句在執行查詢的時候,使用了還是沒有使用索引。在這裡介紹3中查詢的方式:table
scan,index scan。index seek。
table scan就是全表掃瞄,直接在真實的資料塊中進行所有掃瞄。index scan就是在索引樹上進行全掃瞄,此時假設是聚集索引,就會直接得到對應的資料(葉子上就是詳細的資料),假設是非聚集索引,則須要獲得葉子上對應的聚集索引鍵,然後,再依據聚集索引鍵在聚集索引樹中找到對應的真實資料;index scan就是索引樹上的搜尋。這樣的方式的實現跟其內部的原理有關,由於這個是樹,所以,依據一些演算法(二叉等等)能夠高速的定位到詳細的資料。這個也分為聚集和非聚集,在這裡不再贅述。
通過執行計畫,我們能夠知道。我們的sql語句在那塊沒有使用索引。然後。我們能夠改sql語句,也能夠建立對應的索引,這裡須要知道,並非使用了索引就一定塊。假設你的資料很的小,假設你建立的索引很的多,那麼,可能會存在這樣的情況:不如全表索引的塊。
所以,在優化我們的sql時,我們盡量往已有的索引上靠攏。實現不行了,那麼,依據資料量的多少,我們看看,是否須要再建立對應的索引。
上面一塊內容我們知道了,我們的sql語句應該盡可能的向已有的索引靠攏,那麼。假設才幹使用到已有的索引呢?你可能會說,我們多建立一些索引不即可了嘛,實在不行每乙個列都是乙個索引,這樣不就能夠使用到了索引了嘛,依照你說的這樣的情況,我們姑且不考慮其他。就覺得sql語句執行的時候,使用了索引就是快。可是,我想說的是。及時你每乙個列上都建立上索引。也不見得你寫的sql語句在執行的時候就是使用到了index seek。為什麼呢?由於系統在分析你的sql語句時,無法找到乙個合理的index
seek的執行計畫,那麼。怎麼樣寫我們的sql語句,才幹夠使系統經過分析後,得到的執行計畫裡使用到了index seek呢?怎麼樣寫我們的sql語句才幹夠得到最優的執行計畫呢?
1、查詢列的優化
用到表中的那個列就select誰,不要select * ,除非你每乙個列都使用。由於select * 和select 全部列是一樣的
2、where查詢條件的優化
不要對條件列進行對應的操作,如:在列上使用函式,列進行資料型別的轉換。列上使用引數運算子(filed + 'aaa')。在列上使用不可引數化的條件(like '%a',not……,or……等),這些都會使索引的實現大大折扣。或者直接就喪失
3、其他
不要使用游標,能夠使用集合條件查詢**游標;使用exists取代count(*)進行資料存在與否的驗證
索引多了不見得好。沒有索引不見得不好;索引的有無。是依據詳細的資料量來說的。該列是否要建立索引,是依據這個列在查詢時作為條件查詢的比重;好的sql語句,不僅要向索引靠攏。也要遮蔽不必要的資料和執行次數。
SQL2005 高效分頁sql查詢語句經典例項
方法一 sql2005 高效分頁sql查詢語句經典例項 如下 select top 10 from select top page 10 row number over order by id as rownum,id,username from guest where username user ...
SQL優化之高效SQL語句
一 sql語句的執行步驟 from子句組裝來自不同資料來源的資料 from後面的表關聯,是自右向左解析的,即在寫sql的時候,盡量把資料量大的表放在最右邊來進行關聯 where子句基於指定的條件對記錄行進行篩選 where條件的解析順序是自下而上,從右到左的,即應把能篩選出大量資料的條件放在wher...
編寫sql語句技巧
一 今天遇到乙個帥選資料的問題,sqlserver儲存過程中,加了乙個新的篩選資料的條件,不打亂原來的取資料的模式下把新的功能新增進去,用一段複合型的exists語句就可以解決問題 and 原先的sql 語句 過濾自助機不顯示的科室 專家資料 add by aorigel 20101020 andn...