SQL Server高效運行總的來說有兩種方式: 一、 擴容,提高伺服器性能,顯著提高CPU、記憶體,解決磁碟I/O瓶頸。硬體的提升是立竿見影的,而且是風險小,在硬體更新換代非常快的年代, 當SQLServer 速度感覺慢的時候,第一選擇是更換更新的,更強的伺服器! 二、優化應用程式 這個是次優選擇。 ...
SQL Server高效運行總的來說有兩種方式:
一、 擴容,提高伺服器性能,顯著提高CPU、記憶體,解決磁碟I/O瓶頸。硬體的提升是立竿見影的,而且是風險小,在硬體更新換代非常快的年代,
當SQLServer 速度感覺慢的時候,第一選擇是更換更新的,更強的伺服器!
二、優化應用程式
這個是次優選擇。
SQL 優化,可以考慮從以下幾個方面:
1.內嵌視圖與臨時表 [源自MSDN的文章《五種提高 SQL 性能的方法》]
臨時表 - 在 tempdb 中的臨時表會導致查詢進行大量 I/O 操作和磁碟訪問,臨時表會消耗大量資源。
內嵌視圖 -使用內嵌視圖取代臨時表。內嵌視圖只是一個可以聯接到 FROM 子句中的查詢。如果只需要將數據聯接到其他查詢,則可以試試使用內嵌視圖,以節省資源。
例如,如果要查詢最新五個定單的有關信息,您首先需要知道是哪些定單。這可以使用返回定單 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
此查詢不僅比前面的查詢效率更高,而且長度更短。臨時表會消耗大量資源。如果只需要將數據聯接到其他查詢,則可以試試使用內嵌視圖,以節省資源。
---------------------