在***系統中,有乙個獲取客戶資料的sqlserver 錶值函式,如果使用管理員登入,這個函式會返回150w行記錄,大概需要30秒左右,但如果將top語句放到錶值函式外,效率異常低下,需要約3分鐘:
select
top20
*from getframe_customerserch(
'admin
', '1')
將getframe_customerserch 中的sql語句提取出來,直接加上top查詢,只需要6秒,快了n倍:
declare
@workno
varchar(
38)declare
@serchchar
varchar(
500)
set@workno='
admin
'set
@serchchar='
1'select
top20 a.guid,a.customername,a.customeridcard,a.customerphone,a.customermobile
from
(
select
*from wft_customer a
where a.financialplannerworkno
in( select gml.workno
from dbo.getmanagerlist(
@workno) gml)
and (
a.customername
like'%
'+@serchchar+'
%'or a.customeridcard
like'%
'+@serchchar+'
%'or a.customermobile
like'%
'+@serchchar+'
%'or a.customerphone
like'%
'+@serchchar+'
%')
) a
union
allselect 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( select gml.workno
from dbo.getmanagerlist(
@workno) gml)
and (
b.customername
like'%
'+@serchchar+'
%'or b.customeridcard
like'%
'+@serchchar+'
%'or b.customermobile
like'%
'+@serchchar+'
%'or b.customerphone
like'%
'+@serchchar+'
%')
為什麼會有這麼大的差異?
我分析可能有如下原因:
1,在錶值函式外使用top或者其它條件,sqlserver 的查詢優化器無法針對此查詢進行優化,比如先返回所有記錄,然後再在臨時表中選取前面的20條記錄;
2,雖說該錶值函式使用了「表變數」,它是記憶體中的,但如果這個「表」結果很大,很有可能記憶體放不下(並非還有物理記憶體就會將結果放到物理記憶體中,資料庫自己還會有保留的,會給其它查詢預留一定的記憶體空間),使用虛擬記憶體,而虛擬記憶體實際上就是磁碟頁面檔案,當記錄太多就會發生頻繁的頁面交換,從而導致這個查詢效率非常低。
分析TOP語句放到錶值函式外,效率異常低下的原因
sqlserver的錶值函式是sqlserver 2005以來的新特性,由於它使用比較方便,就像乙個單獨的表一樣,在我們的系統中大量使用。有乙個獲取客戶資料的sqlserver 錶值函式,如果使用管理員登入,這個函式會返回150w行記錄,大概需要30秒左右,但如果將top語句放到錶值函式外,效率異常...
多語句錶值函式
多語句錶值函式 多語句錶值函式可以看做是標量函式和內聯錶值函式的結合體。語法 create function 函式名 引數列表 returns 表變數名 table 表變數的字段定義 as begin sql語句 return end 練習 根據性別返回所有學生的學號,姓名,籍貫,數學成績,如果是女...
經典的多語句錶值函式
set ansi nulls on set quoted identifier on gocreate function dbo ufngetcontactinformation contactid int returns retcontactinformation table columns re...