SqlServer 分割槽檢視實現水平分表
我們都知道在資料庫資料量較多的時候,可資料進行水平擴充套件,如分庫,分割槽,分表(也叫分割槽)等。對於分表的一個方案,就是使用分割槽檢視實現。
分割槽檢視允許將大型表中的資料拆分成較小的成員表。根據其中一列中的資料值範圍,在各個成員表之間對資料進行分割槽。每個成員表的資料範圍都在為分割槽依據列指定的 CHECK 約束中定義。然後定義一個檢視,以使用 UNION ALL 將選定的所有成員表組合成單個結果集。引用該檢視的 SELECT 語句為分割槽依據列指定搜尋條件後,查詢優化器將使用 CHECK 約束定義確定哪個成員表包含相應行。
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