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版 即业务获取的是完整的逻辑库 ...
随机推荐
- 常用 Git 命令使用教程
下面整理一下自己在开发过程中经常使用到的 Git 命令.使用 GUI 工具的同学,也可以对照起来看看. Git 配置 1. 在安装完成 Git 后,开始正式使用前,是需要有一些全局设置的,如用户名.邮 ...
- MEF学习总结(1)---总体架构
用了很久的MEF框架来做依赖注入,最近想把它的原理和机构总结一下,主要包括如下几个方面: 1. 总体架构 2. .Net Composition Primitive 3. Attribute Mode ...
- 选择排序算法-python实现
#-*- coding: UTF-8 -*- import numpy as np def SelectSort(a): for i in xrange(0,a.size): min = a[i] p ...
- redis+php实现微博功能(一)
(一).微博功能概况 微博用户账号注册 微博用户登录 微博发布 添加微博好友(粉丝) 微博推送 微博冷数据写入mysql数据库 (二).redis数据结构设计 这节分享微博用户注册与登录:我们完全采用 ...
- 【转】使用JMeter做性能测试的心得
企业应用开发过程中,性能测试是很重要的一个环节,在这个环节中Apache的JMeter以它开源.100%纯Java.操作方便等优点发挥着很大的作用. 经过一段时间的使用,多少有些心得和技巧,拿出来共享 ...
- ALSA声卡09_从零编写之参数设置_学习笔记
1.参数设置分析 (1)open: soc_pcm_open 依次调用cpu_dai, dma, codec_dai, machine的open或startup函数 只在dma的open函数里添加参数 ...
- VMware 虚拟机中添加新硬盘的方法(转载)
随着在虚拟机中存储的东西的逐渐的增加,虚拟机的硬盘也逐渐告急,因此急需拓展一块新的虚拟磁盘.以下便是在VMware 中添加新的虚拟磁盘的方法: 一.VMware新增磁盘的设置步骤 (建议:在设置虚 ...
- openstack网络架构(nova-network/neutron)
openstack网络体系中,网络技术没有创新,但用到的技术点非常庞杂,包括bridge.vlan.gre.vxlan.ovs.openflow.sdn.iptables等,当然这里不会做具体技术介绍 ...
- Android屏幕适配方案——基于最小宽度(Smallest-width)限定符
转自:https://www.cnblogs.com/error404/p/3815739.html 一.关于布局适配建议 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_ ...
- Tkinter Scrollbar(垂直滚动部件)
Python GUI - Tkinter Scrollbar:这个小工具提供了一个幻灯片控制器,用于实现垂直滚动部件,如列表框,文本和帆布.请注意,您还可以创建进入部件的水平滚动条 这个小工具提供 ...