SqlServer 分区视图实现水平分表
我们都知道在数据库数据量较多的时候,可数据进行水平扩展,如分库,分区,分表(也叫分区)等。对于分表的一个方案,就是使用分区视图实现。
分区视图允许将大型表中的数据拆分成较小的成员表。根据其中一列中的数据值范围,在各个成员表之间对数据进行分区。每个成员表的数据范围都在为分区依据列指定的 CHECK 约束中定义。然后定义一个视图,以使用 UNION ALL 将选定的所有成员表组合成单个结果集。引用该视图的 SELECT 语句为分区依据列指定搜索条件后,查询优化器将使用 CHECK 约束定义确定哪个成员表包含相应行。
CHECK 约束 在查询方面提供更好的优化特性,看一位大侠的实验SQL Server中使用Check约束提升性能 ,当前在其他操作方面就不太好了,以下测试。
当前测试为本地分区视图:
USE [DemoDB]
GO -- 创建结构相同的表,[id] 不要设置自增(IDENTITY(1,1) ),因为插入表前就需要知道id值
-- DROP TABLE [DemoTab01],[DemoTab02],[DemoTab03]
CREATE TABLE [dbo].[DemoTab01](
[id] [int] NOT NULL,
[insdate] [datetime] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[DemoTab02](
[id] [int] NOT NULL,
[insdate] [datetime] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[DemoTab03](
[id] [int] NOT NULL,
[insdate] [datetime] NULL
) ON [PRIMARY]
GO -- 约束每个表的范围
ALTER TABLE [dbo].[DemoTab01] WITH CHECK ADD CONSTRAINT [CK_DemoTab01_id] CHECK ([id] BETWEEN 0 AND 99999 )
GO
ALTER TABLE [dbo].[DemoTab02] WITH CHECK ADD CONSTRAINT [CK_DemoTab02_id] CHECK ([id] BETWEEN 100000 AND 199999 )
GO
ALTER TABLE [dbo].[DemoTab03] WITH CHECK ADD CONSTRAINT [CK_DemoTab03_id] CHECK ([id] BETWEEN 200000 AND 299999 )
GO -- 既然是按id划分,把id作为聚集索引更容易定位查找
ALTER TABLE [dbo].[DemoTab01] ADD CONSTRAINT [PK_DemoTab01_id] PRIMARY KEY CLUSTERED ([id] ASC)
GO
ALTER TABLE [dbo].[DemoTab02] ADD CONSTRAINT [PK_DemoTab02_id] PRIMARY KEY CLUSTERED ([id] ASC)
GO
ALTER TABLE [dbo].[DemoTab03] ADD CONSTRAINT [PK_DemoTab03_id] PRIMARY KEY CLUSTERED ([id] ASC)
GO -- 每个字段名称列出,避免用星号,否则升级增删字段不同时会出错
-- DROP VIEW [dbo].[V_DemoTab]
CREATE VIEW [dbo].[V_DemoTab]
AS
SELECT [id],[insdate] FROM [dbo].[DemoTab01]
UNION ALL
SELECT [id],[insdate] FROM [dbo].[DemoTab02]
UNION ALL
SELECT [id],[insdate] FROM [dbo].[DemoTab03]
GO -- 121317行数据
INSERT INTO [V_DemoTab]([id],[insdate])
SELECT SalesOrderDetailID,ModifiedDate FROM AdventureWorks2012.Sales.SalesOrderDetail
GO SELECT COUNT(*) FROM [dbo].[V_DemoTab]
SELECT COUNT(*) FROM [dbo].[DemoTab01]
SELECT COUNT(*) FROM [dbo].[DemoTab02]
SELECT COUNT(*) FROM [dbo].[DemoTab03]
- -- 现在对视图查询
- SELECT * FROM [dbo].[V_DemoTab] WHERE id = 0 --不存在
- SELECT * FROM [dbo].[V_DemoTab] WHERE id = 3000 --只有该id有记录
- SELECT * FROM [dbo].[V_DemoTab] WHERE id = 300000 --超出check范围
上面可以看到,只要查询在 check 约束范围内,就会进行查找。第三个查询不在范围内,并没有扫描表行数,只进行了常量扫描,这样提高了查询性能。
现在执行视图更新:
- BEGIN TRAN
- UPDATE [dbo].[V_DemoTab] SET insdate = '2005-11-01' WHERE id = 3000
- select CASE resource_type WHEN 'OBJECT' THEN OBJECT_NAME(resource_associated_entity_id) ELSE '' END AS [object]
- ,resource_type,resource_description,request_mode,request_status,request_type
- from sys.dm_tran_locks where resource_database_id=DB_ID() and request_session_id=@@SPID
- COMMIT TRAN
id = 3000 在表 [DemoTab01] 中,对视图的查询转化为对表的查询,但是其他表则都加上了意向排它锁(IX),这样在大量并发中势必影响到其他用户的访问。
执行计划中,不符合条件的都进行了常量扫描,实际并不读取数据,但也增加了开销。
SqlServer 分区视图实现水平分表的更多相关文章
- mysql中的优化, 简单的说了一下垂直分表, 水平分表(有几种模运算),读写分离.
一.mysql中的优化 where语句的优化 1.尽量避免在 where 子句中对字段进行表达式操作select id from uinfo_jifen where jifen/60 > 100 ...
- mycat - 水平分表
相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中.水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分 ...
- mycat水平分表
和垂直分库不同,水平分表,是将那些io频繁,且数据量大的表进行水平切分. 基本的配置和垂直分库一样,我们需要改的就是我们的 schema.xml和rule.xml文件配置(server.xml不用做任 ...
- mysql 水平分表技术
这里做的是我的一个笔记. 水平分表比较简单, 理解就是: 合并的表使用的必须是MyISAM引擎 表的结构必须一致,包括索引.字段类型.引擎和字符集 数据表 user1 CREATE TABLE `us ...
- 玩转SpringBoot之整合Mybatis拦截器对数据库水平分表
利用Mybatis拦截器对数据库水平分表 需求描述 当数据量比较多时,放在一个表中的时候会影响查询效率:或者数据的时效性只是当月有效的时候:这时我们就会涉及到数据库的分表操作了.当然,你也可以使用比较 ...
- MySQL常见水平分表技术方案
根据经验,Mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉:水平分表能够很大程度较少这些压力. 1.按时间分表 这种分表方式有一定的局限性,当数据有较强的实效 ...
- mysql使用MRG_MyISAM(MERGE)实现水平分表
在MySQL中数据的优化尤其是大数据量的优化是一门很大的学问,当然其它数据库也是如此,即使你不是DBA,做为一名程序员掌握一些基本的优化信息,也可以让你在自己的程序开发中受益匪浅.当然数据库的优化有很 ...
- mysql数据库的水平分表与垂直分表实例讲解
mysql语句的优化有局限性,mysql语句的优化都是围绕着索引去优化的,那么如果mysql中的索引也解决不了海量数据查询慢的状况,那么有了水平分表与垂直分表的出现(我就是记录一下自己的理解) 水平分 ...
- TDSQL MySQL版基本原理-水平分表 读写分离 弹性扩展 强同步
TDSQL MySQL版(TDSQL for MySQL)是部署在腾讯云上的一种支持自动水平拆分.Shared Nothing 架构的分布式数据库.TDSQL MySQL版 即业务获取的是完整的逻辑库 ...
随机推荐
- Mac环境下PHPstorm配置xdebug开发调试web程序
一.安装PHP的xdebug扩展 安装xdebug(技巧,为了找到适配的版本,让xdebug网站根据phpinfo()函数输出分析找到对应的方法及安装步骤:如果安装了多个PHP版本的话,尽量用phpi ...
- ora-01658: 无法为表空间*****中的段创建 INITIAL 区
ora-01658: 无法为表空间*****中的段创建 INITIAL 区 原因:表空间不足 增大表空间.如果表空间动态增长,则扩大表空间的最大值.
- WPF ComboBox下拉绑定Treeview 功能的实现
因为项目需要,接触到这个功能点,借助网络还有自己的一点摸索,实现了这个功能.相关代码如下: XAML部分的代码: <ComboBox Grid.Row=" RenderTransfor ...
- java项目-----客户端与客户端通信--实现群聊功能的代码
这是这个网络聊天室项目的原理图: 很简单,首先ABCD是4个客户端,当A发送信息给服务器,服务器实现以广播的形式把信息全发给每个人---群发群聊 客户端代码: package com.aa; impo ...
- Java 父类、静态、子类执行顺序
顺序: 父类的静态,子类静态,父类非静态,父类构造方法,子类非静态,子类构造方法. public class A { static String name = "cjj"; int ...
- 一个for循环写出9*9乘法表
public class ClassTest03 { public static void main(String[] args) { for(int i=1,j=1;j<=9;j++){ if ...
- zookeeper实战:SingleWorker代码样例
我们需要一个“单点worker”系统,此系统来确保系统中定时任务在分布式环境中,任意时刻只有一个实例处于活跃:比如,生产环境中,有6台机器支撑一个应用,但是一个应用中有30个定时任务,这些任务有些必须 ...
- Zabbix 添加 WEB 监控
添加 WEB Monitorings Web Monitoring是用来监控web程序的,可以监控到web程序的下载速度.返回码及响应时间,还支持把一组连续的web动作作为一个整体来监控. 下面我们以 ...
- canvas之太阳系效果
星球 变量名 公转周期 光色 暗色 水星 Mercury 87.70 #a69697 #5c3e40 金星 Venus 224.701.70 #c4bbac #1f1315 地球 Earth 365. ...
- Java中RMI远程调用demo
Java远程方法调用,即Java RMI(Java Remote Method Invocation),一种用于实现远程过程调用的应用程序编程接口.它使客户机上运行的程序可以调用远程服务器上的对象.远 ...