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

sp_chgattribute

语法


sp_chgattribute <objname>,
	{"max_rows_per_page" | "fillfactor" | "reservepagegap" | 
	"exp_row_size" | "concurrency_opt_threshold" | 
	"optimistic_index_lock" | "identity_burn_max" | "plldegree"
	"ptn_locking" | "fact_min" | "fact_max" | "fact_unit" }, <value>, < optvalue>
    {"identity_gap", <set_number> | "recompile_factor",  0, <value> |
	"dealloc_first_txtpg", 0 | 1 | 2}
    ['<view_name>', 'materialize', 1 | 0]

参数

<objname>

是要更改其属性的表或索引的名称。

max_rows_per_page

指定行大小。对具有可变长度列的表使用此选项。

fillfactor

指定在运行 reorg rebuild 命令或 alter table 命令更改锁定方案而导致重新创建索引或复制表页时,服务器对每页的填充程度。fillfactor 百分比仅在重建索引时才有意义。有效值为 0 到 100。

reservepagegap

指定扩充 I/O 分配操作时填充页与留下的空白页的比率。对于每个指定的 ,都留出空白页以便在将来扩展表。有效值为 0 到 255。缺省值为 0。

recompile_factor

为行增长设置一个因子,当到达这一因子时,会触发服务器重新编译查询计划。例如,如果将 recompile_factor 设为 20,查询计划会重新编译每个为 20 的因子。也就是说,第一个重新编译在 20 行,下一个在 400 行,第三个在 8,000 行,再下一个在 160,000 行等。

exp_row_size

为仅数据锁定表中的行保留指定数量的空间。使用此选项可以减少转移的行数,更新期间转移行会耗用很多资源。有效值可以是 0、1 以及介于表的最小和最大行长度之间的任何值。0 表示应用全服务器范围的设置,1 表示完全填满数据页上的行。

concurrency_opt_threshold

指定表大小(以页为单位),对仅数据锁定表的访问应该从该大小值开始优化,以减小 I/O(而不是为了并发)。如果表小于 concurrency_opt_threshold 指定的页数,则通常使用可用的索引来为并发进行查询优化;如果表大于 concurrency_opt_threshold 指定的页数,则为 I/O 进行查询优化。有效值为 -1 到 32767。将该值设置为 0 将禁用并发优化。使用 -1 可以对大于 32767 页的表强制并发优化。缺省值为 15 页。

optimistic_index_lock

启用可消除索引根页中的争用的性能优化。如果由于索引拆分而必须更改根页,则会获取排它表。因此,optimistic_index_lock 适用于修改数较小的表。有效值包括 1 和 0,1 表示打开优化索引锁,0 表示关闭优化索引锁,0 是缺省值。

fact_min

与 fact_table 相结合使用表对象过滤带提示的事实表上的行数。只有事实表的行计数大于 fact_min(不包括边界点)的值,才可以在抽象计划子句中使用 fact_min 来配置要应用的事实表提示。如果值小于 fact_min,则故障的原因以 FACTTBL_REASON_SMALLTBL 的形式返回。缺省值为 1。通过 fact_unit 指定的因子对 fact_min 的值进行扩充。

fact_max

与 fact_table 相结合使用表对象过滤带提示的事实表上的行数。只有事实表的行计数小于 fact_max(不包括边界点)的值,才可以在抽象计划子句中使用 fact_max 来配置要应用的事实表提示。如果值大于 fact_max,则故障的原因以 FACTTBL_REASON_HUGETBL 的形式返回。缺省值为 1000000。通过 fact_unit 指定的因子对 fact_max 的值进行扩充。

fact_unit

fact_unit 用作 fact_min 和 fact_max 的缩放因子。通过将 fact_unit 的值设为 -1,fact_unit 也可用于强制拒绝 fact_table 提示。拒绝的原因以 FACTTBL_REASON_FORCEDREJECT 形式返回。缺省值为 1000。

identity_burn_max

允许对 identity 列的内部计数器进行重置。所设置的值表示已生成的最大值;下一个自动生成的值比您指定的值大 1。该值在第四个参数中作为 varchar 数据类型被传递。

identity_gap

表示要更改标识间距。

<value>

是您在 sp_chgattribute 中指定的各个选项的数字输入值。

<optvalue>

是新值。有效值和缺省值取决于指定的参数。只有 identity_burn_max 参数使用此参数。对于其它参数,此值为 NULL。

<set_number>

是标识间距的新大小。

dealloc_first_txtpg

将文本或图像列更新为 null。释放以前引用的 text 或 image 页之后,将对应的文本指针设置为 null。这样将会减少对空 text/images 列的空间分配。有效值包括:

  • 0 缺省现有值,如果表选项设置为 1,或者数据库选项 deallocate first text page 为 TRUE,则将在 NULL 更新后释放第一个文本页;否则,将不释放第一文本页。

  • 1 在 NULL 更新后释放第一文本页(覆盖数据库选项 deallocate first text page 的设置)。

  • 2 在 NULL 更新后不释放第一文本页(覆盖数据库选项 deallocate first text page 的设置)。

    在 NULL 更新后是否释放第一文本页取决于该表和数据库选项 deallocate first text page 的组合。

     
    DB setting (deallocate first text page)   |   0   1   2
    --------------------------------------------------------- 
    dealloc_first_txtp - true                 |   Y   Y   N 
    dealloc_first_txtp - false                |   N   N   N 
    

  • Y 在 null 更新后释放第一文本页

  • N 在 null 更新后不释放第一文本页

    sp_help 的输出指示是否释放第一文本页。

    plldegree

    指定查询优化程序可以使用的最大线程数。

    ptn_locking

    指定是否在分区级启用(1)或禁用(0)锁定。缺省情况下,分区锁定处于禁用状态。

    '<view_name>', 'materialize', 1 | 0]

    启用或禁用强制实例化视图。其中:

  • <view_name> 是启用或禁用强制实现的视图的名称。

  • materialize 表示正在启用或禁用强制实现。

  • 0 | 1 值 0 禁用强制视图实现;值 1 强制视图实现。

    示例

    示例 1

    为 authors 表将 max_rows_per_page 设置为 1,以用于以后的所有空间分配:

    
    sp_chgattribute authors, "max_rows_per_page", 1
    

    示例 2

    为 titleidind 索引将 max_rows_per_page 设置为 4,以用于以后的所有空间分配:

    
    sp_chgattribute "titles.titleidind", "max_rows_per_page", 4
    

    示例 3

    为 title_ix 中的页将 fillfactor 指定为 90%:

    
    sp_chgattribute "titles.title_ix", "fillfactor", 90
    

    示例 4

    为 authors 表将 exp_row_size 设置为 120,以用于以后的所有空间分配:

    
    sp_chgattribute "authors", "exp_row_size", 120
    

    示例 5

    为 titleidind 索引将 reservepagegap 设置为 16,以用于以后的所有空间分配:

    
    sp_chgattribute "titles.titleidind", "reservepagegap", 16
    

    示例 6

    关闭 titles 表的并发优化:

    
    sp_chgattribute "titles", "concurrency_opt_threshold", 0
    

    示例 7

    将 mytable 的标识间距设置为 20:

    
    sp_chgattribute "mytable", "identity_gap", 20
    

    示例 8

    更改 mytable 以使用 identity burning set factor 设置而不是 identity_gap 设置:

    
    sp_chgattribute "mytable", "identity_gap", 0
    

    示例 9

    将 sp_chgattribute 的值设置为 1,打开优化索引锁定功能。

    
    sp_chgattribute "mytable", "optimistic_index_lock", 1
    

    示例 10

    将 sp_chgattribute 的值设置为 0,关闭优化索引锁定功能。

    
    sp_chgattribute "mytable", "optimistic_index_lock", 0
    

    示例 11

    使用 dealloc_first_txtpg 打开文本和图像空间的释放:

    
    sp_chgattribute "mytable", "dealloc_first_txtpg", 1
    

    若要关闭此功能:

    
    sp_chgattribute "mytable", "dealloc_first_txtpg", 0
    

    示例 12

    sp_help 的输出指示是否释放第一文本页:

    
    > sp_chgattribute  mytab, "dealloc_first_txtpg", 1   
    'dealloc_first_txtpg' attribute of object 'mytab' changed to 1.   
    (return status = 0)   
    1>   
    2> sp_help mytab  
     Name Owner Object_type     Object_status            Create_date
    ----- ----- ----------- -------------------------- -------------------
    mytab  dbo  user table  deallocate first text page  Jan 22 2013 9:45PM 
      
    > sp_chgattribute  mytab, "dealloc_first_txtpg", 2   
    'dealloc_first_txtpg' attribute of object 'mytab' changed to 2.   
    (return status = 0)   
    1>   
    2> sp_help mytab  
      Name Owner Object_type     Object_status         Create_date
    ----- ----- ------------- -------------------- --------------------
    mytab  dbo   user table   keep first text page  Jan 22 2013  9:45PM 
    

    示例 13

    将 authors 表的 identity_burn_max 值更改为 5:

    
    sp_chgattribute "authors", "identity_burn_max", 0, "5"
    

    示例 14

    指示查询优化程序最多使用 4 个线程:

    
    sp_chgattribute my_table, "plldegree", 4
    

    如果查询优化程序未找到足够的资源,可选择使用较少的线程(即少于 4 个)。此机制同样适用于索引。例如,以下示例使用 authors 上名为 auth_ind 的索引以使用两个线程对它进行访问:

    
    sp_chgattribute "authors.auth_ind", "plldegree", 4
    

    必须从当前数据库中运行 sp_chgatttribute。

    示例 15

    为 authors 表启用分区级锁定:

    
    sp_chgattribute authors, "ptn_locking", 1
    

    若要禁用分区级锁定:

    
    sp_chgattribute authors, "ptn_locking", 0
    

    示例 16

    为成功应用 fact_table 提示,需要满足 fact_min 和 fact_max 两者的条件。

    有了这些值,fact_table 提示将取决于以下表中的行计数:

    
    sp_chgattribute myTable, fact_min, 100
    sp_chgattribute myTable, fact_max, 4000
    sp_chgattribute myTable, fact_unit, 500
    

    表行计数 fact_table 提示
    row_count <= 100 * 500 不应用(原因:FACTTBL_REASON_SMALLTBL)
    100 * 500 < row_count < 4000 * 500 应用
    row_count <= 4000 * 500 不应用(原因:FACTTBL_REASON_HUGETBL)

    示例 17

    将 fact_unit 设置为 -1 以强制拒绝 fact_table 提示。

    
    sp_chgattribute myTable, fact_unit, -1  
    

    以 FACTTBL_REASON_FORCEDREJECT 形式拒绝 fact_table 提示。

    示例 18

    为视图big_important_view 启用强制视图实现。

    
    sp_chgattribute 'big_important_view', 'materialize', 1
    

    用法

    使用 sp_chgattribute 时,还存在一些其它注意事项:

  • 不能更改虚拟散列表的属性。例如,如果试图按照如下方式更改表 order_line(它是虚拟散列表)的属性:

    
    sp_chgattribute 'order_line', 'exp_row_size', 1
    

    SAP ASE 服务器将发出类似以下内容的错误消息:

    
    sp_chgattribute is not allowed for order_line, as it is a virtually hashed table.
    

  • (仅限于 Cluster Edition)不可在运行期间使用 sp_chgattribute 更改 <identity_gap> 的值。

  • sp_chgattribute 更改 max_rows_per_page、fillfactor、reservepagegap、exp_row_size 或 dealloc_first_txtpg 的值,以用于以后对表或索引进行空间分配或数据修改。它不影响现有数据页的空间分配。您只能为当前数据库中的对象更改这些值。

  • 使用 sp_help 查看表的存储空间管理值。使用 sp_helpindex 查看索引的存储空间管理值。

  • 将max_rows_per_page 设置为 0 通知 SAP ASE 服务器填充数据或索引页且不限制行数 – SAP ASE 服务器在未设置 max_rows_per_page 时的缺省行为。

  • 将 sysobjects 中存储的 identity_burn_max 值和当前标识值设置为新值。

  • 如果表为:

    a 非空 – 则 identity_burn_max 的新值必须大于或等于 identity 列的当前最大值。

    b 空 – 则可将该值设置为有效范围内的任意正值。

  • max_rows_per 页值较小会导致页面拆分。当需要在页中添加新的数据或索引行,但页中没有足够的空间用于新行时,就会发生页面拆分。通常,现有页上的数据会相当平均地在新分配的页和现有页之间拆分。

    若要大概算出非聚簇索引的最大值,可将页大小减去 32,然后将所得的值除以索引键大小。以下语句计算非聚簇索引 titleind 的 max_rows_per_page 的最大值:

    
    select
        (select @@pagesize - 32) / minlen 
        from sysindexes where name = "titleind"
    
    -----------
            288
    

  • 如果为 max_rows_per_page、fillfactor、reservepagegap 或 exp_row_size 指定了不正确的值,则 sp_chgattribute 将返回一条错误消息,其中指定了有效值。

  • 不能在事务中运行此存储过程。

  • 只有具有 sa_role 特权的用户才能执行此存储过程。

  • 不能为具有数据页或数据行锁定方案的表设置优化索引锁定。

  • 不能为系统数据库(例如 master 或 tempdb)中的表设置优化索引锁定选项。只能在用户定义的表上设置该选项。

  • 即使在执行 NULL 更新时,也会为 text 和 image 页分配空间。可以使用 dealloc_first_txtpg 从表中删除这些空的文本页。

    对列进行新的更新会导致重新分配 text 或 image 页。