在sqlserver创建表的语句中,最后总来一句on[primary],这到底是什么意思?

。联机丛书中CREATE TABLE的语法下似乎没有找到。最后终于发现,具体如下:

在CREATE TABLE的语法中有这样一句可选语法项目:
[ ON { filegroup | DEFAULT } ]

用来指定存储表的文件组。
如果指定 filegroup,则表将存储在指定的文件组中。数据库中必须存在该文件组。如果指定 DEFAULT,或者根本未指定 ON 参数,则表存储在默认文件组中。
(DEFAULT 并不是关键字。DEFAULT 是默认文件组的标识符并需对其进行定界,如 ON "DEFAULT"、ON [DEFAULT]。)

ON [PRIMARY]是表示表是建立在主文件组上。PRIMARY表示主文件组。如果没有指定默认文件组,则主文件组是默认文件组,ON [PRIMARY]也可以省略掉了。

由数据库说开来。Microsoft® SQL Server™ 2000 使用一组操作系统文件映射数据库,也可以说将数据库映射到一组操作系统文件上(看你怎么理解了)。数据库中的所有数据和对象(如表、存储过程、触发器和视图)都存储在操作系统文件(数据库文件):主要数据文件 、次要数据文件 和事务日志 文件中。

1.主要数据文件  
该文件包含数据库的启动信息,并用于存储数据。是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。

2.次要数据文件 
这些文件含有不能置于主要数据文件中的所有数据即包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。(如果主文件可以包含数据库中的所有数据,那么数据库就不需要次要数据文件。有些数据库可能足够大故需要多个次要数据文件,或使用位于不同磁盘驱动器上的辅助文件将数据扩展到多个磁盘。)次要数据文件的推荐文件扩展名是 .ndf。

3.事务日志文件 
该数据库的日志信息。每个数据库都必须至少有一个日志文件。日志文件的推荐文件扩展名是 .ldf。

文件组
出于分配和管理目的,可以将数据库文件分成不同的文件组。文件组是SQL Server 2000数据文件的一种逻辑管理单位。SQL Server中一个或多个文件的命名集合,它构成分配或用于数据库管理的单个单元。在首次建数据库,或者以后将更多文件添加到数据库时,可以创建文件组。文件组不能独立于数据库文件创建。文件组是在数据库中对文件进行分组的一种管理机制。

有两种类型的文件组:主要文件组和用户定义文件组。(可以说,数据库由一个主文件组和任意用户定义的文件组组成。)

1.主文件组 (PRIMARY)
用户定义文件组 默认文件组 同为文件组的一种类型。
其包含主要数据文件和任何没有明确指派给其它文件组的其它文件。系统表的所有页均分配在主文件组.
2.用户定义文件组 
用户定义文件组是在 CREATE DATABASE 或 ALTER DATABASE 语句中,使用 FILEGROUP 关键字或在 SQL Server 企业管理器内的"属性"对话框指定的文件组。

另:默认文件组 (DEFAULT 文件组)
文件组的一种类型,其包含在创建时没有指定文件组的所有表和索引的页。在每个数据库中,每次只能有一个文件组是默认文件组。如果没有指定默认文件组,则默认文件组是主文件组。 可用 ALTER DATABASE 语句更改默认文件组。通过更改默认文件组,创建时没有指定文件组的任何对象都被分配到新默认文件组中的数据文件。然而,系统对象和表仍然保留在 PRIMARY 文件组内,而不是新默认文件组。(每个数据库中都有一个文件组作为默认文件组运行。当 SQL Server 给创建时没有为其指定文件组的表或索引分配页时,将从默认文件组中进行分配。一次只能有一个文件组作为默认文件组。db_owner 固定数据库角色成员可以将默认文件组从一个文件组切换到另一个。如果没有指定默认文件组,则主文件组是默认文件组。)

注:SQL Server 2000 在没有文件组时也能有效地工作,因此许多系统不需要指定用户定义文件组。在这种情况下,所有文件都包含在主文件组中,而且 SQL Server 2000 可以在数据库内的任何位置分配数据。文件组不是在多个驱动器之间分配 I/O 的唯一方法。

附:

. 为什么要建立文件组

建立文件组有两个目的。

一是可以更好地分配和管理存储空间,通过控制在特定磁盘驱动器上放置数据和索引来提高数据库的性能。

二是由于操作系统对物理文件的大小进行了限制,所以当某个磁盘上的数据文件超过单个文件允许的最大值时,可以使用文件组中存

贮在其他驱动器上的数据文件继续扩充存储空间。
. 数据文件和文件组的使用规则

SQL Server 2000中的数据文件和文件组的使用规则包括:

数据文件或文件组不能由一个以上的数据库使用。

数据文件只能是一个文件组的成员。

数据文件和日志文件不能属于同一文件或文件组。

日志文件不能属于任何文件组。

只有文件组中的所有数据文件都没有空间了,文件组的文件才会自动增长。

. 文件组的工作原理

文件组对组内的所有文件都使用按比例填充策略。当将数据写入文件组时,SQL Server 2000根据文件中的可用空间量将一定比例的数据写入文

件组的每个文件,而不是将所有的数据先写满第一个文件,接着再写入下一个文件。例如,如果文件1有100MB的可用空间,文件2有200MB的可

用空间,则从文件1中分配一个盘区,从文件2中分配两个盘区,依此类推。这样,两个文件几乎同时填满。

一旦文件组内的所有文件已满,SQL Server 2000就自动地采用循环方式一次扩展一个文件,以容纳更多的数据(假定数据库设置为自动增长)

。例如,某个文件组由3个文件组成,它们都设置为自动增长。当文件组中的所有文件的空间用完时,只扩展第一个文件。当第一个文件已满,

不能将更多的数据写入该文件组时,扩展第二个文件。当第二个文件已满,不能将更多的数据写入该文件组时,扩展第3个文件。如果第3个文

件已满,不能将更多的数据写入该文件组,那么再次扩展第一个文件,以此类推

正时由于文件组的这种特性,允许跨多个磁盘、多个磁盘控制器或 RAID(廉价磁盘冗余阵列)系统创建数据库,可提高数据库性能。例如,如

果计算机中有4个磁盘,那么可以创建一个由3个数据文件和一个日志文件组成的数据库,每个磁盘上放置一个文件。在对数据进行访问时,四

个读/写磁头可以同时并行地访问数据,从而加速数据库操作。

另外,文件和文件组允许数据布局,可以在特定的文件组中创建表。因为特定表的所有输入/输出都可以定向到特定的磁盘,所以性能得以改善

。例如,可以将最常用的表放在一个文件组中的一个文件中,该文件组位于一个磁盘上;而将数据库中其它的不常访问的表放在另一个文件组

中的其它文件中,该文件组位于第二个磁盘上。
. 如何使用文件组的建议

大多数数据库在只有单个数据文件和单个事务日志文件的情况下可以很好地运行。

如果使用多个文件,请为附加文件创建第二个文件组,并将其设置为默认文件组。这样,主文件将仅包含系统表和对象。

若要获得最佳性能,请在尽可能多的可用本地物理磁盘上创建文件或文件组,并将争夺空间最激烈的对象置于不同的文件组中。

使用文件组以允许将对象放置在特定的物理磁盘上。

将在同一联接查询中使用的不同表置于不同的文件组中。由于采用并行磁盘输入/输出对联接数据进行搜索,所以性能将得以改善。

将最常访问的表和属于这些表的非聚集索引置于不同的文件组上。如果文件位于不同的物理磁盘上,由于采用并行输入/输出,所以

性能得以提高。

不要将日志文件与其它文件和文件组置于同一物理磁盘上。

数据库文件结构、sqlserver ON [PRIMARY]的更多相关文章

  1. 常用数据库1 sqlserver

    知识内容: 1.SqlServer数据库概述 2.SqlServer数据库基本操作 3.Transact-SQL程序设计 一.SqlServer数据库概述 1.SqlServer系统概述 SQLSer ...

  2. 替换系统数据库解决SQLSERVER服务启动不了的问题

    替换系统数据库解决SQLSERVER服务启动不了的问题 当遇到SQLSERVER服务启动不起来的时候,我们试过把系统的四个数据库master ,model ,tempdb,msdb 替换掉,Windo ...

  3. EF CodeFirst生成数据库到Sqlserver中

    EF CodeFirst简单实例这篇文章介绍了如何用EF去快速生成数据库.但是这个并没有生成到sqlserver中,总觉得不爽.下面就来讲一下,如何将数据库生成到sqlserver中. 按照EF Co ...

  4. OsharpNS轻量级.net core快速开发框架简明入门教程-切换数据库(从SqlServer改为MySql)

    OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. O ...

  5. SQL多表连接查询以及mysql数据库、sqlserver数据库常见不同点

    mysql数据库表及数据准备语句: USE test; DROP TABLE IF EXISTS `teacher_table`; DROP TABLE IF EXISTS `student_tabl ...

  6. 【数据库】 Sqlserver 2008 error 40出现连接错误的解决方法

    经常要连接到远程数据库上,因此常常碰到这个错误,然后又屡次忘记解决方法,所以今天坐下笔迹,好下次能快速回忆起来. 一.首先检查数据库的TCP/TP是否启动 1.启动Sql server配置管理器 2. ...

  7. 还原数据库,恢复SQLSERVER登录名的问题

    还原SQLSERVER数据库,原来的数据库的于当前SQLSERVER同名用户就不能再登录了,原因是当前SQLSERVERD的master数据库的sysxlogins表的的sid与还原后的数据库的sys ...

  8. xp下Oracle数据库导入SQLServer数据库数据

    Oracle数据库利用ODBC数据源.PLSQL Developer导入SQLServer数据库数据 操作: 建立数据源:控制面板→管理工具→数据源 (ODBC) 打开,界面如下: 点击添加,界面如下 ...

  9. SQLServer之PRIMARY KEY约束

    PRIMARY KEY约束添加规则 1.在表中常有一列或多列的组合,其值能唯一标识表中的每一行,这样的一列或多列成为表的主键(PrimaryKey). 2.一个表只能有一个主键,而且主键约束中的列不能 ...

随机推荐

  1. SQL查询CASE遇上NULL怎么办?

    原SQL: case userName when  null THEN '空' else '有值' end, 这种写法不好使: 换一种:case when userName is null THEN ...

  2. (二)线程Thread中的方法详解

    1.start() start()方法的作用讲得直白点就是通知"线程规划器",此线程可以运行了,正在等待CPU调用线程对象得run()方法,产生一个异步执行的效果.通过start( ...

  3. RuntimeError: can't start new thread

    明明我只是简单跑了一个数据清洗28W数据的python脚本,不知道怎么就报错如下: too many threads running within your python process The &q ...

  4. 使用Ajax中get请求发送Token时踩的那些坑

    在使用惯了各种牛X的插件以后,在使用原生组件写一些小东西的时候总是有踩不完的坑! 今天就来说一说我使用原生ajax请求时踩得坑: 下面是我的代码: var xmlhttp; if (window.XM ...

  5. @GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping、@RequestMapping详解

    最近写项目中突然发现有人再controller层写@PostMapping,这对于经常用@RequestMapping的我来说,感到跟奇怪,网上搜寻了一些资料,特在此整合一下: Spring4.3中引 ...

  6. python基于opencv实现人脸定位

    import cv2 # 读取图片 img = cv2.imread("image.jpg") # 加载模型,模型可以从https://github.com/opencv/open ...

  7. PHP mysqli_field_seek() 函数

    定义和用法 mysqli_field_seek() 函数把字段指针设置为指定字段的偏移量. 设置结果集中第一个字段(列)的字段指针,然后通过 mysqli_fetch_field() 获取字段信息并输 ...

  8. Laravel 事件侦听的几个方法 [Trait, Model boot(), Observer Class]

    1 Trait 1.1 可以在 Trait 中定义一个静态的 bootFooBar() 方法,注:FooBar 是你的 Trait 名称 namespace App\Traits; use App\A ...

  9. [Luogu] 维护序列

    https://www.luogu.org/problemnew/show/P2023 线段树双懒标记下放 #include <bits/stdc++.h> using namespace ...

  10. 灰度变换,gama变换,对数,反对数变换

    学习DIP第2天 灰度变换,及按照一定规则对像素点的灰度值进行变换,变换的结果可以增强对比度,或者达到其他的效果(例如二值化,或者伽马变换),由于灰度变换为针对单个像素点的灰度值进行变换,素以算法复杂 ...