亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

為什麼我們一般會在自增列或交易時間列上建立聚集索引?

2024-07-21 02:51:00
字體:
來源:轉載
供稿:網友
為什麼我們一般會在自增列或交易時間列上建立聚集索引?為什麼我們一般會在自增列或交易時間列上建立聚集索引?

到新公司上班也有一段時間了,感覺現在的自己才開始慢慢學習SQL~

看這篇文章之前,大家可以先看一下我之前寫的一篇文章

聚集索引表插入數據和刪除數據的方式是怎樣的

一般的交易系統里面我們都會以自增列或交易時間列作為聚集索引列,因為一般這些系統都是寫多讀少

每天的交易數據會不停的插入到數據庫,但是讀取數據就沒有數據插入那么頻繁

因為這些系統一般是寫多讀少,所以我們會選擇在自增列或交易時間列上建立聚集索引


測試

測試環境:SQLSERVER2012 SP1 WINDOWS7 64位

我們來做一個測試,測試腳本如下:

 1 --測試腳本  插入性能 2 USE [test] 3 GO 4 --建表 以transtime為聚集索引列 5 CREATE TABLE transtable(tranid INT ,transtime DATETIME) 6 GO 7 CREATE CLUSTERED INDEX CIX_transtable ON [dbo].[transtable]([transtime]) 8 GO 9 10 --建表 以tranid為聚集索引列11 CREATE TABLE transtable2(tranid INT ,transtime DATETIME)12 GO13 CREATE CLUSTERED INDEX CIX_transtable2 ON [dbo].[transtable2]([tranid])14 GO15 16 17 ----------------------------------------------------------18 --先插入測試數據,插入的tranid都為基數19 DECLARE @i INT20 SET @i = 121 WHILE @i <= 100000022     BEGIN 23         INSERT  INTO [dbo].[transtable]24                 SELECT  @i , GETDATE()25         SET @i = @i + 226     END27 --------------------------------------28 DECLARE @i INT29 SET @i = 130 WHILE @i <= 100000031     BEGIN 32         INSERT  INTO [dbo].[transtable2]33                 SELECT  @i , GETDATE()34         SET @i = @i + 235     END36 37 -------------------------------------------

在transtable表上的transtime(交易時間)上建立聚集索引,在transtable2表上的tranid(交易編號)上建立聚集索引

我們分別在兩個表上插入500000條記錄,插入的時候有個特點,就是插入的tranid都是基數

1 SELECT COUNT(*) FROM [dbo].[transtable]2 SELECT COUNT(*) FROM [dbo].[transtable2]3 4 SELECT TOP 10 * FROM [dbo].[transtable] ORDER BY [tranid]5 SELECT TOP 10 * FROM [dbo].[transtable2] ORDER BY [tranid] 

我們創建兩個存儲過程,這兩個存儲過程為插入到表數據

 1 -------------------------------------------- 2 --創建兩個存儲過程 3 CREATE PROC INSERTTranstable 4 AS 5     DECLARE @i INT 6     SET @i = 1 7     WHILE @i <= 1000 8         BEGIN  9             IF ( @i % 2 = 0 )10                 BEGIN11                     INSERT  INTO [dbo].[transtable]12                             SELECT  @i ,13                                     GETDATE()14                     SET @i = @i + 115                 END16             ELSE17                 BEGIN18                     SET @i = @i + 119                     CONTINUE 20                 END21         END22 ------------------------------------------23 CREATE PROC INSERTTranstable224 AS25     DECLARE @i INT26 SET @i = 127 WHILE @i <= 100028     BEGIN 29         IF ( @i % 2 = 0 )30             BEGIN31                 INSERT  INTO [dbo].[transtable2]32                         SELECT  @i ,33                                 GETDATE()34                 SET @i = @i + 135             END36         ELSE37             BEGIN38              SET @i = @i + 139                 CONTINUE 40             END41     END42 -----------------------------
View Code

測試腳本,測試一下插入到兩個表的時間

 1 測試插入偶數行的性能 2 DECLARE @a DATETIME 3 DECLARE @b DATETIME 4 SELECT @a=GETDATE() 5 EXEC INSERTTranstable 6 SELECT @b=GETDATE() 7 SELECT @b-@a 8 -------------------------------------- 9 10 DECLARE @c DATETIME11 DECLARE @d DATETIME12 SELECT @c=GETDATE()13 EXEC INSERTTranstable214 SELECT @d=GETDATE()15 SELECT @d-@c
View Code

驗證一下偶數的交易編號是否已經插入到兩個表中

1 SELECT TOP 10 * FROM [dbo].[transtable] ORDER BY [tranid]2 SELECT TOP 10 * FROM [dbo].[transtable2] ORDER BY [tranid] 
View Code

我們看一下時間

第一個表

第二個表

很明顯,第一個表比第二個表快,因為的機器的硬盤是固態硬盤,時間差距不是很大,如果是機械硬盤時間差距會大一些,那么究竟為什麼會造成這種情況呢?

我們用下圖來解析一下

我們先說第二張表

當交易編號為2的那條記錄插入進來的時候,后面的記錄都需要向后移動,以使交易編號從小到大排序,因為聚集索引建立在交易編號列上

這個移動時間是有開銷的,而且每次偶數交易編號插入到表中,每插入一次就移動一次,而當前面的記錄插入到表中的時候移動的記錄數就越多

例如:tranid:2,transtime:2014-1-26 31:22.180插入到表中的時候后面的記錄都需要移動,而tranid:978,transtime:2014-01-26 00:29:10.830

這條記錄插入到表中的時候,后面需要移動的記錄數就沒有那么多,總之那個開銷挺大的。。。

第一張表的情況

因為第一張表是以交易時間為聚集索引列的,所以無論交易編號是多少,記錄都會插入到表的最后,因為后來的記錄的交易時間肯定比前面的記錄的交易時間大

這樣的話,基本上沒有開銷


現實系統中的情況

實際系統中,新生成的要插入到表中的交易編號是有可能小于當前表中的某條記錄的交易編號的,那么這時候記錄插入到表中就需要移位(如果聚集索引建立在交易編號上)

如果聚集索引建立在交易時間上,那么新生成的要插入到表中的交易記錄時間肯定會大于當前表中的任何一條交易記錄的時間

(除非人為修改系統時間造成當前時間比數據庫中的某些記錄的交易時間要早)


總結

前公司的數據庫有些表在自增列,有些表在交易時間列上建立了聚集索引,在交易時間列上建立聚集索引個人覺得很正常

因為在查詢的時候按照交易時間來排序《order by 交易時間》,速度上是很快的,但是除了排序之外還有一個作用就是本文所講到的

插入數據到表中的效率問題

個人覺得一般商場管理系統,油站管理系統都是這類型系統本文的意見純屬我自己的個人意見,并不一定適合您的系統,如果交易時間的選擇性不是太高的話,那么可能在交易時間或自增列上建立聚集索引就不是太合適了我們以前的系統的交易時間的選擇性是挺高的,而且通常查詢都需要按照交易時間排序,那么聚集索引列建立在交易時間上就是比較好了

本次實驗用到的完整腳本

  1 --測試腳本  插入性能  2 USE [test]  3 GO  4 --建表 以transtime為聚集索引列  5 CREATE TABLE transtable(tranid INT ,transtime DATETIME)  6 GO  7 CREATE CLUSTERED INDEX CIX_transtable ON [dbo].[transtable]([transtime])  8 GO  9  10 --建表 以tranid為聚集索引列 11 CREATE TABLE transtable2(tranid INT ,transtime DATETIME) 12 GO 13 CREATE CLUSTERED INDEX CIX_transtable2 ON [dbo].[transtable2]([tranid]) 14 GO 15  16 ---------------------------------------------------------- 17 --先插入測試數據,插入的tranid都為基數 18 DECLARE @i INT 19 SET @i = 1 20 WHILE @i <= 1000000 21     BEGIN  22         INSERT  INTO [dbo].[transtable] 23                 SELECT  @i , GETDATE() 24         SET @i = @i + 2 25     END 26 -------------------------------------- 27 DECLARE @i INT 28 SET @i = 1 29 WHILE @i <= 1000000 30     BEGIN  31         INSERT  INTO [dbo].[transtable2] 32                 SELECT  @i , GETDATE() 33         SET @i = @i + 2 34     END 35  36 ------------------------------------------- 37 SELECT COUNT(*) FROM [dbo].[transtable] 38 SELECT COUNT(*) FROM [dbo].[transtable2] 39  40 SELECT TOP 10 * FROM [dbo].[transtable] ORDER BY [tranid] 41 SELECT TOP 10 * FROM [dbo].[transtable2] ORDER BY [tranid]  42  43 -------------------------------------------- 44 --創建兩個存儲過程 45 CREATE PROC INSERTTranstable 46 AS 47     DECLARE @i INT 48     SET @i = 1 49     WHILE @i <= 1000 50         BEGIN  51             IF ( @i % 2 = 0 ) 52                 BEGIN 53                     INSERT  INTO [dbo].[transtable] 54                             SELECT  @
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产影院| 久久久久久久久中文字幕| 亚洲精品电影网在线观看| 久久精品国产精品亚洲| 91高清免费视频| 国产精品高清网站| 久久国产精品久久久| 国产精品久久久久不卡| 成人精品一区二区三区电影免费| 亚洲影影院av| 中文字幕精品久久久久| 色婷婷久久av| 欧美日韩国产丝袜另类| 亲子乱一区二区三区电影| 久久久91精品国产一区不卡| 亚洲国产美女精品久久久久∴| 日本在线精品视频| 亚洲精品456在线播放狼人| 亚洲国产欧美自拍| 国产一区二区三区高清在线观看| 欧美激情视频播放| 国a精品视频大全| 色香阁99久久精品久久久| 成人久久18免费网站图片| 日韩中文视频免费在线观看| 97精品视频在线观看| 欧美高清videos高潮hd| 久久精品一区中文字幕| 亚洲自拍另类欧美丝袜| 成人精品久久久| 亚洲自拍小视频免费观看| 欧美日韩中文字幕在线| 精品久久久久国产| 日韩精品中文字幕久久臀| 国产精品白嫩初高中害羞小美女| 国产精品免费福利| 亚洲娇小xxxx欧美娇小| 中文字幕日韩av电影| 亚洲片在线观看| 日韩电影免费观看在线| 精品久久久精品| 免费不卡欧美自拍视频| 韩国国内大量揄拍精品视频| 亚洲美女久久久| 国产日韩欧美在线| 国产自摸综合网| 国产视频在线观看一区二区| 亚洲欧洲一区二区三区久久| 国产成人激情小视频| 国产精品第三页| 在线视频国产日韩| 亚洲aⅴ日韩av电影在线观看| 国产精品爽黄69| 欧美日韩在线第一页| 韩日精品中文字幕| 国产精品视频自在线| 久久久久久高潮国产精品视| 亚洲一区二区久久久久久久| 色综合久久精品亚洲国产| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美视频在线观看 亚洲欧| 久久久国产精品免费| 欧美专区在线播放| 国产精品狼人色视频一区| 91久久在线视频| 久久香蕉频线观| 95av在线视频| 亚洲91av视频| 国产精品久久久久av免费| 国产精品影院在线观看| 亚洲自拍小视频| 精品久久久精品| 欧美日韩国产页| 亚洲天堂av综合网| 亚洲乱码av中文一区二区| 欧美日韩国产精品一区| 91精品国产91久久久久| 精品在线欧美视频| 国产区精品视频| 亚洲国产精品va在线观看黑人| 国产一区二区视频在线观看| 97精品一区二区三区| 日韩美女免费视频| 欧美激情中文字幕乱码免费| 亚洲free性xxxx护士白浆| 国产精品视频xxxx| 国产视频福利一区| 97国产精品人人爽人人做| 91欧美精品午夜性色福利在线| 国产精品美腿一区在线看| 国产91精品视频在线观看| 日韩电视剧免费观看网站| 中国人与牲禽动交精品| 国产精品久久久久久久久久尿| 大胆欧美人体视频| 精品成人av一区| 色哟哟网站入口亚洲精品| 日韩电影在线观看免费| 亚洲精品久久久久| 91精品久久久久久久久久久久久| 国产精品自拍偷拍视频| 国产精品久久久久91| 国产欧美va欧美va香蕉在线| 欧美整片在线观看| 91av在线播放视频| 欧美成人四级hd版| 欧美成人剧情片在线观看| 91高清在线免费观看| 亚洲成人免费在线视频| 色噜噜狠狠狠综合曰曰曰| 国产女同一区二区| 欧美视频精品一区| 亚洲精品99久久久久中文字幕| 色中色综合影院手机版在线观看| 亚洲综合中文字幕在线观看| 韩国三级电影久久久久久| 欧美专区日韩视频| 国产91精品久久久久| 日韩亚洲在线观看| 久久男人资源视频| 亚洲第一福利网| 欧美激情国产日韩精品一区18| 欧美激情视频一区二区| 国产精品亚洲欧美导航| 国产精品久久精品| 日韩黄色高清视频| 久久久在线视频| 国产精品日韩专区| 国产成人精品电影久久久| 91国产高清在线| 中文字幕不卡av| 久久99久久99精品免观看粉嫩| 国产精品揄拍一区二区| 欧美在线激情网| 国产精品黄页免费高清在线观看| 一区二区三区亚洲| 欧美精品在线观看| 91伊人影院在线播放| 欧美在线www| 亚洲国产欧美精品| 亚洲欧洲日产国码av系列天堂| 国产午夜一区二区| 亚洲成人动漫在线播放| 国产精品永久免费| 日韩精品视频在线播放| 欧美日韩国产综合视频在线观看中文| 最近中文字幕mv在线一区二区三区四区| 777午夜精品福利在线观看| 国产欧美日韩最新| 日韩免费在线电影| www.精品av.com| 亚洲第一中文字幕| 欧美麻豆久久久久久中文| 久久久久久久999| 欧美成人午夜激情在线| 国产成人+综合亚洲+天堂| 国产精品福利小视频| 欧美另类交人妖| 国产91免费看片| 日韩成人xxxx| 成人午夜黄色影院| 亚洲一区999| 欧美亚洲视频一区二区| 日本不卡视频在线播放|