[MSSQL] 1. 规划数据库

 

数据库基础知识

 

Xcopy 部署是一项功能,用于将应用程序和数据库 (.mdf) 文件复制到另一台计算机或同一台计算机中其他位置,而无需其他配置


Xcopy 部署的工作原理是什么?
当应用程序首次建立连接时,SQL Server Express 可以自动将 .mdf 文件附加到正在运行的 SQL Server Express 实例上。当用户关闭或退出应用程序时,SQL Server Express 便将 .mdf

文件从实例上分离出来。使用该功能可完全移植 .mdf 文件:您可以复制和移动文件,并可在同一实例中同时运行文件的多个副本。


3.数据库基础知识

1)数据库
表上的控制:  约束、触发器、默认值和自定义用户数据类型


不能在 master 数据库中创建任何用户对象(例如表、视图、存储过程或触发器)。master 数据库包含 SQL Server 实例使用的系统级信息(例如登录信息和配置选项设置)。


*数据库快照   数据库(源数据库)的只读、静态视图。  (就类似操作系统还原)

 

2)了解数据库

系统数据库: master 数据库  记录 SQL Server 实例的所有系统级信息。


msdb 数据库
用于 SQL Server 代理计划警报和作业。
 
model 数据库
用作 SQL Server 实例上创建的所有数据库的模板。对 model 数据库进行的修改(如数据库大小、排序规则、恢复模式和其他数据库选项)将应用于以后创建的所有数据库。

Resource 数据库
一个只读数据库,包含 SQL Server 2005 包括的系统对象。系统对象在物理上保留在 Resource 数据库中,但在逻辑上显示在每个数据库的 sys 架构中。


tempdb 数据库
一个工作空间,用于保存临时对象或中间结果集。

 

 

 

 

 

 

数据库文件

1).mdf  主要数据文件 ;就1个。包含数据库的启动信息

2).ndf   次要数据文件;可多个,由用户定义并存储用户数据。通过将每个文件放在不同的磁盘驱动器上,次要文件可用于将数据分散到多个磁盘上。

3).ldf  事务日志;  保存用于恢复数据库的日志信息。每个数据库必须至少有一个日志文件。事务日志的建议文件扩展名是 .ldf。

 

事务日志支持的操作

 

  1. 恢复个别的事务。      ROLLBACK 语句
  2. 在 SQL Server 启动时恢复所有未完成的事务。
  3. 将还原的数据库、文件、文件组或页前滚至故障点。
  4. 支持事务复制
  5. 支持备份服务器解决方案。

 

另:日志传送,数据库镜像

 

 

 

 

 

索引基础知识(索引是按 B 树结构进行组织的)

索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行。

 

聚餐索引:一个表或一个视图只能有1个;因为一个表默认只能按照1个字段排序。     (聚集表) 

               如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。

非聚簇索引:独立于数据行的存储结构,每个键值存放的是指向该数据行的指针

               从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位器是聚集索引键。

 

 

聚集索引和非聚集索引都可以是唯一的。这意味着任何两行都不能有相同的索引键值。另外,索引也可以不是唯一的,即多行可以共享同一键值。

每当修改了表数据后,都会自动维护表或视图的索引。

 

 

当表建立了 主键primary key 或者唯一键 unique key,则数据库引擎自动对该列创建 聚簇索引。

 

 

查询优化器如何使用索引

设计比较好的可以减少I/O操作。

SQL 查询分析器 中 显示查询执行的计划,引擎会根据实际情况选择实际的 查询。可以显示详细的 cpu占用评估等。

查询优化器评估可用于检索数据的每个方法,然后选择最有效的方法。可能采用的方法包括扫描表扫描一个或多个索引(如果有)。

 

1)扫描表时,查询优化器读取表中的所有行,并提取满足查询条件的行。扫描表会有许多磁盘 I/O 操作,并占用大量资源。但是,如果查询的结果集是占表中较高百分比的行,扫描表会是最为有效的方法。

2)

查询优化器使用索引时,搜索索引键列,查找到查询所需行的存储位置,然后从该位置提取匹配行。通常,搜索索引比搜索表要快很多,因为索引与表不同,一般每行包含的列非常少,且行遵循排序顺序。

 

 

 

 

 

聚集索引结构 和聚簇索引设计指南

 

聚簇索引默认单个分区,如果多个分区,就有多个B树,因为一个分区一个B树。

 

 

对于某个聚集索引,sys.system_internals_allocation_units 中的 root_page 列指向该聚集索引某个特定分区的顶部。SQL Server 将在索引中向下移动以查找与某个聚集索引键对应的行。为了查找键的范围,SQL Server 将在索引中移动以查找该范围的起始键值,然后用向前或向后指针在数据页中进行扫描。为了查找数据页链的首页,SQL Server 将从索引的根节点沿最左边的指针进行扫描。

下图显式了聚集索引单个分区中的结构。

 image

 

  总结:索引都包含键值和指向存储位置的行定位器

 

非聚簇索引结构和非聚簇索引设计指南

 

12.10            

 

非聚集索引包含索引键值和指向表数据存储位置的行定位器

可以对表或索引视图创建多个非聚集索引。通常,设计非聚集索引是为改善经常使用的、没有建立聚集索引的查询的性能。

与使用书中索引的方式相似,查询优化器在搜索数据值时,先搜索非聚集索引以找到数据值在表中的位置,然后直接从该位置检索数据。这使非聚集索引成为完全匹配查询的最佳选择,因为索引包含说明查询所搜索的数据值在表中的精确位置的项。例如,为了从 HumanResources.Employee 表中查询向特定经理报告的所有雇员,查询优化器可能使用非聚集索引 IX_Employee_ManagerID;它以 ManagerID 作为其键列。查询优化器能快速找出索引中与指定 ManagerID 匹配的所有项。每个索引项都指向表或聚集索引中准确的页和行,其中可以找到相应的数据。在查询优化器在索引中找到所有项之后,它可以直接转到准确的页和行进行数据检索。

 

 

ps:索引维护

 

 

数据库注意事项

 

设计非聚集索引时需要注意数据库的特征。

  • 更新要求较低但包含大量数据的数据库或表可以从许多非聚集索引中获益从而改善查询性能。
    决策支持系统应用程序和主要包含只读数据的数据库可以从许多非聚集索引中获益。查询优化器具有更多可供选择的索引用来确定最快的访问方法,并且数据库的低更新特征意味着索引维护不会降低性能。
  • 联机事务处理应用程序和包含大量更新表的数据库应避免使用过多的索引。此外,索引应该是窄的,即列越少越好。
    一个表如果建有大量索引会影响 INSERT、UPDATE 和 DELETE 语句的性能,因为所有索引都必须随表中数据的更改进行相应的调整。

总结:更新要求低可以从非聚簇索引获益;  

        只读的数据库;

        大量要更新的表数据,应避免使用过多的索引;  索引越窄越好,列越少越好。

 

 

查询注意事项

 

在创建非聚集索引之前,应先了解访问数据的方式。考虑对具有以下属性的查询使用非聚集索引:

  • 使用 JOIN 或 GROUP BY 子句。
    应为联接和分组操作中所涉及的列创建多个非聚集索引,为任何外键列创建一个聚集索引。
  • 不返回大型结果集的查询。
  • 包含经常包含在查询的搜索条件(例如返回完全匹配的 WHERE 子句)中的列。

 

列注意事项

 

考虑具有以下一个或多个属性的列:

  • 1)覆盖查询。
    当索引包含查询中的所有列时,性能可以提升。查询优化器可以找到索引内的所有列值;不会访问表或聚集索引数据,这样就减少了磁盘 I/O 操作。使用具有包含列的索引来添加覆盖列,而不是创建宽索引键。有关详细信息,请参阅 具有包含性列的索引。
    如果表有聚集索引,则该聚集索引中定义的列将自动追加到表上每个非聚集索引的末端。这可以生成覆盖查询,而不用在非聚集索引定义中指定聚集索引列。例如,如果一个表在 C 列上有聚集索引,则 BA 列的非聚集索引将具有其自己的键值列 BAC
  • 2)大量非重复值,如姓氏和名字的组合(前提是聚集索引被用于其他列)。          
    如果只有很少的非重复值,例如仅有 1 和 0,则大多数查询将不使用索引,因为此时表扫描通常更有效。

 

总结:覆盖查询,表中若有聚簇索引,则聚簇索引将自动追加到非聚簇索引的末端。 比如: id,非聚簇索引列,聚簇索引键值

 

 

索引选项

 

在创建非聚集索引时,可以指定若干索引选项。要尤其注意以下选项:

  • FILLFACTOR
  • ONLINE

 

 

 

非聚集索引结构

 

非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点:

  • 基础表的数据行不按非聚集键的顺序排序和存储。
  • 非聚集索引的叶层是由索引页而不是由数据页组成。

 

如果表没聚簇索引,则聚簇则存放 行的定位指针指向数据航;  若有聚簇索引,则行定位器是行的聚集索引键

 

非聚集索引行中的行定位器或是指向行的指针,或是行的聚集索引键,如下所述:

  • 如果表是堆(意味着该表没有聚集索引),则行定位器是指向行的指针。该指针由文件标识符 (ID)、页码和页上的行数生成。整个指针称为行 ID (RID)。
  • 如果表有聚集索引或索引视图上有聚集索引,则行定位器是行的聚集索引键。如果聚集索引不是唯一的索引,SQL Server 2005 将添加在内部生成的值(称为唯一值)以使所有重复键唯一。此四字节的值对于用户不可见。仅当需要使聚集键唯一以用于非聚集索引中时,才添加该值。SQL Server 通过使用存储在非聚集索引的叶行内的聚集索引键搜索聚集索引来检索数据行。

 

 

 

下图说明了单个分区中的非聚集索引结构。

image

 

 

 

唯一索引

唯一索引确保索引键不包含重复的值,因此,表或视图中的每一行在某种程度上是唯一的。

聚集索引和非聚集索引都可以是唯一索引。

如果想要索引键值有唯一的值,就是其他行不能有相同的,则可以建立唯一索引。   能够确保定义的列的数据完整性。

 

具有包含性列的索引

一种非聚集索引,它扩展后不仅包含键列,还包含非键列。

 

 

索引视图

视图的索引将具体化(执行)视图,并将结果集永久存储在唯一的聚集索引中,而且其存储方法与带聚集索引的表的存储方法相同。创建聚集索引后,可以为视图添加非聚集索引。

 

全文

一种特殊类型的基于标记的功能性索引,由 Microsoft SQL Server 全文引擎 (MSFTESQL) 服务创建和维护。用于帮助在字符串数据中搜索复杂的词。

 

XML

xml 数据类型列中 XML 二进制大型对象 (BLOB) 的已拆分持久表示形式。

你可能感兴趣的:(MSSQL)