欢迎光临殡葬网
详情描述

1. 水平拆分(按行拆分)

示例1:按日期范围拆分

-- 创建主表(用于查询接口)
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE,
    TotalAmount DECIMAL(10,2),
    Status VARCHAR(20)
);

-- 创建年度分表
CREATE TABLE Orders_2023 (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE,
    TotalAmount DECIMAL(10,2),
    Status VARCHAR(20),
    CHECK (YEAR(OrderDate) = 2023)
);

CREATE TABLE Orders_2024 (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE,
    TotalAmount DECIMAL(10,2),
    Status VARCHAR(20),
    CHECK (YEAR(OrderDate) = 2024)
);

-- 创建视图统一访问
CREATE VIEW vw_AllOrders AS
SELECT * FROM Orders_2023
UNION ALL
SELECT * FROM Orders_2024;

示例2:按地区拆分

-- 创建地区分表
CREATE TABLE Orders_North (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    Region VARCHAR(50) DEFAULT 'North',
    OrderDate DATE,
    TotalAmount DECIMAL(10,2)
);

CREATE TABLE Orders_South (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    Region VARCHAR(50) DEFAULT 'South',
    OrderDate DATE,
    TotalAmount DECIMAL(10,2)
);

-- 使用分区视图
CREATE VIEW vw_OrdersByRegion AS
SELECT * FROM Orders_North
UNION ALL
SELECT * FROM Orders_South;

2. 垂直拆分(按列拆分)

示例:将大表拆分为常用列和不常用列

-- 主表(常用信息)
CREATE TABLE Customers_Main (
    CustomerID INT PRIMARY KEY,
    CustomerName NVARCHAR(100),
    Email VARCHAR(100),
    Phone VARCHAR(20),
    CreateDate DATETIME DEFAULT GETDATE()
);

-- 扩展表(不常用信息)
CREATE TABLE Customers_Details (
    CustomerID INT PRIMARY KEY,
    Address NVARCHAR(200),
    BirthDate DATE,
    Preferences NVARCHAR(MAX),
    LastLogin DATETIME,
    FOREIGN KEY (CustomerID) REFERENCES Customers_Main(CustomerID)
);

-- 使用视图合并
CREATE VIEW vw_CustomerFullInfo AS
SELECT 
    m.CustomerID,
    m.CustomerName,
    m.Email,
    m.Phone,
    d.Address,
    d.BirthDate,
    d.Preferences,
    d.LastLogin
FROM Customers_Main m
LEFT JOIN Customers_Details d ON m.CustomerID = d.CustomerID;

3. 分区表(Partitioned Tables)

示例1:按日期范围分区

-- 创建分区函数
CREATE PARTITION FUNCTION pf_OrderDate (DATE)
AS RANGE RIGHT FOR VALUES (
    '2023-01-01',
    '2024-01-01',
    '2025-01-01'
);

-- 创建分区方案
CREATE PARTITION SCHEME ps_OrderDate
AS PARTITION pf_OrderDate
TO (
    [PRIMARY],
    [FG_2023],
    [FG_2024],
    [FG_2025]
);

-- 创建分区表
CREATE TABLE Orders_Partitioned (
    OrderID INT,
    CustomerID INT,
    OrderDate DATE,
    TotalAmount DECIMAL(10,2),
    Status VARCHAR(20)
) ON ps_OrderDate(OrderDate);

-- 创建聚集索引(分区依据)
CREATE CLUSTERED INDEX IX_Orders_OrderDate 
ON Orders_Partitioned(OrderDate)
ON ps_OrderDate(OrderDate);

示例2:按状态分区

-- 创建分区函数
CREATE PARTITION FUNCTION pf_OrderStatus (VARCHAR(20))
AS RANGE RIGHT FOR VALUES (
    'Pending',
    'Processing',
    'Shipped',
    'Delivered'
);

-- 创建分区方案
CREATE PARTITION SCHEME ps_OrderStatus
AS PARTITION pf_OrderStatus
TO ([PRIMARY], [FG_Pending], [FG_Processing], [FG_Shipped], [FG_Delivered]);

-- 创建分区表
CREATE TABLE Orders_ByStatus (
    OrderID INT,
    CustomerID INT,
    OrderDate DATE,
    Status VARCHAR(20),
    TotalAmount DECIMAL(10,2)
) ON ps_OrderStatus(Status);

4. 分布式分区视图

示例:跨服务器分区

-- 服务器1上执行
CREATE TABLE Server1.dbo.Orders_Part1 (
    OrderID INT PRIMARY KEY CHECK (OrderID BETWEEN 1 AND 10000),
    CustomerID INT,
    OrderDate DATE
);

-- 服务器2上执行
CREATE TABLE Server2.dbo.Orders_Part2 (
    OrderID INT PRIMARY KEY CHECK (OrderID BETWEEN 10001 AND 20000),
    CustomerID INT,
    OrderDate DATE
);

-- 创建分布式分区视图(在任一服务器上)
CREATE VIEW vw_DistributedOrders AS
SELECT * FROM Server1.dbo.Orders_Part1
UNION ALL
SELECT * FROM Server2.dbo.Orders_Part2;

5. 实用查询和管理

查询分区信息

-- 查看分区情况
SELECT 
    p.partition_number,
    f.name AS function_name,
    r.boundary_id,
    r.value AS boundary_value,
    p.rows
FROM sys.partitions p
JOIN sys.indexes i ON p.object_id = i.object_id AND p.index_id = i.index_id
JOIN sys.partition_schemes ps ON i.data_space_id = ps.data_space_id
JOIN sys.partition_functions f ON ps.function_id = f.function_id
LEFT JOIN sys.partition_range_values r ON f.function_id = r.function_id AND r.boundary_id = p.partition_number
WHERE p.object_id = OBJECT_ID('Orders_Partitioned')
ORDER BY p.partition_number;

-- 统计分区行数
SELECT 
    $PARTITION.pf_OrderDate(OrderDate) AS PartitionNumber,
    COUNT(*) AS RowCount
FROM Orders_Partitioned
GROUP BY $PARTITION.pf_OrderDate(OrderDate)
ORDER BY PartitionNumber;

分区维护操作

-- 添加新分区
ALTER PARTITION SCHEME ps_OrderDate
NEXT USED [FG_2026];

ALTER PARTITION FUNCTION pf_OrderDate()
SPLIT RANGE ('2026-01-01');

-- 合并分区
ALTER PARTITION FUNCTION pf_OrderDate()
MERGE RANGE ('2023-01-01');

-- 切换分区(归档旧数据)
CREATE TABLE Orders_Archive_2022 (
    OrderID INT,
    CustomerID INT,
    OrderDate DATE,
    TotalAmount DECIMAL(10,2),
    Status VARCHAR(20)
) ON [ARCHIVE_FG];

ALTER TABLE Orders_Partitioned
SWITCH PARTITION 1 TO Orders_Archive_2022;

6. 最佳实践示例

-- 综合示例:订单系统分区方案
CREATE PARTITION FUNCTION pf_MonthlyPartition (DATETIME)
AS RANGE RIGHT FOR VALUES (
    '2024-01-01', '2024-02-01', '2024-03-01',
    '2024-04-01', '2024-05-01', '2024-06-01'
);

-- 为每个月创建文件组
ALTER DATABASE CurrentDB
ADD FILEGROUP FG_202401;

ALTER DATABASE CurrentDB
ADD FILE (
    NAME = N'FG_202401_File',
    FILENAME = N'D:\Data\FG_202401.ndf',
    SIZE = 100MB
) TO FILEGROUP FG_202401;

-- 创建分区方案
CREATE PARTITION SCHEME ps_Monthly
AS PARTITION pf_MonthlyPartition
TO (
    [FG_202401], [FG_202402], [FG_202403],
    [FG_202404], [FG_202405], [FG_202406],
    [PRIMARY]
);

-- 创建分区表
CREATE TABLE dbo.OrderTransactions (
    TransactionID BIGINT IDENTITY(1,1),
    OrderID INT NOT NULL,
    TransactionDate DATETIME NOT NULL DEFAULT GETDATE(),
    Amount DECIMAL(15,2),
    TransactionType VARCHAR(20),
    INDEX IX_TransactionDate CLUSTERED (TransactionDate)
) ON ps_Monthly(TransactionDate);

注意事项

设计考虑:

  • 选择合适的分区键
  • 考虑查询模式
  • 规划文件组和存储

性能优化:

  • 分区消除(Partition Elimination)
  • 并行处理
  • 索引对齐

维护任务:

  • 定期添加新分区
  • 归档旧分区
  • 更新统计信息

监控:

  • 分区大小和使用情况
  • 查询性能
  • 存储空间

这种表拆分策略特别适用于:

  • 时间序列数据(如日志、交易记录)
  • 大型历史表
  • 需要快速归档的场景
  • 需要并行处理的批量操作
相关帖子
泉州市丧葬一条龙服务-白事追悼会服务,价格透明
泉州市丧葬一条龙服务-白事追悼会服务,价格透明
泉州市电商网站建设@网站定制服务,收费透明
泉州市电商网站建设@网站定制服务,收费透明
家庭借贷实用知识汇总,理性借贷构建健康低负债的财务状态
家庭借贷实用知识汇总,理性借贷构建健康低负债的财务状态
选购“电子年货”作为礼物,如何兼顾惊喜感与收礼人的实际需求?
选购“电子年货”作为礼物,如何兼顾惊喜感与收礼人的实际需求?
社保卡是多年前办的,现在胖了二十斤,照片和本人差太多会不会影响日常刷卡核验?
社保卡是多年前办的,现在胖了二十斤,照片和本人差太多会不会影响日常刷卡核验?
自动续费没明显提醒被扣一年会员,找平台投诉能全额追回吗?
自动续费没明显提醒被扣一年会员,找平台投诉能全额追回吗?
过去考取的职业资格证书,在2026年是否仍然有效,是否需要定期参加继续教育?
过去考取的职业资格证书,在2026年是否仍然有效,是否需要定期参加继续教育?
武汉市做网站公司@企业网站建设,服务可靠
武汉市做网站公司@企业网站建设,服务可靠
沈阳市殡葬服务租车|丧事服务一条龙,冰棺出租
沈阳市殡葬服务租车|丧事服务一条龙,冰棺出租
黄山市丧葬一条龙价格-殡葬跟拍录像,一流的质量
黄山市丧葬一条龙价格-殡葬跟拍录像,一流的质量
桐乡市网站定制开发公司-购物网站设计开发,优秀开发团队
桐乡市网站定制开发公司-购物网站设计开发,优秀开发团队
湖州市殡葬服务车租赁-丧礼灵棚,全天在线
湖州市殡葬服务车租赁-丧礼灵棚,全天在线
宜春市独立网站开发设计-android软件开发,多年建站经验
宜春市独立网站开发设计-android软件开发,多年建站经验
抚州市殡葬服务一条龙办理|白事丧事服务,殡葬告别会
抚州市殡葬服务一条龙办理|白事丧事服务,殡葬告别会
衡阳市高效获客@企业网站建设设计,收费透明
衡阳市高效获客@企业网站建设设计,收费透明
与用人单位协商解决工资拖欠问题时,需要注意哪些沟通技巧?
与用人单位协商解决工资拖欠问题时,需要注意哪些沟通技巧?
哈尔滨市java开源商城二次开发-苹果系统app开发,优秀开发团队
哈尔滨市java开源商城二次开发-苹果系统app开发,优秀开发团队
潜江市殡葬服务|丧葬服务车出租,丧葬追思会
潜江市殡葬服务|丧葬服务车出租,丧葬追思会
沧州市精准获客系统@企业网站开发建设,优秀开发团队
沧州市精准获客系统@企业网站开发建设,优秀开发团队
“元宇宙”中的虚拟化身,会如何使用和关联到我们真实的生物信息?
“元宇宙”中的虚拟化身,会如何使用和关联到我们真实的生物信息?
自由职业者如果中断自缴公积金一段时间,账户和权益会受什么影响?
自由职业者如果中断自缴公积金一段时间,账户和权益会受什么影响?