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