提高 SQL 效能的方法

2021-04-25 18:53:17 字數 2719 閱讀 7039

某些時候,查詢需要將資料與其他一些可能只能通過執行 group by 然後執行標準查詢才能收集的資料進行聯接。例如,如果要查詢最新五個定單的有關資訊,您首先需要知道是哪些定單。這可以使用返回定單 id 的 sql 查詢來檢索。此資料就會儲存在臨時表(這是乙個常用技術)中,然後與 products 表進行聯接,以返回這些定單售出的產品數量:

create table #temp1 (orderid int not null, _

orderdate datetime not null)

insert into #temp1 (orderid, orderdate)

select top 5 o.orderid, o.orderdate

from orders o order by o.orderdate desc

select p.productname, sum(od.quantity) as productquantity

from #temp1 t

inner join [order details] od on t.orderid = od.orderid

inner join products p on od.productid = p.productid

group by p.productname

order by p.productname

drop table #temp1

這些 sql 語句會建立乙個臨時表,將資料插入該表中,將其他資料與該錶進行聯接,然後除去該臨時表。這會導致此查詢進行大量 i/o 操作,因此,可以重新編寫查詢,使用內嵌檢視取代臨時表。內嵌檢視只是乙個可以聯接到 from 子句中的查詢。所以,您不用在 tempdb 中的臨時表上耗費大量 i/o 和磁碟訪問,而可以使用內嵌檢視得到同樣的結果:

select p.productname, 

sum(od.quantity) as productquantity

from (

select top 5 o.orderid, o.orderdate

from orders o

order by o.orderdate desc

) t

inner join [order details] od on t.orderid = od.orderid

inner join products p on od.productid = p.productid

group by

p.productname

order by

p.productname

此查詢不僅比前面的查詢效率更高,而且長度更短。臨時表會消耗大量資源。如果只需要將資料聯接到其他查詢,則可以試試使用內嵌檢視,以節省資源。

返回頁首

當然,有很多時候您需要執行 left join 和使用 null 值。但是,它們並不適用於所有情況。改變 sql 查詢的構建方式可能會產生將乙個花幾分鐘執行的報告縮短到只花幾秒鐘這樣的天壤之別的效果。有時,必須在查詢中調整資料的形態,使之適應應用程式所要求的顯示方式。雖然 table 資料型別會減少大量占用資源的情況,但在查詢中還有許多區域可以進行優化。sql 的乙個有價值的常用功能是 left join。它可以用於檢索第乙個表中的所有行、第二個表中所有匹配的行、以及第二個表中與第乙個表不匹配的所有行。例如,如果希望返回每個客戶及其定單,使用 left join 則可以顯示有定單和沒有定單的客戶。

此工具可能會被過度使用。left join 消耗的資源非常之多,因為它們包含與 null(不存在)資料匹配的資料。在某些情況下,這是不可避免的,但是代價可能非常高。left join 比 inner join 消耗資源更多,所以如果您可以重新編寫查詢以使得該查詢不使用任何 left join,則會得到非常可觀的回報(請參閱圖 1 中的圖)。

圖 1 查詢

加快使用 left join 的查詢速度的一項技術涉及建立乙個 table 資料型別,插入第乙個表(left join 左側的表)中的所有行,然後使用第二個表中的值更新 table 資料型別。此技術是乙個兩步的過程,但與標準的 left join 相比,可以節省大量時間。乙個很好的規則是嘗試各種不同的技術並記錄每種技術所需的時間,直到獲得用於您的應用程式的執行效能最佳的查詢。

測試查詢的速度時,有必要多次執行此查詢,然後取乙個平均值。因為查詢(或儲存過程)可能會儲存在 sql server 記憶體中的過程快取中,因此第一次嘗試耗費的時間好像稍長一些,而所有後續嘗試耗費的時間都較短。另外,執行您的查詢時,可能正在針對相同的表執行其他查詢。當其他查詢鎖定和解鎖這些表時,可能會導致您的查詢要排隊等待。例如,如果您進行查詢時某人正在更新此表中的資料,則在更新提交時您的查詢可能需要耗費更長時間來執行。

避免使用 left join 時速度降低的最簡單方法是盡可能多地圍繞它們設計資料庫。例如,假設某一產品可能具有類別也可能沒有類別。如果 products 表儲存了其類別的 id,而沒有用於某個特定產品的類別,則您可以在字段中儲存 null 值。然後您必須執行 left join 來獲取所有產品及其類別。您可以建立乙個值為「no category」的類別,從而指定外來鍵關係不允許 null 值。通過執行上述操作,現在您就可以使用 inner join 檢索所有產品及其類別了。雖然這看起來好像是乙個帶有多餘資料的變通方法,但可能是乙個很有價值的技術,因為它可以消除 sql 批處理語句中消耗資源較多的 left join。在資料庫中全部使用此概念可以為您節省大量的處理時間。請記住,對於您的使用者而言,即使幾秒鐘的時間也非常重要,因為當您有許多使用者正在訪問同乙個聯機資料庫應用程式時,這幾秒鐘實際上的意義會非常重大。

提高SQL效能方法

首先,索引是有序的,通過索引,可以避免排序 其次,排序操作是昂貴的,資源開銷較大,特別事需要排序的結果集較大時,更是如此。排序往往是成為一條sql中最消耗資源的處理步驟。所以,如果可以通過索引來避免排序,則可能降低資源的開銷,提高sql的執行效率。由於該問題是在生產環境,無法截圖,只能口述啦,實際也...

提高SQL效能的方法

一 問題的提出 在應用系統開發初期,由於開發資料庫資料比較少,對於查詢sql語句,複雜檢視的的編寫等體會不出sql語句各種寫法的效能優劣,但是如果將應用系統提交實際應用後,隨著資料庫中資料的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中乙個很重要的方面就是sql語句的優化。...

五種提高 SQL 效能的方法

有時,為了讓應用程式執行得更快,所做的全部工作就是在這裡或那裡做一些很小調整。啊,但關鍵在於確定如何進行調整!遲早您會遇到這種情況 應用程式中的 sql 查詢不能按照您想要的方式進行響應。它要麼不返回資料,要麼耗費的時間長得出奇。如果它降低了報告或您的企業應用程式的速度,使用者必須等待的時間過長,他...