簡體   English   中英

SQL 服務器計算列正在降低簡單語句 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”子句......

恕我直言...

建議:

  1. 查詢數據(首先獲取所有相關的“Lname”)

  2. 在結果上運行 function(只有選定的“Lnames”——我認為,這不是整個視圖或表格中的每一行)

  3. 在存儲過程中執行這兩個操作(使用過濾器查詢,然后進行后處理)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM