【查詢優化】怎樣用SQL語句查看查詢的性能指標
捍郵?莼撼逯卸寥〉氖?菀呈? 物理讀取:從物理磁盤中往緩沖讀取的數據頁數; 預讀:根據執行計劃從物理磁盤中往緩沖讀取的數據頁數; 其中對于首次查詢一般情況下會有一下關系:邏輯讀取=物理讀取+預讀(其中的具體聯系,由于已經在之前的博客文章中提到,就不再詳細說明(文章名為【查詢優化】MSSQL查詢執行流程)) 同理,后面的lob邏輯讀取、物理讀取、預讀概念理解差不多,只是是對相應表進行更新或插入操作時體現。 對于掃描計數,以上圖片的查詢沒有連接查詢,因此意義不大。不過,如果連接查詢來說,特別是循環查詢那種,比如說自連接,如果循環次數越多,則掃描次數也就越多,則會使得查詢的效率越低。這是掃描計數是一個比較重要的性能體現參數。 對于邏輯讀取,由于SQLSERVER中對數據進行任何操作都要把數據讀入到緩沖當中,如果邏輯讀取的頁數越多,則查詢的性能越低。為此,邏輯讀取一般都是查詢性能體現的一個重要參數。二、SET STATISTICS TIME (SQL Server解析和編譯時間) 上面顯示的信息表明,執行這次查詢使用了多少CPU運行時間和運行查詢使用了多少時間。CPU運行時間是對運行查詢所需要的CPU資源的一種相對穩定的測量方法,與CPU的忙閑程度沒有關系。但是,每次運行查詢時這一數字也會有所不同,只是變化的范圍沒有總時間變化大。總時間是對查詢執行所需要的時間(不計算阻塞或讀數據的時間),由于服務器上的負載是在不斷變化的,因此這一數據的變化范圍有時會相當地大。
總的來說,量化地來看一個查詢語句的性能可以在幾個參數進行比較:1、CPU時間。可以比較查詢的循環掃描次數和邏輯讀取的數據量;
SQL查詢語句性能優化建議
1、查列表時,盡量把要查的字段查出,select id,name from 這樣比select * from 效率高點。
2、一個頁面有很多List要查,而這些List又屬于同一個表,只是條件不同,可以用or將所有的條件放在一個語句中,查出List,再用if根據條件判斷封裝不同List,這將很多個數據庫鏈接轉化成了一個數據庫鏈接,hibernate只要創建一個sessionfactory,效率比同時查多個語句快。
3、盡量把需要的字段放在同一張表上,這和第二條類似。
優化SQL 查詢:如何寫出高性能SQL語句
1、深入理解數據庫的工作原理和數據存儲的方式,不同的數據庫的工作原理是不同的,mysql oracle db2等等都是不同的,更不要說一些nosql數據庫和newsql數據庫了。
2、理解sql語句檢索數據的方式。3、理解索引,知道怎樣的字段建立怎樣的索引,索引能做什么,不能做什么,合理的建立字段。
4、合理的拆分和合并表,數據放在一張表里面查詢肯定比放在多張表里面級聯查詢要快。5、會查看執行任務,任何數據庫都有查看執行任務的方法,包括nosql數據庫和newsql數據庫已經一些大數據數據庫;同時還要會分析執行任務,分析主要是所以的使用效率和字段數據的檢索方式。
6、sql語句只是性能優化的簡單方面,性能優化是從整體應用架構開始體現的,優化sql并不能夠解決根本問題,當數據量達到一定級別以后,數據就不能使用關系型數據庫,而要使用大數據數據庫,這樣sql就無用了。7、不要刻意專注sql本身,sql只是一種查詢語言,它本身與性能無關,性能優化的本質在于對存儲方式和查詢檢索過程的深入理解。
8、任何系統功能業務的準確性至上,首先保證功能的正確性再考慮性能優化,如果功能就是數據量大,業務復雜,必須要用到低性能sql的檢索方式,那么你只能妥協,否則就要棄用sql和關系型數據庫另尋它路。
如何使用SQL查詢語句
一、 簡單查詢 簡單的Transact-SQL查詢只包括選擇列表、FROM子句和WHERE子句。
它們分別說明所查詢列、查詢的表或視圖、以及搜索條件等。例如,下面的語句查詢testtable表中姓名為“張三”的nickname字段和email字段。
SELECT nickname,emailFROM testtableWHERE name='張三'(一) 選擇列表選擇列表(select_list)指出所查詢列,它可以是一組列名列表、星號、表達式、變量(包括局部變量和全局變量)等構成。 1、選擇所有列例如,下面語句顯示testtable表中所有列的數據:SELECT *FROM testtable 2、選擇部分列并指定它們的顯示次序查詢結果集合中數據的排列順序與選擇列表中所指定的列名排列順序相同。
例如:SELECT nickname,emailFROM testtable 3、更改列標題在選擇列表中,可重新指定列標題。定義格式為:列標題=列名列名 列標題如果指定的列標題不是標準的標識符格式時,應使用引號定界符,例如,下列語句使用漢字顯示列標題:SELECT 昵稱=nickname,電子郵件=emailFROM testtable 4、刪除重復行SELECT語句中使用ALL或DISTINCT選項來顯示表中符合條件的所有行或刪除其中重復的數據行,默認為ALL。
使用DISTINCT選項時,對于所有重復的數據行在SELECT返回的結果集合中只保留一行。 5、限制返回的行數使用TOP n [PERCENT]選項限制返回的數據行數,TOP n說明返回n行,而TOP n PERCENT時,說明n是表示一百分數,指定返回的行數等于總行數的百分之幾。
例如:SELECT TOP 2 *FROM testtableSELECT TOP 20 PERCENT *FROM testtable(二)FROM子句 FROM子句指定SELECT語句查詢及與查詢相關的表或視圖。在FROM子句中最多可指定256個表或視圖,它們之間用逗號分隔。
在FROM子句同時指定多個表或視圖時,如果選擇列表中存在同名列,這時應使用對象名限定這些列所屬的表或視圖。例如在usertable和citytable表中同時存在cityid列,在查詢兩個表中的cityid時應使用下面語句格式加以限定:SELECT username,citytable。
cityidFROM usertable,citytableWHERE usertable。cityid=citytable。
cityid在FROM子句中可用以下兩種格式為表或視圖指定別名:表名 as 別名表名 別名(二) FROM子句FROM子句指定SELECT語句查詢及與查詢相關的表或視圖。 在FROM子句中最多可指定256個表或視圖,它們之間用逗號分隔。
在FROM子句同時指定多個表或視圖時,如果選擇列表中存在同名列,這時應使用對象名限定這些列所屬的表或視圖。例如在usertable和citytable表中同時存在cityid列,在查詢兩個表中的cityid時應使用下面語句格式加以限定:SELECT username,citytable。
cityidFROM usertable,citytableWHERE usertable。cityid=citytable。
cityid在FROM子句中可用以下兩種格式為表或視圖指定別名:表名 as 別名表名 別名例如上面語句可用表的別名格式表示為:SELECT username,b。 cityidFROM usertable a,citytable bWHERE a。
cityid=b。cityidSELECT不僅能從表或視圖中檢索數據,它還能夠從其它查詢語句所返回的結果集合中查詢數據。
例如:SELECT a。au_fname+a。
au_lnameFROM authors a,titleauthor ta(SELECT title_id,titleFROM titlesWHERE ytd_sales>10000) AS tWHERE a。au_id=ta。
au_idAND ta。 title_id=t。
title_id此例中,將SELECT返回的結果集合給予一別名t,然后再從中檢索數據。