奕霖

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

   数据压缩:
   因为数据量很大,我们建立了表分区,但数据量并没有改变,I/O 限制查询范围并没有改变SQL 2008 提供了ROW and Page 压缩功能,可以对表数据或独立分区表进行压缩。
   Row压缩通过用可变长度存储格式存储所有固定长度的数据类型,ROW 压缩扩展了 vardecimal 存储格式。
   PAGE 压缩将给定页面上一行或多行的列数据冗余降至最小。它使用 LZ78 (Lempel-Ziv) 算法的专有实现方法,在页面上仅存储一次冗余数据,然后从多个列对其进行引用。请注意,在使用 PAGE 压缩时,实际也包括了 ROW 压缩。
   可针对表、索引或者分区表和索引的一个或多个分区启用 ROW 和 PAGE 压缩。
   因此,可极其灵活地选择要压缩的表、索引和分区,在空间节省和 CPU 影响之间取得巧妙的平衡。

   建表时使用:
   CREATE TABLE <mytable> (col1,col2...) WITH (DATA_COMPRESSION = ROW);
   CREATE TABLE PartitionedTable (col1,col2...)
   ON PS1 (col1)
   WITH (
   DATA_COMPRESSION = ROW ON PARTITIONS(1),
  DATA_COMPRESSION = PAGE ON PARTITION(2 TO 4));
   修改使用
   ALTER TABLE <mytable> REBUILD WITH (DATA COMPRESSION = PAGE);
   ALTER TABLE <mytable> REBUILD PARTITION = 1 WITH (DATA COMPRESSION = PAGE);
   索引使用:
  CREATE INDEX IX_mytable_Col1 ON <mytable> (Col1) WITH (DATA_COMPRESSION = ROW);
   ALTER INDEX IX_mytable_Col1 ON <mytable> REBUILD WITH (DATA_COMPRESSION = ROW);
 
   分区级锁升级:
   在 SQL Server 2005 中,并发访问其他分区中的数据可能导致将表锁定,从而影响对其他分区的访问。
为将该干扰降至最低,SQL Server 2008 引入了表级选项来控制分区级或表级的锁升级。默认情况下,启用表级的锁升级(如 SQL Server 2005)。
但,您可覆盖表的锁升级策略 Alter table <mytable> set (LOCK_ESCALATION = AUTO)
  
   已分区对象的并行查询执行策略:


   查询处理器对从已分区对象选择的查询使用查询执行策略。作为执行策略的一部分,查询处理器会确定查询所需的表分区,以及要分配给每个分区的线程比例。在大多数情况下,查询处理器会为每个分区分配数量相等或几乎相等的线程,然后在这些分区中并行地执行查询。以下几段更详细地介绍了线程分配情况。

如果线程数小于分区数,则查询处理器会将每个线程分配给一个不同的分区,最初会有一个或多个分区没有获得分配的线程。当线程完成在一个分区上的执行时,查询处理器会将它分配给下一个分区,直到每个分区都分配有一个线程。这是查询处理器将线程重新分配给其他分区的唯一情况。
如果线程数与分区数相等,则查询处理器会为每个分区分配一个线程。当线程完成时,不会重新分配给另一个分区。
如果线程数大于分区数,则查询处理器会为每个分区分配相等数量的线程。如果线程数并非恰好是分区数的倍数,则查询处理器会为某些分区额外分配一个线程,以使用所有可用线程。请注意,如果只有一个分区,则会将所有线程都分配给该分区。在下图中,有四个分区和 14 个线程。每个分区都分配有 3 个线程,两个分区具有一个额外的线程,总共分配了 14 个线程。当线程完成时,不会重新分配给另一个分区。
尽管以上示例指出了一种分配线程的简单方式,但实际策略要复杂一些,并需要考虑在查询执行过程中出现的其他变化因素。例如,如果表已分区,并在 A 列上有一个聚集索引,并且查询有谓词子句 WHERE A IN (13, 17, 25),则查询处理器将为这三个查找值(A=13、A=17 和 A=25))各分配一个或多个线程,而不是为每个表分区分配一个或多个线程。只需在包含这些值的分区中执行查询,并且如果所有这些查找谓词都恰好在同一个表分区中,则所有线程都将分配给同一个表分区。

为了举出另一个示例,假定表在 A 列上有四个分区(边界点为 (10, 20, 30)),在 B 列上有一个索引,并且查询有一个谓词子句 WHERE B IN (50, 100, 150)。因为表分区是基于值 A,所以值 B 可以出现在任何表分区中。这样,查询处理器将分别在四个表分区中查找三个 B 值 (50, 100, 150) 中的每一个值。查询处理器将按比例分配线程,以便它可以并行执行 12 个查询扫描中的每一个扫描。

posted on 2010-07-12 11:47  奕霖  阅读(214)  评论(0)    收藏  举报