设为首页 收藏本站
查看: 605|回复: 0

[经验分享] 巧用SQL Server(Ranking)实现view的排序功能

[复制链接]

尚未签到

发表于 2016-11-3 09:24:28 | 显示全部楼层 |阅读模式
http://blogs.msdn.com/b/apgcdsd/archive/2011/06/07/sql-server-ranking-view.aspx
微软亚太区数据库技术支持组官方博客 英文博客
微软亚太区数据库技术支持组 官方博客



Search this blog  Search all blogs
最热 微软中文博客Live Now on Server & Tools Blogs Feed
免费获得Windows Server 2012专家培训,就在本月!
在几分钟内轻松地将您的LightSwitch应用程序部署到Azure网站
如何从C#桌面应用程序中调用Windows 8的WinRT API- WinRT 图表
Subscribe
Comments
Contact
Menu
Blog Home
Atom
翻译此页

Microsoft® Translator
Tags
linked server Oracle SQL Server transaction replication 内存 命令管道 性能优化 数据库引擎 死锁 游标 证书 连接
More ▼
Archives
April 2014 (2)
February 2014 (1)
October 2013 (4)
September 2013 (1)
August 2013 (1)
More ▼
巧用SQL Server(Ranking)实现view的排序功能

APGC DSD Team 6 Jun 2011 8:28 PM 0
首先,让我们来做一个简单的实验

Create view test_view

As

Select top 100 percent * from table order by ID



Create view test_view1

As

Select top 99  percent * from table order by ID



测试部分:

a. select * from test_view where id in (9,20)  

b. select * from test_view1 where id in (9,20)

其中table是一个超过10000行数据的表格,其中在ID栏上已建有索引。

通过如下语句select count(distinct id) from table,返回值为9000,这个结果说明index选择性很好。

结果发现,



测试语句a:

在SQL Server 2000环境下使用索引做查找并返回排序后的结果;

而在SQL Server 2008中不进行排序,但仍然使用索引进行查找、



测试语句b:

SQL 2000 和SQL2008始终使用全表扫描,返回排序后的结果,即使它只有2行返回值。



我们先解释语句a在2000和2008上得到不同结果的原因。在SQL Server 2008中,优化器的算法做了一些修改,如果发现top 100%的情况出现,我们会自动忽略top + Order by,因为top 100%本来就是返回全表数据。在2000上是没有这个智能优化的,所以2000会严格按照语法的格式和先后顺序执行。



我们知道,在view中是没有办法使用order by子句的,除非我们加上top 关键字。但是现在top 100%又会被自动忽略,那么,如果在SQL Server2008中希望得到view排序的结果,应该怎么做呢?

这里可以分享一篇文章,关于在SQL Server2005和SQL Server2008环境下对视图强制排序

http://support.microsoft.com/default.aspx?scid=kb;en-us;926292&sd=rss&spid=2855



解决方法就是 用top 99%。

但是同时带来另一个问题,它将执行如Select top 99  percent * from table order by ID的执行计划。也就是说,SQL Server会在视图中使用的表上做全表扫描。

我们能不能找到一种高性能的得到有序返回集的方法呢?

排序参数(Ranking)虽然不是为此而设计,却能有效的解决这一问题

使用方法实例如:

Create view test_view2

SELECT *       ,

       RANK() OVER (PARTITION BY id  ORDER BY other_column) AS RANKing

FROM table



这个写法的意思是按照ID做partition,那么自然就会按照ID做排序。

Select * from test_view2 where id in (9,20)

如此,建立的视图和查找的命令都可以使用ID栏上的索引,并依据ID对结果集排序。美中不足是,这种排序只能是基于ASC的排序。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-294993-1-1.html 上篇帖子: 走进SQL Server 2005:备份与恢复功能 下篇帖子: SQL Server開啟AWE使用大容量內存
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表