3. SQL Server安装与基础环境配置

数据仓库平台的稳定性,很大程度上在安装阶段就已经决定。SQL Server 的安装并不是一路“下一步”即可,实例类型、排序规则、内存上限、CPU 亲和、存储路径与文件组布局,都会在后续 ETL 加载、大表扫描和并发查询中持续产生影响。本节围绕这些关键决策展开,并给出可参考的配置示例。

实例安装:默认实例与命名实例的选择

一台服务器可以安装多个 SQL Server 实例,每个实例拥有独立的服务、端口、内存配置和系统数据库。默认实例以服务器名或 IP 直接访问,命名实例则以“服务器名\实例名”访问。数据仓库通常建议使用独立实例,避免与 OLTP 业务实例争抢内存和 CPU。

安装时需明确几个要点:服务账户建议使用域账户或专用托管账户,避免使用 LocalSystem;身份验证模式在数据仓库场景下一般选择“混合模式”,便于 ETL 工具以 SQL 登录连接;排序规则在安装时确定,之后修改代价极高,必须提前规划。

排序规则选择:影响连接、比较与索引

排序规则(Collation)决定字符数据的比较、排序和大小写敏感性。常见选择有 Chinese_PRC_CI_AS(中文简体、不区分大小写、区分重音)和 SQL_Latin1_General_CP1_CI_AS。数据仓库中若源系统包含中文,建议实例级使用 Chinese_PRC_CI_AS,避免跨库 JOIN 时因排序规则冲突报错。

排序规则冲突的典型表现是:两个不同排序规则的列做比较或连接时,SQL Server 抛出“无法解决 equal to 操作的排序规则冲突”。解决方式是在查询中显式加 COLLATE,但这会阻止索引有效使用。因此,在实例安装阶段统一排序规则,是成本最低的做法。

内存与CPU配置:为数据仓库留出余量

SQL Server 默认会尽可能占用操作系统内存,必须设置“最大服务器内存”,为操作系统和其他进程保留空间。经验做法是:若服务器物理内存为 128 GB,可设置最大服务器内存为 112 GB,保留约 16 GB 给操作系统。最小服务器内存一般无需手动设置,除非存在多实例竞争。

CPU 方面,数据仓库的并行查询较多,可通过“最大工作线程数”和“并行度”相关参数控制。对于 16 核服务器,可将 max degree of parallelism 设置为 8,避免单个查询占满所有核心。若使用 NUMA 架构,还可通过 CPU 亲和性将 SQL Server 绑定到特定节点,减少跨节点内存访问。

-- 查看当前内存与并行度配置
EXEC sp_configure 'max server memory (MB)';
EXEC sp_configure 'max degree of parallelism';

-- 设置最大服务器内存为 112 GB
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory (MB)', 114688;
RECONFIGURE;

-- 设置最大并行度为 8
EXEC sp_configure 'max degree of parallelism', 8;
RECONFIGURE;

存储规划:数据、日志、TempDB 分离

数据仓库的 I/O 压力主要来自大表扫描、批量插入和 TempDB 排序。存储规划的核心原则是:数据文件、日志文件、TempDB 尽量放在不同物理磁盘或不同 LUN 上,避免 I/O 争抢。若使用 SSD 或高性能 SAN,可适当合并,但仍建议日志与数据分离。

以一台 2 TB 数据仓库为例,可规划为:数据盘 1.2 TB、日志盘 400 GB、TempDB 盘 400 GB。TempDB 建议按 CPU 核心数拆分为多个等大文件,例如 8 核可建 8 个 8 GB 的 TempDB 数据文件,减少分配争用。

数据库文件与文件组设计

文件组是数据仓库物理设计的重要抓手。建议至少划分:主文件组(仅放系统对象)、维度文件组、事实文件组、索引文件组、归档文件组。将事实表与维度表分开放置,便于按访问频率和备份策略差异化处理。

对于大事实表,可进一步按时间分区,并将不同分区映射到不同文件组,实现分区切换和并行加载。文件增长建议设置为固定大小(如 512 MB),避免按百分比增长导致文件碎片和不可控的等待。

SQL Server 数据仓库实例配置与存储布局 实例层 命名实例 DW01 排序规则 Chinese_PRC_CI_AS 最大内存 112 GB 并行度 8 存储层 数据盘 1.2 TB 维度文件组 / 事实文件组 索引文件组 / 归档文件组 日志盘 400 GB 事务日志 .ldf 固定增长 512 MB TempDB 盘 400 GB 8 个等大文件 × 8 GB 按 CPU 核心数拆分 文件组与对象映射 主文件组 维度文件组 事实文件组 索引文件组 归档 系统对象 Dim_* Fact_* 分区表 非聚集索引 历史数据

配置检查与验证

安装完成后,建议执行一轮基础检查,确认关键参数已生效。以下查询可快速核对内存、并行度、排序规则和文件布局。

-- 核对实例排序规则
SELECT SERVERPROPERTY('Collation') AS InstanceCollation;

-- 查看数据库文件与文件组
SELECT 
    df.name AS LogicalName,
    df.physical_name AS PhysicalPath,
    fg.name AS FileGroupName,
    df.size * 8 / 1024 AS SizeMB,
    df.growth,
    df.is_percent_growth
FROM sys.database_files df
JOIN sys.filegroups fg ON df.data_space_id = fg.data_space_id;

-- 查看 TempDB 文件分布
SELECT name, physical_name, size * 8 / 1024 AS SizeMB
FROM tempdb.sys.database_files;
排序规则一旦在实例级确定,后续新建数据库默认继承实例排序规则。若源系统排序规则不同,建议在 ETL 层做显式转换,而不是在实例安装后修改排序规则。修改实例排序规则需要重建系统数据库,风险极高。
不要将数据文件、日志文件和 TempDB 放在同一块物理磁盘上。数据仓库的批量加载和复杂查询会同时产生大量顺序 I/O 和随机 I/O,混放会显著拉长 ETL 窗口。若受限于硬件,至少将日志与数据分离。