(五)列表查询中的阈值限制

在之前版本的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)的更多相关文章

  1. SharePoint服务器端对象模型 之 使用CAML进展数据查询

    SharePoint服务器端对象模型 之 使用CAML进行数据查询 一.概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列 ...

  2. SharePoint服务器端对象模型 之 使用CAML进行数据查询

    (一)概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列表条目的集合. 除去列表上的查询之外,在SharePoint中还大 ...

  3. SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 2)

    (三)使用SPQuery进行列表查询 1.概述 列表查询主要是指在一个指定的列表(或文档库)中按照某些筛选.排序条件进行查询.列表查询主要使用SPQuery对象,以及SPList的GetItems方法 ...

  4. SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 3)

    (四)使用SPSiteDataQuery进行多列表查询 1.概述 前面介绍的列表查询有很多优势,但是它的一个缺点就是一次只能在一个列表中进行查询,在SharePoint中,提供了一个跨网站.跨列表查询 ...

  5. SharePoint 服务器端对象模型 之 使用LINQ进行数据访问操作(Part 2)

    (四)使用LINQ进行列表查询 在生成实体类之后,就可以利用LINQ的强大查询能力进行SharePoint列表数据的查询了.在传统SharePoint对象模型编程中,需要首先获取网站对象,再进行其他操 ...

  6. SharePoint服务器端对象模型 之 使用LINQ进行数据访问操作(Part 4)

    (六)高效合理的使用LINQ 1.DataContext中的两个属性 为了能够使用DataContext进行数据提交,在DataContext进行数据查询和操作的过程中,内部会进行数据状态的保持和追踪 ...

  7. SharePoint服务器端对象模型 完结

    整个系列已完结,大概看了一眼,平均阅读量不到200.估计也没什么人看了,而且服务器端对象模型除了在某些企业开发中会用到,从2013时代开始其实已经不是SharePoint开发的最佳选择了.不过既然已经 ...

  8. 开启貌似已经过时很久的新坑:SharePoint服务器端对象模型

    5年前(嗯,是5年前),SharePoint 2010刚发布的时候,曾经和kaneboy试图一起写一本关于SharePoint 2010开发的书,名字叫<SharePoint 2010 应用开发 ...

  9. SharePoint服务器端对象模型 之 序言

    对于刚刚开始接触SharePoint的开发人员,即使之前有较为丰富的ASP.NET开发经验,在面对SharePoint时候可能也很难找到入手的方向.对于任何一种开发平台而言,学习开发的过程大致会包括: ...

随机推荐

  1. B2:观察者模式 Observer

    定义了一种一对多的依赖关系,多个观察者对象同时监听某一主题的变化,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们可以更新自己. 应用场景:某个实例的变化影响到了其他对象. UML: 示例代 ...

  2. Django——模版Template报错

    >>> from django.template import Template >>> t = Template("My name is {{ my_n ...

  3. mui.fire() 和 mui.trigger()

    导读:添加自定义事件监听操作和标准js事件监听类似,可直接通过window对象添加,通过mui.fire()方法可触发目标窗口的自定义事件 监听自定义事件 添加自定义事件监听操作和标准js事件监听类似 ...

  4. 响应式设计工具网站mydevice.io

    1.网址 https://mydevice.io/ 2.使用 在mydevice.io上有常见智能手机,PC电脑的尺寸.

  5. Nginx开发从入门到精通 nginx平台初探

    初探nginx架构(100%) 众所周知,nginx性能高,而nginx的高性能与其架构是分不开的.那么nginx究竟是怎么样的呢?这一节我们先来初识一下nginx框架吧. nginx在启动后,在un ...

  6. Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package

    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package 1. 统计的lib jar 列表1 2. Code3 3. 常用包名按找字母排序(2000个)4 ...

  7. 免费开源C# 论坛

    http://stackoverflow.com/questions/255591/who-knows-a-good-free-open-source-forum-in-c 1. http://yet ...

  8. 红茶一杯话Binder (传输机制篇_中)

    红茶一杯话Binder (传输机制篇_中) 侯 亮 1 谈谈底层IPC机制吧 在上一篇文章的最后,我们说到BpBinder将数据发到了Binder驱动.然而在驱动层,这部分数据又是如何传递到BBind ...

  9. 181. Flip Bits【easy】

    181. Flip Bits[easy] Determine the number of bits required to flip if you want to convert integer n  ...

  10. .net站内搜索

    蜘蛛,spider 爬网站.爬网站的过程:1.发现网站.百度把csdn当成关键网站,顺着已知的网站链接找到新的网站或者新的页面.SEO(搜索引擎优化)的第一个手段:建外链(外部链接).新网站吸引蜘蛛. ...