3

背景:SQL服務器計算列正在放緩表現在一個簡單的SELECT語句

以前,我公司是使用用戶定義函數來HTML編碼一個地方存儲過程的子句中的一些數據。示例如下:

DECLARE @LName --HTML encoded last name as input parameter from user 

SELECT * 
    FROM (SELECT LName 
      FROM SomeView xtra 
     WHERE ((@LName <> '' 
       AND dbo.EncodingFunction(dbo.DecodingFunction(xtra.LName)) = @LName) 
      OR @Lname='')) 

爲了清楚起見,我簡化了它。

問題是,當該查詢的存儲過程在快速連續調用45次時,具有62,000條記錄的表上的平均性能約爲85秒。當我刪除UDF時,性能提高到僅超過1秒就可以運行45次。

因此,我們諮詢並決定了一個解決方案,該解決方案包含一個計算列,該列由視圖SomeView訪問。計算列被寫入表的定義是這樣的:

[LNameComputedColumn] AS (dbo.EncodingFunction(dbo.DecodingFunction([LName]))) 

然後我跑了更新的表和自動填充的過程,對於所有62000個記錄計算列。然後,我改變了存儲過程的查詢到以下幾點:

DECLARE @LName --HTML encoded last name as input parameter from user 

SELECT * FROM 
     (SELECT LNameComputedColumn 
     FROM SomeView xtra 
     WHERE ((@LName <> '' AND [email protected]) OR @Lname='') 

當我跑了存儲過程,平均運行時間爲45個處決提高到約90秒。我的改變實際上使問題變得更糟!

我在做什麼錯?有沒有辦法提高性能?

作爲一個側面說明,我們目前正在使用SQL Server 2000,並計劃很快升級到2008 R2,但所有的代碼必須在SQL Server 2000工作

+0

有什麼'或'的意義呢?因爲'OR @LName ='''沒有從表中獲取任何東西。抽象太多隻會浪費每個人的時間 - 我們無法解釋我們不知道的事情。 – 2012-04-05 01:20:40

回答

3

問:MS SQL計算列降低系統性能...

答:馬曲棍球;)

... where @LName <> '' ... 

問:你能說 「全表掃描」?

我不是說你的功能不是昂貴。但你真的要做出更有選擇性的「where」子句,然後才能點手指...

恕我直言......

建議:

  1. 查詢數據(獲得所有相關的 「L-NAME的」 第一

  2. 的結果(只有選擇了 「LNAMES」 運行您的功能 - 這,我相信,不是在整個視圖或表中的每一行)

  3. 在存儲的專業版中執行兩個操作(使用過濾器進行查詢,然後進行後處理) cedure

8

添加計算的創建虛擬,仍然在運行時計算所選的每一行。你想要的是一個計算堅持列,這是計算在插入時和物理存儲在表:

[LNameComputedColumn] 
    AS (dbo.EncodingFunction(dbo.DecodingFunction([LName]))) PERSISTED