亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > SqlServer 垂直分表(減少程序改動)

SqlServer 垂直分表(減少程序改動)

熱門標簽:在電子版地圖標注要收費嗎 武漢AI電銷機器人 外呼系統會封嗎 電銷機器人 深圳 地圖標注如何弄全套標 萬利達綜合醫院地圖標注點 股票配資電銷機器人 實體店地圖標注怎么標 南京電銷外呼系統哪家好

由于sqlserver的設計特殊性,一般大量數據一般都是采用水平分表,而垂直分表只是把text、圖片都較大數據放到單獨的表中,這樣數據設計會更合理,相對于mysql可能要好一點,mssql本來就是一個文件,基本上提升不大,目前來看幾十萬的數據沒有分不分表沒有任何影響,對于千萬以上數據還是采用水平分表比較好。

而 垂直分表 則相對很少見到和用到,因為這可能是數據庫設計上的問題了。如果數據庫中一張表有部分字段幾乎從不不更改但經常查詢,而部分字段的數據頻繁更改,這種設計放到同一個表中就不合理了,相互影響太大了。在已存在改情況的表的時候,可以考慮按列拆分表,即垂直拆分。

由于垂直分表的案例比較少,最近因為存在這樣的表,所以個人搗鼓了一下。

源表設計結構:

--  源表
CREATE TABLE [dbo].[DemoTab](
[Guid] [uniqueidentifier] NOT NULL,
[UserName] [nvarchar](30) NOT NULL,
[Password] [nvarchar](30) NOT NULL,
[UserAccount] [varchar](30) NOT NULL,
[Amount] [numeric](18, 4) NULL,
CONSTRAINT [PK_DemoTab] PRIMARY KEY CLUSTERED ([Guid])
)
GO
 
 
ALTER TABLE [dbo].[DemoTab] 
ADD CONSTRAINT [DF_DemoTab_Guid] DEFAULT (newsequentialid()) FOR [Guid]
GO
 
--  原來是訪問視圖的(好處就是視圖層不變)
CREATE VIEW [dbo].[VDemoTab]
AS
SELECT [Guid],[UserName],[Password],[UserAccount],[Amount]
FROM [dbo].[DemoTab]
GO

注:拆分后各表的主鍵都是相同了,而且拆分后的表是規范化的。

現在拆成兩張表:

注意選擇一張表作為基表,其他表都有與該表的外鍵。

--  分表【1】,以該表為"主表",其他拆分出的表為"子表"
CREATE TABLE [dbo].[DemoTab001](
[Guid] [uniqueidentifier] NOT NULL,
[UserName] [nvarchar](30) NOT NULL,
[Password] [nvarchar](30) NOT NULL,
CONSTRAINT [PK_DemoTab001] PRIMARY KEY CLUSTERED ([Guid])
)
GO
 
--  主鍵默認值可以不需要,因為插入數據前需要確定主鍵值
--ALTER TABLE [dbo].[DemoTab001] 
--ADD CONSTRAINT [DF_DemoTab001_Guid] DEFAULT (newsequentialid()) FOR [Guid]
--GO
 
--  分表【2】,"子表"
CREATE TABLE [dbo].[DemoTab002](
[Guid] [uniqueidentifier] NOT NULL,
[UserAccount] [varchar](30) NOT NULL,
[Amount] [numeric](18, 4) NULL,
CONSTRAINT [PK_DemoTab002] PRIMARY KEY CLUSTERED ([Guid])
)
GO
 
--  主鍵默認值可以不需要,因為插入數據前需要確定主鍵值
--ALTER TABLE [dbo].[DemoTab002] 
--ADD CONSTRAINT [DF_DemoTab002_Guid] DEFAULT (newsequentialid()) FOR [Guid]
--GO
 
 
--  若主表變更主鍵則級聯更新或刪除(主鍵通常是不更新的,也可省去 ON UPDATE CASCADE)
ALTER TABLE [dbo].[DemoTab002] 
ADD CONSTRAINT [FK_DemoTab002_DemoTab001_Guid] FOREIGN KEY ([Guid]) 
REFERENCES [DemoTab001]([Guid]) ON UPDATE CASCADE ON DELETE CASCADE
GO

如果之前是對單個表或者視圖操作,拆分之后邏輯層改動可能很多,為保持改動最小,可以用聯合視圖操作。怎么連接表依個人情況而定。

--  拆分后使用聯合視圖(INNER JOIN 也可以)
ALTER VIEW [dbo].[VDemoTab]
AS
SELECT T1.[Guid],T1.[UserName],T1.[Password],T2.[UserAccount],T2.[Amount]
FROM [dbo].[DemoTab001] T1 LEFT JOIN [dbo].[DemoTab002] T2 ON T1.[Guid]=T2.[Guid]
GO

這時問題來了,要對表進行DML操作,insert , update , delete 怎么解決?因為要求主鍵是分散在多個表并且是相同的!

這時只能用考慮觸發器來保證一致性了,觸發器則定義在視圖上,使用的是 INSTEAD OF 類型的觸發器。

insert 觸發器:

視圖 [VDemoTab] 中的 [Guid] 為表 插入時值,在插入觸發器中,虛擬表[inserted]的[Guid]是唯一的,所以在觸發器中可以同時使用該 [Guid] 插入到多個分表中,保證了多個分表的[Guid]是相同的!

--  insert 觸發器
CREATE TRIGGER [dbo].[tgr_VDemoTab_insert]
ON [dbo].[VDemoTab] 
INSTEAD OF INSERT
AS 
BEGIN
 INSERT INTO [dbo].[DemoTab001]([Guid],[UserName],[Password])
 SELECT [Guid],[UserName],[Password] FROM inserted;
 
 INSERT INTO [dbo].[DemoTab002]([Guid],[UserAccount],[Amount])
 SELECT [Guid],[UserAccount],[Amount] FROM inserted;
END
GO

update 觸發器:

同理,更新時涉及虛擬表 deleted 和 inserted,而更新是對視圖[VDemoTab]更新的,所以虛擬表inserted包括了所有的字段,所以需要觸發器分別更新多個分表。

--  update 觸發器
CREATE TRIGGER [dbo].[tgr_VDemoTab_update]  
ON [dbo].[VDemoTab]   
INSTEAD OF UPDATE  
AS
BEGIN
 UPDATE T1 SET 
 T1.[UserName] = T2.[UserName], 
 T1.[Password] = T2.[Password]
 FROM [dbo].[DemoTab001] AS T1, inserted AS T2 WHERE T1.[Guid] = T2.[Guid] 
 
 UPDATE T1 SET 
 T1.[UserAccount] = T2.[UserAccount], 
 T1.[Amount] = T2.[Amount]
 FROM [dbo].[DemoTab002] AS T1, inserted AS T2 WHERE T1.[Guid] = T2.[Guid] 
END
GO

delete 觸發器:

刪除視圖[VDemoTab]記錄,涉及多個表則不允許刪除,因此只要刪除"主表"的記錄即可,其他分表都會級聯刪除。

--  delete 觸發器
CREATE TRIGGER [dbo].[tgr_VDemoTab_delete]  
ON [dbo].[VDemoTab]   
INSTEAD OF DELETE  
AS
BEGIN
    DELETE FROM [dbo].[DemoTab001]
    WHERE [Guid] IN (SELECT [Guid] FROM deleted)
END
GO

設計基本就完成了,現在進行測試。

INSERT INTO [dbo].[VDemoTab]([Guid],[UserName],[Password],[UserAccount],[Amount])
SELECT NEWID(),'user01','pw01','account01',100
UNION ALL
SELECT NEWID(),'user02','pw02','account02',99
UNION ALL
SELECT NEWID(),'user03','pw03','account03',0
GO
 
UPDATE [VDemoTab] SET [Password]='pw',[Amount]='10'
WHERE [Amount] >=0 AND [Amount]100 AND [UserName] LIKE '%3'
GO
 
DELETE FROM [VDemoTab] WHERE [UserName] = 'user03'
GO
 
SELECT * FROM [dbo].[DemoTab001] 
SELECT * FROM [dbo].[DemoTab002] 
SELECT * FROM [dbo].[VDemoTab]

基本操作都是正常的!垂直分表完成!

性能怎么樣呢?

由于 Guid 作為主鍵,使用的是 NEWID() 而不是  NEWSEQUENTIALID(),新增記錄時聚集索引都可能重新排序較多數據。

分表之后,單個數據頁能存儲的數據更多了,但是分成多個表中,數據頁也增多了,同時 Guid 在每個表都存在,所以查詢數據時IO會更多。

對于更新數據,在觸發器中是兩個表同時更新的,即使更新其中一個分表,其他分表都會影響。如果分表之后不同時更新,可以在觸發器中使用 if(update(col)) 來判斷更新的是那一列,就更新相應的基表就行,其他分表不更新。

最好的情況就是,拆分后的表都是“獨立”的,不用聯合視圖,查詢和更改都獨立,這需要更改邏輯層。

到此這篇關于SqlServer 垂直分表(減少程序改動)的文章就介紹到這了,更多相關SqlServer 垂直分表內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • sqlserver2017共享功能目錄路徑不可改的解決方法
  • SQLServer2008提示評估期已過解決方案
  • SQLServer2019 數據庫的基本使用之圖形化界面操作的實現
  • SQLServer2019 數據庫環境搭建與使用的實現
  • SQLServer 日期函數大全(小結)
  • SQLServer2019配置端口號的實現
  • sqlserver主鍵自增的實現示例
  • C語言中操作sqlserver數據庫案例教程

標簽:武威 泰安 濟寧 安徽 汕頭 廣東 臺州 濟源

巨人網絡通訊聲明:本文標題《SqlServer 垂直分表(減少程序改動)》,本文關鍵詞  SqlServer,垂直,分表,減少,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SqlServer 垂直分表(減少程序改動)》相關的同類信息!
  • 本頁收集關于SqlServer 垂直分表(減少程序改動)的相關信息資訊供網民參考!
  • 推薦文章
    欧美a级片视频| 欧美激情影院| 欧美激情一区二区三区视频| 国产伦精品一区三区视频| 久久精品免视看国产成人2021| 国产麻豆精品免费密入口| 欧美a级大片| 韩国三级香港三级日本三级la| 国产一级生活片| 成人影院一区二区三区| 国产视频一区二区在线播放| 91麻豆精品国产自产在线| 免费的黄色小视频| 欧美a级v片不卡在线观看| 亚洲精品永久一区| 天天色色网| 国产国语对白一级毛片| 国产极品精频在线观看| 日日爽天天| 九九精品久久| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产伦精品一区二区三区无广告| 欧美电影免费看大全| 国产不卡在线看| 四虎影视久久久免费| 九九热国产视频| 欧美另类videosbestsex视频 | 国产一区二区精品| 日本在线www| 成人免费福利片在线观看| 亚洲 国产精品 日韩| 你懂的日韩| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久久久久久久综合影视网| 亚洲第一视频在线播放| 精品视频在线观看一区二区三区| 国产美女在线观看| 日日夜夜婷婷| 欧美国产日韩在线| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久99青青久久99久久| 亚洲不卡一区二区三区在线| 国产精品1024永久免费视频 | 精品国产亚一区二区三区| 日本伦理片网站| 精品视频免费看| 四虎久久精品国产| 国产成人精品综合| 久久国产精品永久免费网站| 免费的黄色小视频| 国产成人欧美一区二区三区的| 午夜久久网| a级精品九九九大片免费看| 精品毛片视频| 一级片片| 成人免费网站久久久| 999精品在线| 精品国产三级a| 国产精品自拍在线观看| 亚洲第一视频在线播放| 国产伦精品一区三区视频| 青草国产在线| 欧美日本免费| 国产麻豆精品视频| 青草国产在线观看| 国产一区二区精品久久91| 欧美另类videosbestsex高清| 韩国毛片 免费| 可以在线看黄的网站| 亚洲第一视频在线播放| 精品毛片视频| 国产原创中文字幕| 青草国产在线| 欧美激情一区二区三区在线| 九九久久99综合一区二区| 欧美a级片视频| 美女被草网站| 日韩男人天堂| 日本免费乱人伦在线观看 | 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美国产日韩精品| 日本特黄特色aaa大片免费| 九九免费高清在线观看视频| 97视频免费在线| 毛片的网站| 久久国产影视免费精品| 欧美另类videosbestsex| 免费毛片播放| 免费的黄色小视频| 国产亚洲精品aaa大片| 九九九在线视频| 成人高清视频在线观看| 国产精品免费久久| 欧美激情一区二区三区视频高清| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 九九免费高清在线观看视频| 国产不卡精品一区二区三区| 国产网站在线| 可以免费看污视频的网站| 999久久66久6只有精品| 国产精品自拍在线观看| 国产原创视频在线| 国产亚洲免费观看| 九九精品在线播放| 精品国产一区二区三区免费| 91麻豆tv| 深夜做爰性大片中文| 黄视频网站在线看| 韩国三级香港三级日本三级la| 成人影院一区二区三区| 日本伦理网站| 91麻豆国产福利精品| 国产激情视频在线观看| 日韩免费在线视频| 成人高清视频在线观看| 欧美一级视频免费观看| 一本高清在线| 亚欧视频在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 色综合久久天天综合绕观看| 欧美a级成人淫片免费看| 日本特黄特黄aaaaa大片| 国产网站免费在线观看| 午夜久久网| 欧美a级成人淫片免费看| 国产一区精品| 国产一区二区精品久久| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日本伦理黄色大片在线观看网站| 午夜在线影院| 一本伊大人香蕉高清在线观看| 国产精品自拍在线观看| 欧美电影免费| 精品国产三级a| 国产一区免费观看| 国产精品免费久久| 你懂的日韩| 免费国产在线观看| 成人在激情在线视频| 国产a免费观看| 欧美激情中文字幕一区二区| 一级女性全黄生活片免费| 欧美激情一区二区三区在线| 成人高清护士在线播放| 午夜欧美福利| a级精品九九九大片免费看| 久草免费在线视频| 91麻豆爱豆果冻天美星空| 亚洲爆爽| 韩国三级视频在线观看| 国产亚洲免费观看| 亚洲 国产精品 日韩| 九九热精品免费观看| 国产不卡福利| 九九九国产| 国产美女在线一区二区三区| 国产伦精品一区二区三区无广告| 日本特黄特色aaa大片免费| 午夜欧美成人香蕉剧场| 国产视频一区二区在线播放| 成人免费网站久久久| 香蕉视频亚洲一级| a级毛片免费全部播放| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 成人免费网站久久久| 国产成人啪精品视频免费软件| 午夜欧美成人香蕉剧场| 国产a免费观看| 日韩男人天堂| 国产伦久视频免费观看视频| 亚洲www美色| 99久久精品国产高清一区二区 | 天天做人人爱夜夜爽2020| 国产欧美精品| 可以免费看污视频的网站| 九九精品影院| 精品视频在线看 | 国产麻豆精品高清在线播放| 毛片高清| 精品视频在线看 | 久久精品大片| 黄色免费三级| 成人影院一区二区三区| 日韩一级黄色| 亚洲爆爽| 久久精品大片| 久久久久久久网| 国产视频一区二区在线播放| 999精品影视在线观看| 日本在线不卡免费视频一区| 日韩中文字幕一区二区不卡| 青青久久精品国产免费看| 欧美18性精品| 精品国产一区二区三区久久久狼 | 欧美大片a一级毛片视频| 国产成人精品在线| 国产视频网站在线观看| 国产麻豆精品免费视频| 精品久久久久久免费影院| 精品久久久久久综合网|