成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

數據庫 SQL Server 數據庫運維
有一個獲取客戶數據的SQLSERVER 表值函數,如果使用管理員登錄,這個函數會返回150W行記錄,大概需要30秒左右,但如果將TOP語句放到表值函數外,效率異常低下,需要約3分鐘,為什么呢?

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

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

下面是該存儲過程的定義:

  1. ALTER FUNCTION [dbo].[GetFrame_CustomerSerch]  
  2. (      
  3.     -- Add the parameters for the function here  
  4.     @WorkNo varchar(38)  
  5.     ,@SerchChar varchar(500)  
  6. )  
  7. RETURNS TABLE   
  8. AS 
  9. RETURN   
  10. (  
  11.     -- Add the SELECT statement with parameter references here  
  12.     select a.GUID,a.CustomerName,a.CustomerIDcard,a.CustomerPhone,a.CustomerMobile from 
  13.     (  
  14.    --具體子查詢略  
  15.     )  
  16.     ) a union all 
  17.     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  
  18.     --where a.WorkNo=@WorkNo  
  19.     WHERE a.WorkNo IN 
  20.     (  
  21. --具體子查詢略  
  22.     )  
  23.     ) 

這個語句放在PDF.NET數據開發框架的SQL-MAP文件中,開始還以為是框架引起的,將這個語句直接在查詢分析器中查詢,仍然很慢。

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

  1. declare @WorkNo varchar(38)  
  2. declare @SerchChar varchar(500)  
  3. set @WorkNo='admin' 
  4. set @SerchChar='1' 
  5. select top 20 a.GUID,a.CustomerName,a.CustomerIDcard,a.CustomerPhone,a.CustomerMobile from 
  6.  (  
  7.   --具體子查詢略  
  8.  )  
  9.  ) a union all 
  10.  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  
  11.    
  12.  WHERE a.WorkNo IN 
  13.  (  
  14.  --具體子查詢略  
  15.  ) 

為什么會有這么大的差異?

我分析可能有如下原因:

1,在表值函數外使用Top或者其它條件,SQLSERVER 的查詢優化器無法針對此查詢進行優化,比如先返回所有記錄,然后再在臨時表中選取前面的20條記錄;

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

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

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

原文鏈接:http://www.cnblogs.com/bluedoctor/archive/2011/04/27/2030305.html

【編輯推薦】

  1. 雙TOP二分法生成分頁SQL類
  2. SQL Server數據庫中簡單的SELECT TOP
  3. 利用top構造Sql Server分頁查詢
責任編輯:艾婧 來源: 博客園
相關推薦

2009-09-09 13:53:21

Linq表值函數

2018-04-19 08:40:37

OracleJOB異常中斷

2013-04-17 10:50:51

北美大型數據中心能源效率

2020-03-23 10:42:56

團隊協作阿里

2021-01-04 05:46:00

AI人工智能深度學習

2012-10-11 10:21:33

數據中心CPU利用率服務器效率

2010-11-25 13:32:57

MySQL系統效率

2009-07-20 15:51:45

JDBC連接Oracl

2009-09-04 17:31:32

C# SQL語句執行函

2018-07-31 15:53:00

數據庫MySQLi-o

2009-11-02 16:14:53

2011-06-14 18:02:26

外鏈網站降權

2010-09-25 11:39:37

SQL語句

2010-09-16 14:38:55

Sql server表

2010-11-22 10:08:03

Mysql外鍵用法

2010-09-17 16:03:17

鎖定SQL表

2010-11-10 11:37:29

SQL Server刪

2011-06-29 18:37:12

外鏈

2011-08-01 16:31:29

MySQL數據庫外鍵

2010-11-15 16:46:49

Oracle查詢效率
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费视频一区二区 | 国产一级片一区二区 | 狠狠亚洲 | 日韩久久精品电影 | 欧美精品一区二区三区在线播放 | 亚洲综合成人网 | 国产999在线观看 | 国产蜜臀 | 天堂视频一区 | 国产一区视频在线 | 成人网av | 91久久精品一区二区二区 | 在线免费观看毛片 | 色综合色综合色综合 | 91社区在线高清 | 久久99精品久久久久久国产越南 | 国产成人精品久久二区二区91 | 久久久久国产一区二区三区 | 亚洲精品在线观看网站 | 黄网站免费在线看 | 日韩成人国产 | 中文字幕在线电影观看 | 1区2区视频 | 一区二区三区av | 一级黄色片日本 | 成人欧美一区二区三区在线播放 | 久久久成| 国产福利91精品一区二区三区 | 狠狠ri| 亚洲欧美在线免费观看 | 天天拍天天操 | 凹凸日日摸日日碰夜夜 | 99国产视频| 二区av | 农夫在线精品视频免费观看 | 欧美激情欧美激情在线五月 | 国产精品久久二区 | 成人网视频 | 亚洲一区在线观看视频 | 91豆花视频 | 黄色大片视频 |