程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 提高SQL Server性能的五種方法

提高SQL Server性能的五種方法

編輯:關於SqlServer

有時,為了讓應用程序運行得更快,所做的全部工作就是在這裡或那裡做一些很小調整。但關鍵在於確定如何進行調整!遲早您會遇到這種情況:應用程序中的SQL查詢不能按照您想要的方式進行響應。它要麼不返回數據,要麼耗費的時間長得出奇。如果它降低了企業應用程序的速度,用戶必須等待很長時間。用戶希望應用程序響應迅速,他們的報告能夠在瞬間之內返回分析數據。就我自己而言,如果在Web上沖浪時某個頁面要耗費十多秒才能加載,我也會很不耐煩。

為了解決這些問題,重要的是找到問題的根源。那麼,從哪裡開始呢?根本原因通常在於數據庫設計和訪問它的查詢。我將講述五項技術,這些技術可用於提高基於SQL Server的應用程序的性能或改善其可伸縮性。我將仔細說明LEFT join、CROSS join的使用以及IDENTITY值的檢索。請記住,根本沒有神奇的解決方案。調整您的數據庫及其查詢需要占用時間、進行分析,還需要大量的測試。這些技術都已被證明行之有效,但對您的應用程序而言,可能其中一些技術比另一些技術更適用。

一、從insert返回IDENTITY

我決定從遇到許多問題的內容入手:如何在執行SQL insert後檢索IDENTITY值。通常,問題不在於如何編寫檢索值的查詢,而在於在哪裡以及何時進行檢索。在SQL Server中,下面的語句可用於檢索由最新在活動數據庫連接上運行的 SQL 語句所創建的IDENTITY 值:

select @@IDENTITY

這個SQL語句並不復雜,但需要記住的一點是:如果這個最新的SQL語句不是insert,或者您針對非insert SQL的其他連接運行了此SQL,則不會獲得期望的值。您必須運行下列代碼才能檢索緊跟在 insert SQL 之後且位於同一連接上的 IDENTITY,如下所示:

insert INTO Products (ProductName) VALUES (’Chalk’)
select @@IDENTITY
在一個連接上針對Northwind數據庫運行這些查詢將返回一個名稱為Chalk的新產品的IDENTITY值。所以,在使用ADOVisual Basic應用程序中,可以運行以下語句:
Set oRs = oCn.execute("SET NOcount ON;insert INTO Products _
(ProductName) VALUES (’Chalk’);select @@IDENTITY")
lProductID = oRs(0) 

此代碼告訴SQL Server不要返回查詢的行計數,然後執行insert語句,並返回剛剛為這個新行創建的IDENTITY值。SET NOcount ON語句表示返回的記錄集有一行和一列,其中包含了這個新的 IDENTITY 值。如果沒有此語句,則會首先返回一個空的記錄集(因為 insert語句不返回任何數據),然後會返回第二個記錄集,第二個記錄集中包含 IDENTITY 值。這可能有些令人困惑,尤其是因為您從來就沒有希望過 insert 會返回記錄集。之所以會發生此情況,是因為 SQL Server 看到了這個行計數(即一行受到影響)並將其解釋為表示一個記錄集。因此,真正的數據被推回到了第二個記錄集。當然您可以使用 ADO 中的 NextRecordset 方法獲取此第二個記錄集,但如果總能夠首先返回該記錄集且只返回該記錄集,則會更方便,也更有效率。

此方法雖然有效,但需要在SQL語句中額外添加一些代碼。獲得相同結果的另一方法是在insert之前使用SET NOcount ON語句,並將select @@IDENTITY語句放在表中的 FOR insert觸發器中,如下面的代碼片段所示。這樣,任何進入該表的 insert 語句都將自動返回 IDENTITY 值。

create TRIGGER trProducts_insert ON Products FOR insert AS

select @@IDENTITY

GO

觸發器只在Products表上發生insert時啟動,所以它總是會在成功insert之後返回一個IDENTITY。使用此技術,您可以始終以相同的方式在應用程序中檢索IDENTITY值。

二、內嵌視圖與臨時表

某些時候,查詢需要將數據與其他一些可能只能通過執行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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved