视图本身不存储数据,但通过带CHECK约束的UNION ALL组合多个物理表,SQL Server可实现水平切分并自动裁剪分区;无约束则退化为全表扫描。
视图本身不存储数据,但通过 UNION ALL 组合多个物理表,并配合 CHECK 约束,SQL Server 能在查询时自动裁剪到目标分区表——这是实现水平切分最轻量、最可控的方式。
SQL Server 查询优化器只在成员表有明确 CHECK 约束时,才会做分区消除(Partition Elimination)。没有约束的 UNION ALL 视图会被当成全表扫描处理,性能反而更差。
CHECK 约束,例如:ALTER TABLE orders_2024_q1 ADD CONSTRAINT chk_order_date CHECK (order_date >= '2024-01-01' AND order_date
SELECT 列表中的列,且不能是计算列或表达式默认情况下,向分区视图插入数据会失败。必须在创建视图时加上 WITH CHECK OPTION,SQL Server 才允许 INSERT,并自动路由到满足 CHECK 条件的成员表。
CHECK 约束判定的字段值,比如:INSERT INTO view_orders (order_id, order_date, amount) VALUES (1001, '2024-02-15', 99.9)
CHECK 约束,会直接报错:Cannot insert row, it violates the CHECK constraint
当成员表分布在不同 SQL Server 实例时,必须用 Linked Server 引用远程表,但要注意:查询计划无法下推,所有数据会先拉到本地再 UNION ALL,网络和内存开销大。
[server_name].[database_name].[schema].[table],缺一不可WITH (NOLOCK) 可减少阻塞,但不解决数据一致性问题;不要在事务中依赖跨库视图写入SET STATISTICS IO ON 查看是否真的只访问了目标远程表,还是全量拉取真正麻烦的不是建视图,而是维护 CHECK 约束边界和同步各成员表结构变更——哪怕加一个 NOT NULL 字段,所有成员表都得同步改,否则视图就失效。这点容易被忽略,直到某天 SELECT 突然变慢才反应过来。