zoukankan      html  css  js  c++  java
  • SQL SERVER2008学习笔记

    理解SQL SERVER体系结构

    SQL SERVER数据存储体系结构

    SQL SERVER 把数据存储在磁盘上,但为了提高性能和完整性,它优化了磁盘结构的格式,磁盘上的数据是最近一次由内存刷新到磁盘上的状态.内存数据是最新的,数据修改一般是先在内存中进行,而不是直接写入到磁盘.

    .物理数据结构

    一个数据库至少有一个数据文件与事务日志文件.

    数据文件存储数据库的所有信息,包括数据值,索引和配置数据和可编程对象.事务日志文件提供一个对数据库所有修改的持久记录.SQL SERVER采用预写的修改过程,即所有的修改在写入数据库之前都必须先写进事务日志.这些日志使各种数据恢复和完整性功能得以实现.

    8k的块来组织,称为页面.8个页面又被组织为区.

    数据页面:数据页面存储所有的数据值,但不包含那些大值类型,如text,ntext,xml,varchar(max)

    索引页面:存储聚集索引条目和非聚集索引条目.

    大型对象页面:由于SQL SERVER数据行不能跨越页面,所以大型数据值必须通过指针放到其他地方,指向存放数据条目的大型数据页面.Varchar类似的类型会根据大小动态地在数据页面与大型对象页面转换.

    其他页面:GAM SGAM PFS等,存储页与区分配使用情况的页面.

    SGAM专门监控混合区,用一位来标识混合区是否还有空闲页面.

    1.    内存体系结构

    存储数据的内存组织结构,也叫数据缓存或缓冲缓存.类似于物理磁盘的组织结构,内存组织成8KB单元大小的缓冲池来存储数据页面.

    客户端工作站向SQL SERVER提交一个查询,首先解析优化查询,并编译成数据引擎可遵循的查询计划,尝试定位到内存缓冲区中的页,提取必须的数据值,然后以一个表格式数据流(TDS)返回给客户端,如果不在缓冲区中,则会产生一个I/O请求去磁盘读取一个页面到内存中.

    内存缓冲区有三种状态:空闲,可用与脏的.

    需要明白的是SQL SERVER 的IO,都是通过WINDOWS来执行的,所有的硬件也是通过windows来管理的,SQL SERVER 通过OS来处理,本身不直接管理.

    表分区

    1.   创建分区函数

    CREATE PARTITION FUNCTION DATEPARTITION(DATETIME)

    AS RANGE RIGHT

    FOR VALUES ('01/01/2007','01/01/2008')

    这个示例分了三个区,一个是2007/01/01之前的数据,不包含这一天.然后是2007/01/012008/01/01(不包含)之间的数据,然后是2008/01/01及其以后的数据.

    2.   创建分区方案

    CREATE PARTITION SCHEME dateScheme

    AS PARTITION DATEPARTITION

    TO ([FG1],[FG2],[PRIMARY])

    GO

    分区方案末端的文件组表示分区将放置在哪里.

    3.   创建分区表

    CREATE TABLE partitiontable

    (id INT NOT NULL IDENTITY(1,1),

    datevalue DATETIME NOT NULL)

    ON dateScheme(DATEVALUE)

    插入测试数据后并查看

    INSERT INTO  partitiontable (datevalue) VALUES('2006-6-6 12:00:00')

    INSERT INTO  partitiontable (datevalue) VALUES('2007-6-6 12:00:00')

    INSERT INTO  partitiontable (datevalue) VALUES('2008-6-6 12:00:00')

    查看:

    SELECT

    partition_id,

    PARTITION_number,

    ROWS

    FROM sys.partitions

    WHERE object_id=object_id('partitiontable')

    面向查询索引的索引策略

    表的存储 HOBT.根据是否有索引来决定.

    在堆中查询数据的基本方式是执行全表扫描,表是基于数据页存储的,因此表扫描就是对扫描存储该表的数据页,并从中提取所需的数据.这表明堆上进行数据查询的I/O开销应该与对应的数据页数基本相当.

    我们应该创建什么样的索引呢?创建查询优化器实际会使用的索引.创建能减少I/O的索引.

    相对于响应时间,优化器更关注于吞吐量,优化器使用静态的统计数据,必要时使用手动更新,UPDATE STATISTICS即可刷新需要的统计页.优化器需要结构良好的查询.SQL SERVER 对每个表只使用一个索引(有例外).

  • 相关阅读:
    MapReduce-文本输入
    MapReduce-输入分片与记录
    python 常用类库
    python leveldb 文档
    火狐插件推荐
    mweb test
    python代码风格规范
    UNICODE,GBK,UTF-8区别
    机器学习之K近邻算法(KNN)
    python中的StringIO模块——html
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/2134437.html
Copyright © 2011-2022 走看看