1. 程式人生 > >SqlServer 分割槽檢視實現水平分表

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 
[email protected]
@SPID COMMIT TRAN


id = 3000 在表 [DemoTab01] 中,對檢視的查詢轉化為對錶的查詢,但是其他表則都加上了意向排它鎖(IX),這樣在大量併發中勢必影響到其他使用者的訪問。

執行計劃中,不符合條件的都進行了常量掃描,實際並不讀取資料,但也增加了開銷。

參考:

相關推薦

SqlServer 分割槽檢視實現平分

我們都知道在資料庫資料量較多的時候,可資料進行水平擴充套件,如分庫,分割槽,分表(也叫分割槽)等。對於分表的一個方案,就是使用分割槽檢視實現。 分割槽檢視允許將大型表中的資料拆分成較小的成員表。根據其中一列中的資料值範圍,在各個成員表之間對資料進行分割槽。每個成員表的資料

mysql使用MRG_MyISAM(MERGE)實現平分

在MySql中資料的優化尤其是大資料量的優化是一門很大的學問,當然其它資料庫也是如此,即使你不是DBA,做為一名程式設計師掌握一些基本的優化資訊,也可以讓你在自己的程式開發中受益匪淺。當然資料庫的優化有很多的方方面面,本篇主要講,Mysql的水平分表技術,也可以說是其技術的其中之一。 在使用水平

MySql(二十八)--平分程式碼實現

  DROP TABLE IF EXISTS `tbl_servers`; CREATE TABLE `tbl_servers` ( `uuid` int(11) NOT NULL AUTO_INCREMENT, `sid` varchar(10) NOT NULL,

Sqlserver平分

原文:https://blog.csdn.net/exceptionalboy/article/details/78851327 先搬過來,留著以後可能用 需求說明: 將資料庫Demo中的表按照日期欄位進行水平分割槽分表。要求資料檔案按一年一個檔案儲存,且分割槽的分割點會根據時間的增

MySQL基礎系列之 記一次利用儲存過程實現2600萬資料平分

日常開發中我們經常會遇到大表的情況,所謂的大表是指儲存了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,導致資料庫在查詢和插入的時候耗時太長,效能低下,如果涉及聯合查詢的情況,效能會更加糟糕。分表的目的就是減少資料庫的負擔,提高資料庫的效率,通常點來講就是提高表的增刪改查效率,本文將介紹我

mysql15--垂直分平分

mysql 支持 post 示意圖 拆分 engine 技術分享 分割 set ?分表技術(表的結構不能變) 分表技術有(水平分割和垂直分割) 當一張越來越大時候,即使添加索引還慢的話,我們可以使用分表 以qq用戶表來具體的說明一下分表的操作. 思路如圖 : 首先我創建

數據庫平分(一個大數據量的

大數據量 book sof span pan mil QQ 大數 mic 一、當一張表很大時,比如微信賬號、facebook賬號、QQ號、谷歌賬號系統等,都是大數據量的一張表結構。那麽必然需要進行拆分,即水平拆分。 二、表的水平拆分規則。數據庫水平分表(一個大數據量的表)

Mysql常見的平分

根據經驗,Mysql表資料一般達到百萬級別,查詢效率會很低,容易造成表鎖,甚至堆積很多連線,直接掛掉;水平分表能夠很大程度較少這些壓力。 1.按時間分表 這種分表方式有一定的侷限性,當資料有較強的實效性,如微博傳送記錄、微信訊息記錄等,這種資料很少有使用者會查詢幾個月前

MySQL資料庫平分策略--一致性hash

一致性hash演算法緣起 一致性雜湊演算法在1997年由麻省理工學院提出的一種分散式雜湊(DHT)實現演算法,設計目標是為了解決因特網中的熱點(Hot spot)問題,初衷和CARP十分類似。一致性雜湊修正了CARP使用的簡 單雜湊演算法帶來的問題,使得分散式

mycat平分

和垂直分庫不同,水平分表,是將那些io頻繁,且資料量大的表進行水平切分。 基本的配置和垂直分庫一樣,我們需要改的就是我們的 schema.xml和rule.xml檔案配置(server.xml不用做任何修改) 除此之外,我們還需要在兩個分片資料庫伺服器上建立分片用的資料庫10.0.4.181上建立(or

使用ViewPager和RecyclerView實現平分頁功能

/** * ght (c) 2007-2017 xxx Inc. All rights reserved. * * @author lzz * Created 2017/5/4 10:07 * @license http://www.x

Recyclerview最最簡單實現平分頁GridView效果

前言 昨天UI妹子給了給需求,展示水平分頁效果,而且第二頁要預設顯示一部分,提示使用者水平可以滑動,先上效果圖: 很明顯橫向滑動的分頁,第一反應就是使用ViewPager,畢竟只要通過自定義ViewPager,實現這個效果還是很容易,但是實際中問題時,當

MySql平分方案,自己親測

場景:使用者註冊後,在使用者登入的時候,可以通過使用者名稱,手機號,郵箱進行登入。 分表方案: 使用者表 user_1,user_2,user_3............user_10 儲存關係表:uid_1,uid_2.........uid_20 uid_n的欄位:uid(使用c

Mysql常見平分方案

根據經驗,Mysql表資料一般達到百萬級別,查詢效率會很低,容易造成表鎖,甚至堆積很多連線,直接掛掉;水平分表能夠很大程度較少這些壓力。 1.按時間分表 這種分表方式有一定的侷限性,當資料有較強的實效性,如微博傳送記錄、微信訊息記錄等,這種資料很少有使用者會查詢幾個月前的

資料庫分庫分-平分筆記

分表筆記    作者Q:359559774  一起探討 場景,主表與從表進行關聯,主表資料較小,百萬內,從表較大 分表方式:userId%從表分表總數 求餘得到所在分表,主表不切分,從表切分 (例如從表按照主表userId進行切分) 結合業務邏輯和表間關係,將當前shar

Sharding-JDBC資料分庫分實踐(平分

摘要 範圍(range)分表也需要確切(precise)分表策略,這點很重要。 確切分表根據分表字段確定資料落在哪一個庫。 範圍分

記一次平分實踐(sharding-jdbc)

摘要 本文示例是按月水平分表。存在一下兩點不足: 分表主鍵沒有設計好,本文用的是自增長id,沒有把時間組合到主鍵中,導致少了一個

sqlserver 觸發器實現對a操作時操作其他

CREATE TABLE tab1( tab1_id varchar(11) ); CREATE TABLE tab2( tab2_id varchar(11) ); CREATE TRIGGER insertname ON tab1 AFTER INSERT AS BEGIN INSERT

SqlServer 檢視被鎖的和解除被鎖的

檢視被鎖的表 1 2 select   request_session_id   spid,OBJECT_NAME(resource_associated_entity_id) tableName   from   sys.dm

利用Sqlserver的CDC功能實現2張的同步更新

Sqlserver利用CDC功能實時同步兩張表資料一  適用環境僅在SQLServer2008(含)以後的企業版、開發版和評估版中可用。 在開啟CDC功能前,記得要把sqlserver的代理伺服器開啟。、 二 CDC功能大概介紹CDC(change data capture)功能主要捕獲SQLS