博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
八、IO优化(5)使用文件组
阅读量:6633 次
发布时间:2019-06-25

本文共 2204 字,大约阅读时间需要 7 分钟。

一、文件与文件组

  在同一个文件组内部,多个数据文件起到负载均衡的作用。因此,尽量使每个数据文件的大小相同,这样可以优化比例填充的性能。

  例如:某文件组有2个数据文件,现在批量导入10MB的数据,结果会使这2个数据文件分别增加5MB的数据使用空间。

注意:请将同一个文件组的多个数据文件分别放置在不同的物理磁盘上。如果都放在同一个物理磁盘,由于数据需在多个文件中存取,导致磁头频繁寻道、定位,反而使性能降低。

二、表和索引分区

1.概念

  表和索引分区是SQL Server 2008引入的一项新特性。在维护数据集合的完整性时,使用分区可以快速而有效地管理和访问数据子集,从而使大型表或索引更易于管理。通过使用分区,将数据从 OLTP 加载到 OLAP 系统之类的操作仅需几秒钟即可完成,不像在 SQL Server 的早期版本那样需要几分钟或几小时。对数据子集执行的维护操作只针对所需的数据而不是整个表,因此,这些操作的执行效果也会更为有效。

  表和区分区的数据划分为分布于一个数据库中多个文件组的单元。数据是按水平方式分区的,因此多组行映射到单个的分区。对数据进行查询或更新时,表或索引将被视为单个逻辑实体。单个索引或表的所有分区都必须位于同一个数据库中。

  已分区表和已分区索引支持与设计和查询标准表和索引相关的所有属性和功能,包括约束、默认值、标识和时间戳值以及触发器。因此,如果要实现位于服务器本地的已分区视图,则可能需要改为实现已分区表。

  决定是否实现分区主要取决于表当前的大小或将来的大小、如何使用表以及对表执行用户查询和维护操作的完善程度。

  通常,如果某个大型表同时满足下列两个条件,则可能适于进行分区:

(1)该表包含(或将包含)以多种不同方式使用的大量数据。

(2)不能按预期对表执行查询或更新,或维护开销超过了预定义的维护期。

2. 分区的优势

  例如,如果对当前月份的数据主要执行 INSERT、UPDATE、DELETE 和 MERGE 操作,而对以前月份的数据主要执行 SELECT 查询,则按月份对表进行分区可能会使表的管理工作更容易一些。如果对表的常规维护操作只针对一个数据子集,那么此优点尤为明显。如果该表没有分区,那么就需要对整个数据集执行这些操作,这样就会消耗大量资源。例如,通过分区,可以针对具有只写数据的单个月份执行类似索引重新生成和碎片整理的维护操作,而只读数据仍可用于联机访问。

  扩展一下此示例,假设要将该表中一个月的只读数据移至数据仓库表中以进行分析。分区后,可以快速将数据子集分散到临时区域中以进行脱机维护,然后将这些数据作为分区添加到现有的已分区表(假定这些表都位于同一个数据库实例中)中。类似这样的操作通常只需几秒钟,而不是像未分区时那样需要数分钟或数小时。

  如果根据频繁执行的查询的类型和硬件配置正确地设计分区,那么对表或索引进行分区可以提高查询性能。

3. 实现表和索引分区

  创建已分区表或索引通常包含四个操作:

(1)创建将持有分区方案所指定的分区的文件组和相应的文件。

(2)创建一个分区函数,该函数根据指定列的值将表或索引的各行映射到分区。

(3)创建一个将已分区表或已分区索引的分区映射到新文件组的分区方案。

(4)创建或修改表或索引,并指定分区方案作为存储位置。

三、隔离数据库对象

  在创建表和索引时注意到ON参数,该参数指定将表或索引创建到某个文件组,而该文件组可以将文件指定在特定的物理磁盘。例如:

CREATE TABLE [dbo].[EmpTable](

[EmpID] [varchar](10) NULL,

[DepID] [nvarchar](10) NULL,

[Title] [nvarchar](10) NULL

) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IX_EmpTable] ON [dbo].[EmpTable]

( [EmpID] ASC ) ON [PRIMARY]

  在某些实际案例中,有一些表和索引被频繁访问,希望将这些表和索引隔离到另一个物理磁盘以加速访问的性能。

1. 移动表

  如果要将表从一个文件组移动到另一个文件组,有以下3种方法:

(1) 使用分区

  如果该表已经分区或者临时使用分区,可以切换分区到另一个物理磁盘。

(2) 重新创建表或索引

  在重新创建表或索引时,使用ON参数将表或索引创建在指定的文件组。

(3) 使用聚集索引搬移物理表

  聚集索引实际上就是物理上的数据页面,因此,修改聚集索引也能将物理表搬移到另一个文件组。

2. 移动索引

(1)使用表设计器(仅适用于非聚集索引)

(2)修改索引的属性

(3)使用T-SQL

CREATE CLUSTERED INDEX [IX_EmpTable] ON [dbo].[EmpTable]

( [EmpID] ASC )

WITH (DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

ON [SecondFG]

本文结语:

  通过文件组并将数据文件分隔到多个物理磁盘,可以实现表和索引分区,或者隔离数据库的表和索引对象,提升性能。

转载地址:http://cofvo.baihongyu.com/

你可能感兴趣的文章
PHP内核探索之变量(4)- 数组操作
查看>>
6个关于dd命令备份Linux系统的例子
查看>>
面向对象、面向服务、面向组件三种编程模式有什么区别?分别适用于哪些领域的开发?...
查看>>
监听视图树 ViewTreeObserver 获取View的宽高
查看>>
学习笔记 --- 缓存、动态页面静态化、网站优化
查看>>
linux 开机批量启动程序
查看>>
ANDROID L——Material Design具体解释(主题和布局)
查看>>
Spring注解@Component、@Repository、@Service、@Controller区别
查看>>
Aimp3的播放列表 按评分排序 落雨
查看>>
【Leet Code】Palindrome Number
查看>>
python网络编程初级
查看>>
Ruby中的Symbol与字符串
查看>>
最长回文字符串(manacher算法)
查看>>
java泛型概述
查看>>
winform程序_根据输入的sql生成excel(字段名与sql一致)
查看>>
Intel瞄准2000亿美元商机,以“数据为中心”结合云、边缘和人工智能
查看>>
实用 | 分享一个决策树可视化工具
查看>>
Ghost 2.16.3 发布,基于 Markdown 的在线写作平台
查看>>
Java开发规范(MySQL开发规范)-《阿里巴巴Java开发手册》
查看>>
Kali Linux Web 渗透测试秘籍 第九章 客户端攻击和社会工程
查看>>