如何編寫高效的SQL查詢語句,編寫SQL語句

來源:互聯網
上載者:User

如何編寫高效的SQL查詢語句,編寫SQL語句
概述

       如何編寫效能比較高的SQL查詢語句呢?兩個方法:建立合理的索引;書寫高效的SQL語句


索引的基本原理

       索引分為叢集索引和非叢集索引。一個表只能建立一個叢集索引和N個非叢集索引,這句話的由來主要是由於索引的原理決定的。

       資料庫中的一張表不論你建立不建立索引,或者,不論你建立那種類型的索引,其在硬碟上的儲存是一樣的,那麼,建立索引和不建立索引,或者,建立叢集索引和非叢集索引的區別在什麼地方呢?

       其區別是表內資料在記憶體的存在形式。對於沒有建立索引的表,其載入到記憶體裡時,就只有資料區塊;對於有叢集索引的表,其載入到記憶體時,會形成一棵樹,且葉子節點上就是具體的資料;對於非叢集索引的表(沒有叢集索引時),其載入記憶體時,真實資料為一個獨立的塊,其索引會形成一個索引樹,索引資料的葉子節點對應的是真實資料區塊的rowid;對於既有非叢集索引,又有叢集索引的表,其載入到記憶體時,會形成兩棵樹,具體的資料和叢集索引樹在一起,非叢集索引獨自有一棵樹,此時需要注意,其葉子節點中存放的時叢集索引的index,然後,通過叢集索引的index再去,叢集索引樹中找到具體的資料。這個就是為什麼一個表只能有一個叢集索引,可以有多個非叢集索引的原理。



如何知道我們的SQL查詢語句執行時效能的好壞呢?

        我們寫一個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語句執行的時候,使用了索引就是快,但是,我想說的是,及時你每個列上都建立上索引,也不見得你寫的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語句,不僅要向索引靠攏,也要屏蔽不必要的資料和執行次數。


怎寫出精鍊高效的sql語句

精鍊又高效率的Sql語句對一個大型網站或大型資料庫來講是很有用的,Sql的冗餘造成系統與資源的佔用和時間的增加。
1.什麼樣的sql,才算是高效的sql呢?2.sql為什麼不走索引?如何讓sql走索引,即改變sql的執行計畫3.索引有哪幾種?4,什時候用索引,什麼時候全表掃描oracle最佳化器的表統計資訊,評估出表的最佳串連順序,表的串連方法,執行路徑;最後產生執行計畫,oracle就按著這個計劃來執行sql1.什麼樣的sql是高效sql?答:最本質答案就是執行時間最短,怎麼才能最短了,就是用最少的資源把事辦了,不做無用功;即使sql的io最少,那怎麼樣才才能最少呢?就是盡量用索引,不要全表掃描;在多表關聯的時候,開發人選正確的表串連方法,執行路徑等2.sql為何不走索引A.類型不符B。條件列包含函數但沒有建立相應的函數索引C。複合索引中的前置列沒有被做為查詢條件D。CBO的模式下,選擇的行數比例較大,最佳化器選擇全表掃描E。CBO的模式下,表很久沒有分析,最佳化器選擇了全表掃描3.索引種類及建立方法A。B*索引create index indexname on tablename(columnname);B.反向索引create index indexname on tablename(columnname) reverse;C.降序索引create index indexname on tablename(columnname desc);D.位元影像索引create bitmap index indexname on tablename(columnname);E。函數索引create index indexname on tablename(functionname(columnname));4,什時候用索引,什麼時候用全表掃描?答:要使用索引時,首先要弄清一些基本資料表有多少行?查詢返回多少行?表的哪些列上有索引?都是什麼樣的索引?在有多個條件列時,應該選擇什麼樣的索引?A.當查詢的記錄數,在有序表中小於40%的時候,最好用索引;否則用全表掃描B.當查詢的記錄數,在有無序表中小於7%的時候,最好用索引;否則用全表掃描C.表的鎖片較多時(這個表dml操作很頻繁)
 
怎才可以編寫高效率的SQL 2005 資料庫的 查詢語句-Java

select * from namedb where name = '羅'
更高效的方法就是
select 這一點的星號去了換成你需要用到得欄位名 from namedb where name = '羅'
比如
你就想顯示這個表中的name欄位
那麼就這樣寫
select name from namedb where name = '羅'
如果還需要用到id欄位那麼這樣寫
select name,id from namedb where name = '羅'
這應該是最高效的了 至少是我知道的最高效的了
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.