您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

sp_add_resource_limit

说明

创建 SAP ASE 登录名或/和应用程序(或两者)执行查询、查询批处理或事务时可以使用的服务器资源的数目限制。

语法


sp_add_resource_limit <name>, <appname>, <rangename>, <limittype>, <limitvalue> 
[, <enforced>[, <action>[, <scope> ]]]

参数

name

是对其应用限制的 SAP ASE 登录名。必须指定 ,或指定两者。若要创建应用于特定应用程序所有用户的限制,请将 指定为 NULL。

appname

是对其应用限制的应用程序名称。必须指定 ,或指定两者。若要创建应用于 SAP ASE 登录名使用的所有应用程序的限制,请指定 为 null。若要创建应用于特定应用程序的限制,请指定客户端程序在登录包中传递给 SAP ASE 服务器的应用程序的名称。

rangename

是强制执行限制的时间范围。该时间范围在您创建限制时必须存在于 master 数据库的 systimeranges 系统表中。

limittype

是要限制的资源的类型。此参数必须是下列项之一:

  • row_count – 限制一个查询可以返回的行数。

  • elapsed_time – 限制查询批处理或事务可以运行的秒数(按挂钟时间计算)。

  • io_cost – 限制处理查询的实际开销或优化程序的开销估计。

  • tempdb_space – 限制 tempdb 数据库在单个会话期间可以具有的页数。

  • lock_count – 限制用户进程同时持有的逻辑锁的数量。

  • idle_time – 连接释放前,可处于空闲状态的秒数。

    limitvalue

    是在 SAP ASE 服务器强制执行限制之前登录名或应用程序可以使用的服务器资源(I/O 开销、以秒计算的经历时间、行计数或 tempdb 空间)的最大量。这必须是一个小于或等于 231 的非零正整数。下表列出了应为每种限制类型指定的值:

  • row_count – 在强制执行限制前查询可以返回的最大行数。

  • elapsed_time – 在强制执行限制前查询批处理或事务可以运行的秒数(按挂钟时间计算)。

  • io_cost – 一个通过优化程序的开销计算公式得出的无单位的数字。

  • tempdb_space – 每个会话在 tempdb 中使用的页数。

  • lock_count – 限制用户进程同时持有的逻辑锁的数量。

    enforced

    确定是在执行查询前还是执行查询时强制应用限制。下表列出了每种限制类型的有效值:

    enforced 代码 说明 限制类型
    1 当执行的估计 I/O 开销超过了指定的限制时执行操作。 io_cost
    2 当执行的实际行计数、经历时间或 I/O 开销超过了指定的限制时执行操作。 row_count
    elapsed_time
    io_cost
    lock_count
    3 当估计开销或实际开销超过指定的限制时执行操作。 io_cost

    如果指定 值为 3,则 SAP ASE 服务器执行 1 和 2 的逻辑“或”操作。例如,假定将 设置为 3。如果运行查询的 io_cost 超过了估计的开销,则将执行指定的 。如果查询在为估计开销指定的限制内但超过了实际开销,则也将执行指定的

    如果未指定 值,则 SAP ASE 服务器对 row_count 和 elapsed_time 强制执行限制 2,对 io_cost 强制执行限制 3。换句话说,如果限制类型是 io_cost,则不管查询超过了估计开销还是实际开销都会执行指定的操作。

    action

    是在超出限制时采取的操作。以下操作代码对所有限制类型都有效:

  • 1 – 发出警告

  • 2 – 中止查询批处理(不受 lock_limit 的支持)

  • 3 – 中止事务

  • 4 – 取消会话

    如果未指定 值,则 SAP ASE 服务器使用缺省值 2(中止查询批处理)。

    scope

    是限制的作用域。指定以下适用于限制类型的代码之一:

  • 1 –查询

  • 2 –查询批处理(由客户端发送给服务器的一个或多个 SQL 语句)

  • 4 –事务

  • 6 –查询批处理和事务

  • 8 – 话范围(idle_time 始终为 8)

    如果未指定 值,则限制适用于限制类型所有可能的作用域。

    示例

    示例 1

    创建在 early_morning 时间范围内应用于 payroll 应用程序所有用户的资源限制。如果查询批处理的执行时间超过 120 秒,则 SAP ASE 服务器将发出警告:

    
    sp_add_resource_limit NULL, payroll, early_morning, elapsed_time, 120, 2, 1, 2
    

    示例 2

    创建在 midday 时间范围内应用于由“joe_user”运行的所有即席查询和应用程序的资源限制。当查询返回的行数超过 5000 行时,SAP ASE 服务器中止事务:

    
    sp_add_resource_limit joe_user, NULL, midday, row_count, 5000, 2, 3, 1
    

    示例 3

    创建在 midday 时间范围内应用于由“joe_user”运行的所有即席查询和应用程序的资源限制。当优化程序估计 I/O 开销将超过 650 时,SAP ASE 服务器中止事务:

    
    sp_add_resource_limit joe_user, NULL, midday, io_cost, 650, 1, 3, 1
    

    示例 4

    将 joe_user 能够在一个会话中同时打开的锁数设置为 10000:

    
    sp_add_resource_limit "joe_user", NULL, "at all times", "lock_count", 10000
    

    示例 5

    在为用户 sa 和应用程序 isql 释放查询之前,将空闲时间的长度设置为 10 秒;at all times 表示时间范围包含一天中的所有小时,2 表示在执行时间之前强制使用限制,4 表示在超过 10 秒时执行操作,8 表示限制范围针对此会话:

    
    sp_add_resource_limit sa, isql, 'at all times', idle_time, 10, 2, 4, 8 
    

    用法

    有关使用 sp_add_resource_limit 的其它注意事项。

    您必须启用sp_configure "allow resource limits" 以使资源限制生效。

    给定的用户、应用程序、限制类型、作用域和强制时间可以存在多个资源限制,但前提是这些资源限制的时间范围不重叠。

    对登录名和/或应用程序名的当前活动的指定时间范围和“at all times”范围的所有限制都会在登录时绑定到用户的会话。因此,如果用户独立于给定的应用程序登录到 SAP ASE 服务器,则不适用同时限制用户与该应用程序的资源限制。若要确保对该用户的限制,请创建一个特定于该用户并独立于任何应用程序的资源限制。

    由于确定资源限制要使用用户登录名或应用程序名(或者使用两者),因此 SAP ASE 服务器在扫描 sysresourcelimits 表以搜索适用于登录会话的限制时,遵守预定义的搜索优先顺序。下表说明了匹配的有序登录名和应用程序名对的优先级:

    级别 登录名 应用程序名

    |1|“joe_user”|payroll

    2 NULL payroll

    如果在给定的优先级别中发现了一个或多个匹配项,则不会搜索其它级别。这样可防止用于不同登录/应用程序组合的类似限制之间出现冲突。

    如果在所有级别都没有发现匹配项,则不对会话进行限制。

  • 当添加、删除或修改资源限制时,SAP ASE 服务器在该登录和/或应用程序每个会话下一个查询批处理开始时重新绑定该会话的限制。

  • 当更改当前活动的时间范围时,SAP ASE 服务器重新绑定该会话的限制。此重新绑定发生在下一个查询批处理开始时。

  • 您不能将特定登录、应用程序或登录/应用程序组合的限制与重叠的指定时间范围关联(共享相同时间范围的限制除外)。

    例如,如果限制某个用户在上午 9:00 到下午 1:00 间检索 50 行,则不能对同一个用户创建另一个限制他在上午 10:00 到中午 12:00 间检索 100 行的资源限制。但是您可以创建一个资源层次,例如指定用户 在上午 10:00 到中午 12:00 间检索 100 行的限制,并指定应用程序(如 isql)在上午 9:00 到下午 1:00 间检索 50 行的限制。

  • 设置 lock_count 值需要您将 enable monitoring 配置参数设置为 1:sp_configure 'enable monitoring', 1

  • lock_count 不支持 abort_batch 操作。

  • lock_count 限制不被子线程继承,并且不适用于 DTM 环境。

    注意

    虽然在当前事务达到其时间限制时 SAP ASE 服务器会终止该事务,但在您发出另一个 SQL 命令或批处理之前,不会收到 11005 错误消息;换句话说,只有当您再次尝试使用该连接时才显示该消息。