SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 4)
(五)列表查询中的阈值限制
在之前版本的SharePoint 中,如果在查询的时候没有指定返回数目,那么SharePoint将会查找该列表中所有的条目,这可能会造成在SQL表中需要返回大量的条目,极大影响了数据库的I/O性能和网络负载,如果返回的条目数量超过一定范围之后,SQL Server会把整张数据表锁定。我们知道在SharePoint中,所有的列表条目信息都是存储在同一张SQL Server数据表中的,这也就意味着,一个设计的不好的列表查询,可能会导致整个SharePoint的其他应用都停止响应。
为了避免这些有缺陷的程序可能对网站其余功能的使用造成的影响,在SharePoint 2010中,引入了列表查询的阈值限制。在管理中心的“Web应用程序管理”—“常规设置”—“资源限制”设置中,我们可以看到如下的设置:

从设置中我们看到SharePoint对列表数据的查询返回可以进行如下一些设置:
1、数量限制
在默认情况下,SharePoint在返回列表条目的时候,会进行数量的限制。对于普通用户,一次返回列表条目不能超过5000个,对于有一定条件的管理员则不能超过20000个。这两个阈值可以在上述界面中进行设置,设置的范围是从2000到Int32.MaxValue。如果在查询中返回超过了这个阈值的条目,则程序会终止查询,并抛出一个类型为“SPQueryThrottledException”的异常,异常的信息为“不允许执行所尝试的操作,因为它已超过管理员规定的列表视图阈值。”,从而阻止用户可能对服务器性能造成严重影响的操作。
2、查阅项限制
SharePoint的查阅项虽然在页面中以及在程序中看起来都能够查看到所查阅条目相应字段的信息,但是查阅项在数据库中存储的时候,是只保存所查阅条目的ID值的。这也就意味着,在列表显示或者自定义的程序中,每获取一次查阅项,就要多付出一些额外的数据库操作时间。如果列表中包含很多查阅项,对服务器的性能同样可能造成影响。
因此,SharePoint 2010在列表条目返回的时候,对所返回的查阅项的数量也进行了限制,默认是6个查阅项。如果我们在SPView、SPQuery或SPSiteDataQuery的ViewFields属性中显式指定了超过该阈值的查阅项字段的时候,在查询返回后同样会抛出一个“SPQueryThrottledException”异常,异常信息为“查询无法完成,因为其包含的查找列数已超过管理员强制实施的查找列阈值。”;而如果没有指定ViewFields属性,当当返回的一个列表条目中超过指定个数的查阅项的时候,阈值个数之后查阅项字段会被抛弃掉,视为该字段不存在。
但需要特别注意,列表中的查阅项、人员和组以及工作流状态字段都会计入这个查阅项限制中,因为这些字段类型的本质都是从另外的列表中进行信息的引用。
3、大型查询时间
在某些时候,我们的确需要在服务器比较空闲的时候执行一些统计性的非常耗时的工作,其中可能会返回大量的数据结果,SharePoint 2010也为我们开放了这样一个选择:开启大型查询的每日时间段,指定在每天的固定几个小时中,可以在查询过程中不受上述阈值限制的影响。
4、使用对象模型替代
在一些特殊的应用中,我们可能确实需要在查询的时候,返回超过阈值限制的列表条目、或者超过查阅项限制的字段数目。SharePoint在查询相关的对象模型中,提供了一个属性,可以控制以何种方式来替代Web应用程序中的查询资源限制。
如果在资源限制设置中,开启了“允许对象模型替代”选项,那么我们可以通过SPQuery以及SPSiteDataQuery的QueryThrottleMode属性,来控制查询的时候使用什么样的规则进行阈值控制,该属性是一个枚举类型(SPQueryThrottleOption),包含的属性及其含义如下:
|
属性 |
规则 |
|
Default |
如果当前用户是本地管理员,则在查询返回结果的时候不受任何阈值限制。否则,数量限制和查阅项限制都回对查询造成影响。这个选择也是默认值。 |
|
Override |
如果当前用户是本地管理员,则在查询返回结果的时候不受任何阈值限制。如果当前用户在Web应用程序的策略中被指定为“完全读取”或“完全控制”(通常是作为审计用户及管理员),那么在查询返回结果的时候,会受到数量阈值的限制,但是不会受到查阅项阈值的限制。对于其他用户,两种限制都是生效的。 |
|
Strict |
不论当前用户是何种权限和角色,在查询返回结果的时候都要受到数量限制和查阅项限制。 |
通过这一设置,我们就可以在编写自定义程序的时候,根据不同角色的不同需要,灵活控制代码在执行查询时候的阈值限制,从而在满足需求的情况下尽可能少的对服务器上的其他应用造成性能上的影响。
SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 4)的更多相关文章
- SharePoint服务器端对象模型 之 使用CAML进展数据查询
SharePoint服务器端对象模型 之 使用CAML进行数据查询 一.概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列 ...
- SharePoint服务器端对象模型 之 使用CAML进行数据查询
(一)概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列表条目的集合. 除去列表上的查询之外,在SharePoint中还大 ...
- SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 2)
(三)使用SPQuery进行列表查询 1.概述 列表查询主要是指在一个指定的列表(或文档库)中按照某些筛选.排序条件进行查询.列表查询主要使用SPQuery对象,以及SPList的GetItems方法 ...
- SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 3)
(四)使用SPSiteDataQuery进行多列表查询 1.概述 前面介绍的列表查询有很多优势,但是它的一个缺点就是一次只能在一个列表中进行查询,在SharePoint中,提供了一个跨网站.跨列表查询 ...
- SharePoint 服务器端对象模型 之 使用LINQ进行数据访问操作(Part 2)
(四)使用LINQ进行列表查询 在生成实体类之后,就可以利用LINQ的强大查询能力进行SharePoint列表数据的查询了.在传统SharePoint对象模型编程中,需要首先获取网站对象,再进行其他操 ...
- SharePoint服务器端对象模型 之 使用LINQ进行数据访问操作(Part 4)
(六)高效合理的使用LINQ 1.DataContext中的两个属性 为了能够使用DataContext进行数据提交,在DataContext进行数据查询和操作的过程中,内部会进行数据状态的保持和追踪 ...
- SharePoint服务器端对象模型 完结
整个系列已完结,大概看了一眼,平均阅读量不到200.估计也没什么人看了,而且服务器端对象模型除了在某些企业开发中会用到,从2013时代开始其实已经不是SharePoint开发的最佳选择了.不过既然已经 ...
- 开启貌似已经过时很久的新坑:SharePoint服务器端对象模型
5年前(嗯,是5年前),SharePoint 2010刚发布的时候,曾经和kaneboy试图一起写一本关于SharePoint 2010开发的书,名字叫<SharePoint 2010 应用开发 ...
- SharePoint服务器端对象模型 之 序言
对于刚刚开始接触SharePoint的开发人员,即使之前有较为丰富的ASP.NET开发经验,在面对SharePoint时候可能也很难找到入手的方向.对于任何一种开发平台而言,学习开发的过程大致会包括: ...
随机推荐
- libevent2源码分析之五:关键的调用链
用一个调用链来表示函数调用的流程,看起来更直观.根据上面的分析,总结了一些重要的调用链. 初始化 event_base_new event_base_new_with_config min_heap_ ...
- Python 中实现装饰器时使用 @functools.wraps 的理由
Python 中使用装饰器对在运行期对函数进行一些外部功能的扩展.但是在使用过程中,由于装饰器的加入导致解释器认为函数本身发生了改变,在某些情况下——比如测试时——会导致一些问题.Python 通过 ...
- iOS活体人脸识别的Demo和一些思路
代码地址如下:http://www.demodashi.com/demo/12011.html 之前公司项目需要,研究了一下人脸识别和活体识别,并运用免费的讯飞人脸识别,在其基础上做了二次开发,添加了 ...
- 在Eclipse中导入dtd和xsd文件,使XML自动提示(转)
DTD 类型约束文件 1. Window->Preferences->XML->XML Catalog->User Specified Entries窗口中,选择Add 按纽 ...
- JanusGraph与Cassandra集成模式
//如果使用的是cassandra 2.2或更高版本,需要开启thift,以使janus连接到cassandra. ./bin/nodetool enablethrift. 15.1 Local Se ...
- unity, UGUI Text fadeIn
错误写法: Color color = m_text.GetComponent<Text> ().color; Color startColor = new Color (c ...
- Sring容器的懒加载lazy-init设置
默认情况下,spring的IOC容器中lazy-init是false的,即没有打开懒加载模式. 如果你没有看到这个lazy-init 的参数设置就说明是false啦. 那么什么是懒加载? 懒加载--- ...
- atitit.项目设计模式---ioc attilax总结v4 q11
atitit.项目设计模式---ioc attilax总结v4 q11 1. ioc的原理1 1.1. .IOC的之前1 1.2. ioc后的实现2 1.3. ioc的演化2 1.4. 依赖注入和控制 ...
- MII、GMII、RMII、SGMII、XGMII、XAUI、Interlaken
MII即媒体独立接口,也叫介质无关接口.它是IEEE-802.3定义的以太网行业标准.它包括一个数据接口,以及一个MAC和PHY之间的管理接口(图1).数据接口包括分别用于发送器和接收器的两条独立信道 ...
- C语言基础(13)-函数
一. 函数的原型和调用 在使用函数前必须定义或者声明函数. double circle(double r); int main() { ); printf("length = %f\n&qu ...