TOP語句放到資料表值函式外,效率異常低下的原因分析

來源:互聯網
上載者:User

SQLSERVER的資料表值函式是SQLSERVER 2005以來的新特性,由於它使用比較方便,就像一個單獨的表一樣,在我們的系統中大量使用。有一個擷取客戶資料的SQLSERVER 資料表值函式,如果使用管理員登入,這個函數會返回150W行記錄,大概需要30秒左右,但如果將TOP語句放到資料表值函式外,效率異常低下,需要約3分鐘:

select top 20  * from GetFrame_CustomerSerch('admin','1')

下面是該預存程序的定義:

 

ALTER FUNCTION [dbo].[GetFrame_CustomerSerch]
(    
    -- Add the parameters for the function here
    @WorkNo varchar(38)
    ,@SerchChar varchar(500)
)
RETURNS TABLE 
AS
RETURN 
(
    -- Add the SELECT statement with parameter references here
    select a.GUID,a.CustomerName,a.CustomerIDcard,a.CustomerPhone,a.CustomerMobile from
    (
   --具體子查詢略
    )
    ) a union all
    select b.GUID,b.CustomerName,b.CustomerIDcard,b.CustomerPhone,b.CustomerMobile from WFT_ManagerCollectUsers a left join WFT_Customer b on a.FundAccount=b.FundAccount
    --where a.WorkNo=@WorkNo
    WHERE a.WorkNo IN
    (--具體子查詢略
    )
    )

 

 

這個語句放在PDF.NET資料開發架構的SQL-MAP檔案中,開始還以為是架構引起的,將這個語句直接在查詢分析器中查詢,仍然很慢。

將GetFrame_CustomerSerch 中的SQL語句提取出來,直接加上Top查詢,只需要6秒,快了N倍:

declare @WorkNo varchar(38)
declare @SerchChar varchar(500)
set @WorkNo='admin'
set @SerchChar='1'
select top 20 a.GUID,a.CustomerName,a.CustomerIDcard,a.CustomerPhone,a.CustomerMobile from
 (
  --具體子查詢略
 )
 ) a union all
 select b.GUID,b.CustomerName,b.CustomerIDcard,b.CustomerPhone,b.CustomerMobile from WFT_ManagerCollectUsers a left join WFT_Customer b on a.FundAccount=b.FundAccount
 
 WHERE a.WorkNo IN
 (
 --具體子查詢略
 )
 

 

為什麼會有這麼大的差異?
我分析可能有如下原因:

1,在資料表值函式外使用Top或者其它條件,SQLSERVER 的查詢最佳化工具無法針對此查詢進行最佳化,比如先返回所有記錄,然後再在暫存資料表中選取前面的20條記錄;

2,雖說該資料表值函式使用了“表變數”,它是記憶體中的,但如果這個“表”結果很大,很有可能記憶體放不下(並非還有實體記憶體就會將結果放到實體記憶體中,資料庫自己還會有保留的,會給其它查詢預留一定的記憶體空間),使用虛擬記憶體,而虛擬記憶體實際上就是磁碟分頁檔,當記錄太多就會發生頻繁的頁面交換,從而導致這個查詢效率非常低。

看來,“資料表值函式”也不是傳說中的那麼好,不知道大家是怎麼認為的。

最近還遇到一個怪異的問題,有一個預存程序,老是在系統運行1-2天后變得極其緩慢,但重新修改一下又很快了(只是加一個空格之類),不知道大家遇到過沒有,什麼原因?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.