SQL Server 中使用临时表和RowCount提高分页查询存储流程性能Word文件下载.docx
- 文档编号:16201290
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:9
- 大小:76.07KB
SQL Server 中使用临时表和RowCount提高分页查询存储流程性能Word文件下载.docx
《SQL Server 中使用临时表和RowCount提高分页查询存储流程性能Word文件下载.docx》由会员分享,可在线阅读,更多相关《SQL Server 中使用临时表和RowCount提高分页查询存储流程性能Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。
AS
BEGIN
SETNOCOUNTON;
IF(NOT@AreaNameISNULL) SET@AreaName='
%'
+@AreaName+'
IF(NOT@PathISNULL) SET@Path='
+@Path+'
IF(@PageSize>
0)
BEGIN
DECLARE@TotalPageint
Select@TotalPage=Count(Identifier)FROMAreaWhere
(@IdentifierISNULLorIdentifier=@Identifier)AND
(@ParentIdISNULLorParentId=@ParentId)AND
(@AreaLevelISNULLorAreaLevel=@AreaLevel)AND
(@ChildrenISNULLorChildren=@Children)AND
(@AreaNameISNULLorAreaNameLike@AreaName)AND
(@PathISNULLorPathLike@Path)AND
(@StatusISNULLorStatus=@Status)AND
(@AltISNULLorAlt=@Alt)
IF(@TotalPage%@PageSize=0)
BEGIN
SET@TotalPage=@TotalPage/@PageSize
END
ELSE
SET@TotalPage=Round(@TotalPage/@PageSize,0)+1
SelectTOP(@PageSize)Identifier,ParentId,AreaLevel,Children,AreaName,Path,Status,Alt,@TotalPageastotalPageFROMAreaWhere
IdentifierNOTIN(SelectTop(@PageSize*(@CurrentPage-1))IdentifierFROMAreaWhere
orderbyAreaNameasc)
AND
orderbyAreaNameasc
END
ELSE
SelectIdentifier,ParentId,AreaLevel,Children,AreaName,Path,Status,AltFROMAreaWhere
END
发觉每次查询都须要按条件查询依次Area表,性能太低,于是运用临时表将符合条件的记录取出来,然后针对临时表执行查询,代码修改如下:
AlterPROCEDURE[dbo].[AreaSelect]
--建立临时表
Select
Identifier,ParentId,AreaLevel,Children,AreaName,Path,Status,Alt
INTO#temp_Area
FROMAreaWhere
orderbyAreaNameasc
DECLARE@SumCountint
--取总数
Select@SumCount=Count(Identifier)FROM#temp_Area
IF(@SumCount%@PageSize=0)
SET@TotalPage=@SumCount/@PageSize
SET@TotalPage=Round(@SumCount/@PageSize,0)+1
SelectTOP(@PageSize)Identifier,ParentId,AreaLevel,Children,AreaName,
Path,Status,Alt,@TotalPageastotalPage,@SumCountasSumCount
FROM#temp_Area
Where
IdentifierNOTIN(SelectTop(@PageSize*(@CurrentPage-1))IdentifierFROM#temp_Area))
经过运用临时表的确提高性能,不过有发觉一个疑问,就是count(Identifier)的确很耗性能,于是又执行修改了
:
--建立中记录数
(@IdentifierISNULLorIdentifier=@Identifier)AND
--配置总记录数为刚操作的记录数
SET@SumCount=@@RowCount
FROM#temp_Area
DataGrid服务器端分页、排序的实现
先看一下效果。
美工不好,见笑。
呵呵。
SilverlightDataGrid本身是不带分页功能的,同时他的排序也是针对当前页面的内容进行排序的,而这两样功能在实际的项目中都是必须带的。
上网搜索了一下,好像目前还没有那篇文章介绍过如何实现这两个常用的功能,看样子只要自己动手了。
下面我们来一步一步实现这些功能。
(以下都以NorthWind数据库为演示)第一步,我们先实现分页。
要分页,首先要在WCF上加上一个分页获取数据的方法。
先上代码。
1 [OperationContract]
2 publicList<
Products>
GetProductsPaging(intstart,intlimit,stringsort,stringdir,outintTotalPage)
3 {
4 NorthWindLinqDataContextdb=newNorthWindLinqDataContext();
5 stringsql;
6 sql="
selectcount(*)ascfromProducts"
;
7 intTotalCount=db.ExecuteQuery<
int>
(sql).Single();
8 TotalPage=Convert.ToInt32(Math.Ceiling((double)TotalCount/(double)limit));
9 sql="
withaas(SELECT*,row_number()over(orderby{0})asrownumberFROMProducts)select*fromawhererownumberbetween{1}and{2}"
10 sql=string.Format(sql,sort+"
"
+dir,start,start+limit-1);
11 varquery=db.ExecuteQuery<
(sql);
12 returnquery.ToList();
13 }
14
代码比较简单,用了sql2005的分页方法,就不做解释了,至于这分页方法的效率怎么样不是本次学习的重点,先不管了。
数据库访问使用LinqToSQL做的,本来想用Linq实现分页功能的,但是忙活了半天,最终以失败告终,主要的问题是,我没办法在Linq中实现动态排序,网上也没有找到一个合适的方法,只能写n个ifelse进行排序,就像下面的代码:
1 varproducts=frompindb.Products
2 selectp;
3 if(dir=="
ProductName"
)
4 products=products.OrderBy(p=>
p.ProductName);
5 elseif(dir=="
ProductID"
6 products=products.OrderBy(p=>
p.ProductID);
7 .......
这样写的话,虽然功能能实现,但是实在是有点弱智。
要写上一大堆的代码,真的不如写sql呢。
最终,还是没有搞定这个问题,只好写sql语句了。
如果大家有什么好的办法能实现的话,请留言告诉我。
谢谢了!
ok,到此分页的基本功能搞定了,DataGrid已经可以获取分页的数据了。
但是,这个DataGrid和Web上的不一样,没有Pager,晕,只要手工写一个Pager控件了。
第二步,实现Pager。
动手之前,老办法。
先上网找现成的,呵呵,不错,这次终于有点结果了,网上不少这样的例子,在上找了一个Pager,先用着再说。
这个是地址
现在把代码整合起来,ok,已经可以正确的分页了。
哈哈。
接下来,我们来实现排序。
第三步,实现排序。
要排序,当然是要点击ColumnHeader了,在DataGrid中找ColumnHeader的点击事件,晕,没有。
不会吧,这个微软,怎么搞的啊,虽然Silverlight都2.0了,但是怎么看都还是像个半成品啊,这样常用的事件都没有。
半成品就半成品吧,继续手工实现吧。
又是老办法,上网找现成的,呵呵,两种方案,一种是把Header改成模板,然后里面放上Button,这样就可以实现了。
还有一种,有人提到了用DataGrid的HitTest方法。
呵呵,第一个有点费事,每个Header都要改,第二个看起来酷一点,所以我选择了第二种。
试验了一下,晕,HitTest怎么成了不可访问,受保护级别限制。
再查MSDN,呵呵,原来2.0里面该成了VisualTreeHelper.FindElementsInHostCoordinates
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL Server 中使用临时表和RowCount提高分页查询存储流程性能 使用 临时 RowCount 提高 分页 查询 存储 流程 性能
链接地址:https://www.bdocx.com/doc/16201290.html