[英]PowerBuilder SQL on SQL Server 2008 - CASE statement with computed column in SELECT
[英]SQL Server computed column is slowing down performance on a simple select statement
背景:
以前,我的公司使用用戶定義的 function 到 html 對存儲過程的 where 子句中的一些數據進行編碼。 示例如下:
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 秒來運行 sproc 45 次。
因此,我們咨詢並決定了一個解決方案,該解決方案在視圖SomeView
訪問的表中包含一個計算列。 計算列被寫入表定義中,如下所示:
[LNameComputedColumn] AS (dbo.EncodingFunction(dbo.DecodingFunction([LName])))
然后,我運行了一個過程來更新表並自動填充所有 62,000 條記錄的計算列。 然后我將存儲過程查詢更改為以下內容:
DECLARE @LName --HTML encoded last name as input parameter from user
SELECT * FROM
(SELECT LNameComputedColumn
FROM SomeView xtra
WHERE (( @LName <> '' AND xtra.LNameComputedColumn=@LName) OR @Lname='')
當我運行該存儲過程時,45 次執行的平均運行時間增加到大約 90 秒。 我的改變實際上使問題變得更糟!
我究竟做錯了什么? 有沒有辦法提高性能?
作為旁注,我們目前正在使用 SQL Server 2000,並計划很快升級到 2008 R2,但所有代碼都必須在 SQL Server 2000 中運行。
添加一個計算創建一個虛擬列,仍然在運行時為每個選定的行計算。 你想要的是一個計算的持久列,它在插入時計算並物理存儲在表中:
[LNameComputedColumn]
AS (dbo.EncodingFunction(dbo.DecodingFunction([LName]))) PERSISTED
問:MS SQL 計算列正在降低性能...
答:馬曲棍球;)
... where @LName <> '' ...
Q:可以說“全表掃描”嗎?
我不是說你的 function不貴。 但是你真的必須在你指責之前制作一個更具選擇性的“where”子句......
恕我直言...
建議:
查詢數據(首先獲取所有相關的“Lname”)
在結果上運行 function(只有選定的“Lnames”——我認為,這不是整個視圖或表格中的每一行)
在存儲過程中執行這兩個操作(使用過濾器查詢,然后進行后處理)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.