新聞中心
SQLSERVER的表值函數(shù)是SQLSERVER 2005以來(lái)的新特性,由于它使用比較方便,就像一個(gè)單獨(dú)的表一樣,在我們的系統(tǒng)中大量使用。有一個(gè)獲取客戶(hù)數(shù)據(jù)的SQLSERVER 表值函數(shù),如果使用管理員登錄,這個(gè)函數(shù)會(huì)返回150W行記錄,大概需要30秒左右,但如果將TOP語(yǔ)句放到表值函數(shù)外,效率異常低下,需要約3分鐘:

- select top 20 * from GetFrame_CustomerSerch('admin','1')
下面是該存儲(chǔ)過(guò)程的定義:
- 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
- (
- --具體子查詢(xún)略
- )
- ) 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
- (
- --具體子查詢(xún)略
- )
- )
這個(gè)語(yǔ)句放在PDF.NET數(shù)據(jù)開(kāi)發(fā)框架的SQL-MAP文件中,開(kāi)始還以為是框架引起的,將這個(gè)語(yǔ)句直接在查詢(xún)分析器中查詢(xún),仍然很慢。
將GetFrame_CustomerSerch 中的SQL語(yǔ)句提取出來(lái),直接加上Top查詢(xún),只需要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
- (
- --具體子查詢(xún)略
- )
- ) 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
- (
- --具體子查詢(xún)略
- )
為什么會(huì)有這么大的差異?
我分析可能有如下原因:
1,在表值函數(shù)外使用Top或者其它條件,SQLSERVER 的查詢(xún)優(yōu)化器無(wú)法針對(duì)此查詢(xún)進(jìn)行優(yōu)化,比如先返回所有記錄,然后再在臨時(shí)表中選取前面的20條記錄;
2,雖說(shuō)該表值函數(shù)使用了“表變量”,它是內(nèi)存中的,但如果這個(gè)“表”結(jié)果很大,很有可能內(nèi)存放不下(并非還有物理內(nèi)存就會(huì)將結(jié)果放到物理內(nèi)存中,數(shù)據(jù)庫(kù)自己還會(huì)有保留的,會(huì)給其它查詢(xún)預(yù)留一定的內(nèi)存空間),使用虛擬內(nèi)存,而虛擬內(nèi)存實(shí)際上就是磁盤(pán)頁(yè)面文件,當(dāng)記錄太多就會(huì)發(fā)生頻繁的頁(yè)面交換,從而導(dǎo)致這個(gè)查詢(xún)效率非常低。
看來(lái),“表值函數(shù)”也不是傳說(shuō)中的那么好,不知道大家是怎么認(rèn)為的。
最近還遇到一個(gè)怪異的問(wèn)題,有一個(gè)存儲(chǔ)過(guò)程,老是在系統(tǒng)運(yùn)行1-2天后變得極其緩慢,但重新修改一下又很快了(只是加一個(gè)空格之類(lèi)),不知道大家遇到過(guò)沒(méi)有,什么原因?
當(dāng)前名稱(chēng):分析TOP語(yǔ)句放到表值函數(shù)外,效率異常低下的原因
分享URL:http://m.5511xx.com/article/dpcdjjc.html


咨詢(xún)
建站咨詢(xún)
