成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

教你怎樣玩轉千萬級別的數據

大數據
大數據處理是一個頭疼的問題,特別當達不到專業DBA的技術水準時,對一些數據庫方面的問題感到無奈。所以還是有必要了解一些數據庫方面的技巧,當然,每個人都有自己的數據庫方面的技巧,只是八仙過海,所用的武功不同而已。

大數據處理是一個頭疼的問題,特別當達不到專業DBA的技術水準時,對一些數據庫方面的問題感到無奈。所以還是有必要了解一些數據庫方面的技巧,當然,每個人都有自己的數據庫方面的技巧,只是八仙過海,所用的武功不同而已。我把我最常用的幾種方式總結來與大家分享,大家還有更多的數據庫設計和優化的技巧,盡量的追加到評論中,有時一篇完整的博客評論比主題更為精彩。

方法1:采用表分區技術。

***次聽說表分區,是以前的一個oracle培訓。oracle既然有表分區,就想到mssql是否有表的分區,當時我回家就google了一把,資料還是有的,在這我兒只是再作一次推廣,讓更多的人了解和運用這些技術。

表分區,就是將一個數據量比較大的表,用某種方法把數據從物理上分成若干個小表來存儲,從邏輯來看還是一個大表。首先來個結構圖:

上圖雖然不能很清晰的表達表分區的執行過程,但是可以看出表分區要用到那些對象,比如數據文件,文件組,分區方案,分區函數等。

我們以一個用戶表(TestUser)為例,假設這個表準備用來存儲中國部分公民的數據,每條數據記錄著每個人所屬的省份(Area),以及每個人的姓名(UserName),如下圖所示。當數據量達到1千萬的時候,查詢就比較慢了,這時候的數據優化就迫在眉睫。

在優化之前,根據數據的結構,讀寫操作等,肯定會提出若干個解決方案。在這兒就以分區表的方案來優化數據庫的查詢,這兒以區域來分別存儲數據,比如廣東的公民存放在AreaFile01.MDF文件中,湖南的公民存放在AreaFile02.MDF的文件中,四川的公民存放在 AreaFile03.MDF的文件中,以此類推其它省份,為了實現這個功能我們就得做分區方案。在做分區方案時,首先要搞清楚分區方案要涉及到的四個對象:文件組,文件,分區函數,分區方案。

a:文件組,用來組織數據文件(.MDF)的一個虛擬名稱,一個文件組可以添加多個數據文件(.MDF)。打開SQL管理器,找到具體的數據庫,然后右鍵【屬性】,進入到【文件組】選項卡,添加Area01,Area02,Area03,Area04四個文件組。如圖:

 b:然后選擇中【文件】選項卡,添加 AreaFile01,AreaFile02,AreaFile03,AreaFile04,AreaFile0***reaFile06六個數據文件(.MDF),然后指定每個文件屬于那個文件組(一個文件組可以存儲多個數據文件),以及這個文件的物理路徑。在這兒大家已經看明白了,這些數據文件,就是物理上來分割一個數據表的數據的。也就是說一個表的數據有可能存儲在AreaFile01中,也有可能存儲在AreaFile02中,只要用某種方法來指定他們的存儲規則就行了。

c:分區函數,就是指定數據的存儲規則。就是告訴SQL,把新增的數據如何分區。創建一個分區函數,可以用下邊的SQL語句來實現。

  1. CREATE PARTITION FUNCTION partitionFunArea (nvarchar(50))  
  2. AS RANGE Left  FOR VALUES ('廣東','湖南','四川'

d:辛苦的創建了文件,又為其指定文件組,還建一個分區函數,目的只有一個,就是為了創建一個分區方案。分區方案可以用以下代碼來創建。

  1. CREATE PARTITION SCHEME partitionSchemeArea  
  2. AS PARTITION partitionFunArea  
  3. TO (  
  4.     Area01,  
  5.     Area02,  
  6.     Area03,  
  7.     Area04) 

經過緊張的四步操作,一個分區方案就呈現在我們的眼前了。接下來的事,就是我們要怎樣來消費這個分區方案。

首先我們創建一人普通的表,然后給這個表指定一個分區方案。如下代碼。

  1. CREATE TABLE TestUser(  
  2.     [Id] [int] IDENTITY(1,1) NOT NULL,  
  3.     [Area] nvarchar(50),  
  4.     [UserName] nvarchar(50)  
  5. ON partitionSchemeArea([Area]) 

為了能看到效果,再插入一些數據。

  1. INSERT TestUser ([Area],[UserName]) Values('四川','肖一');  
  2. INSERT TestUser ([Area],[UserName]) Values('四川','肖二');  
  3. INSERT TestUser ([Area],[UserName]) Values('四川','肖三');  
  4. INSERT TestUser ([Area],[UserName]) Values('四川','肖四');  
  5.  
  6. INSERT TestUser ([Area],[UserName]) Values('廣東','張一');  
  7. INSERT TestUser ([Area],[UserName]) Values('廣東','張二');  
  8. INSERT TestUser ([Area],[UserName]) Values('廣東','張三');  
  9.  
  10. INSERT TestUser ([Area],[UserName]) Values('湖南','楊一');  
  11. INSERT TestUser ([Area],[UserName]) Values('湖南','楊二'); 

查詢所有的數據,可以用select * from TestUser; 按分區查詢:就用如下方法:

  1. select $PARTITION.partitionFunArea([Area]) as 分區編號,count(id) as 記錄數   
  2. from TestUser group by $PARTITION.partitionFunArea([Area])  
  3. select * from TestUser where $PARTITION.partitionFunArea([Area])=1  
  4. select * from TestUser where $PARTITION.partitionFunArea([Area])=2  
  5. select * from TestUser where $PARTITION.partitionFunArea([Area])=3  
  6. select * from TestUser where $PARTITION.partitionFunArea([Area])=4 

效果圖:

你們看我一個簡單的表的分區是不是就已經完成了。呵呵,當然在實際應用中,僅僅掌握這點是不夠的,比如在原分區方案上添加一個分區刪除一個分區

#p#

方法2:用xml類型代替主從表設計,從而達到提高查詢性能。

優化和提高數據庫的性能,是從一個良好的數據庫設計開始的。以一個會議預訂系統為例,一個預訂會議系統包括了會議時間,會議地點,主持人,參與人,知會人,記錄者等相關信息。在的TDD,DDD模型主導的時代,在這兒為了更好的想表達我要闡述的問題,還是以表驅動模型來進行開發。

用戶需求:

a:一個會議可能有多個主持人,雖然這種情況比較少,但是也有可能有。

b:一個會議有多個參與人,這個不難理解。

c:一個會議有可能要讓某人知曉,這人可以參與或不參與會議,一般為高層。

d:一個會議有可能有零個或者多個記錄者。

e:一個會議需要遠程視頻,投影儀,電腦,麥克風等會議設備中的某些設備。

f:會議預訂成功,或者會議時間,會議地點等重要信息修改后,郵件通知與會人員。

常規數據庫設計:

a:建一個Meeting的主表,用于存放會議名稱,會議地點,會議時間等的相關信息。

b:再建一個MeetingUser的表存儲主持人,參與人,知會人,記錄者。

c:同樣,會議所需要的設備用MeetingDevice表來存儲相關的信息。如圖:

這樣的表結構,是比較常規的設計方法,但是在實際應用中,你會發現一些待改進的問題。比如:

a:在提取一個會議的相關信息時,會連接多個表進行查詢。這種查詢在很大的程序上影響了數據庫性能。

b:在做修改操作時也夠嗆的,先修改主表的相關信息,再把主表關聯的子表信息全部刪除重新插入一次,這樣的操作是否夠吐血了。當然有人精益求精,會比較修改前和修改后的數據,再用增加,刪除,修改的手段達到子表數據的更新。這樣的操作在有些ORM操作中已經實現了,但當自己code代碼來實現的時候,特別是在多次code的時候,感覺總是那么煩心。

吐槽了這么多,是否有更好的解決方案呢?當然,在SQL里,我們可以XML數據類型來消除主從表的設計。如圖:

上面的表結構設計,是不是有一個小清新的感覺呢?很明顯,可以把***種表的設計缺陷給消除了。一個會議的相關信息都存儲在了一個表的一條記錄中,這樣的數據看起來是不是更直觀呢?

a:獲取一個預訂會議的詳細信息,我不需要進行多個表的連接查詢,我要做的是只需用C#的Linq.Xml來解析查詢出來的XML字符串即可。

b:修改操作時,我只需要重新組合XML數據,一個Update就更新了與會議相關的信息,操作是不是簡單多了。

表面上看這種設計已經***了,但是用戶的需求是無止境的,有一天,你收到了一個需求,查詢某個用戶參與過的所有會議(就是只要主持人,參與人,或者記錄者中包括了這個用戶,就把這些記錄都給查詢出來),Oh!My God  這種表結構設計應該怎么解決這個問題呢?其實可以用XQuery解決這個問題,還沒接觸過XQuery的那得趕快充一下電了。XQuery中最常用的有 exist(),value()這些函數,這兒就不詳細的介紹了,網上搜索一下有很多相關資料,如果有必要,我會把以前項目中用的XQuery技巧與大家分享。

原文鏈接:http://www.cnblogs.com/xcj26/p/3305789.html

責任編輯:林師授 來源: 博客園
相關推薦

2024-07-22 11:48:42

2024-10-28 10:50:33

2011-08-10 15:58:12

WPS符號欄

2018-05-12 16:26:17

互聯網VPC子網

2024-04-09 12:08:51

Next組件Next.js

2021-07-30 16:01:05

大數據技術應用

2019-06-12 08:57:43

Oracle數據庫恢復

2021-05-18 14:42:55

PythonMySQL

2012-04-25 09:24:17

Java

2013-03-13 09:56:10

2015-03-23 12:33:28

2014-06-13 16:52:11

2012-04-17 14:33:00

牛排New iPad

2011-01-28 15:47:15

webOS 2.1

2020-03-24 08:32:24

vue作用域前端

2017-12-07 15:24:10

Hadoop大數據服務器

2019-12-04 08:44:59

前后端分離開發

2017-01-15 15:20:47

Linux編程log

2024-04-26 09:17:20

MySQL事務隔離

2015-10-26 09:37:27

數據中心互聯網思維
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品视频在线播放 | 欧美色综合| 天天草天天干天天 | 久久久高清 | www.色婷婷| 国产精品久久久久久久久久久新郎 | 日本在线免费看最新的电影 | 女同久久另类99精品国产 | 欧美狠狠操 | 欧美一级片黄色 | 免费午夜电影 | 亚洲精品第一页 | 国产精品福利在线观看 | 欧美一级电影免费 | 中文字幕电影在线观看 | 欧美一区二区三区在线观看 | 在线视频 中文字幕 | 黄色一级大片在线免费看产 | 精品乱码一区二区三四区视频 | 国产精品99久久久久久www | 久久亚洲精品久久国产一区二区 | 黄色播放 | 国产精品国产三级国产aⅴ中文 | 毛片免费观看 | 日韩欧美三区 | 久久久久国产 | 一区二区三区四区在线视频 | 国内av在线 | 色综合99| 亚洲欧美精品久久 | 一区二区三区四区国产 | 在线一区二区国产 | 日韩在线中文字幕 | 亚洲色图综合网 | 天堂综合| 国产精品国产精品国产专区不卡 | 精品久久国产 | 亚洲一区二区在线播放 | 欧美日韩视频一区二区 | 国产欧美一区二区三区在线看 | 国内精品99 |