偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

教你怎樣玩轉(zhuǎn)千萬(wàn)級(jí)別的數(shù)據(jù)

大數(shù)據(jù)
大數(shù)據(jù)處理是一個(gè)頭疼的問(wèn)題,特別當(dāng)達(dá)不到專業(yè)DBA的技術(shù)水準(zhǔn)時(shí),對(duì)一些數(shù)據(jù)庫(kù)方面的問(wèn)題感到無(wú)奈。所以還是有必要了解一些數(shù)據(jù)庫(kù)方面的技巧,當(dāng)然,每個(gè)人都有自己的數(shù)據(jù)庫(kù)方面的技巧,只是八仙過(guò)海,所用的武功不同而已。

大數(shù)據(jù)處理是一個(gè)頭疼的問(wèn)題,特別當(dāng)達(dá)不到專業(yè)DBA的技術(shù)水準(zhǔn)時(shí),對(duì)一些數(shù)據(jù)庫(kù)方面的問(wèn)題感到無(wú)奈。所以還是有必要了解一些數(shù)據(jù)庫(kù)方面的技巧,當(dāng)然,每個(gè)人都有自己的數(shù)據(jù)庫(kù)方面的技巧,只是八仙過(guò)海,所用的武功不同而已。我把我最常用的幾種方式總結(jié)來(lái)與大家分享,大家還有更多的數(shù)據(jù)庫(kù)設(shè)計(jì)和優(yōu)化的技巧,盡量的追加到評(píng)論中,有時(shí)一篇完整的博客評(píng)論比主題更為精彩。

方法1:采用表分區(qū)技術(shù)。

***次聽(tīng)說(shuō)表分區(qū),是以前的一個(gè)oracle培訓(xùn)。oracle既然有表分區(qū),就想到mssql是否有表的分區(qū),當(dāng)時(shí)我回家就google了一把,資料還是有的,在這我兒只是再作一次推廣,讓更多的人了解和運(yùn)用這些技術(shù)。

表分區(qū),就是將一個(gè)數(shù)據(jù)量比較大的表,用某種方法把數(shù)據(jù)從物理上分成若干個(gè)小表來(lái)存儲(chǔ),從邏輯來(lái)看還是一個(gè)大表。首先來(lái)個(gè)結(jié)構(gòu)圖:

上圖雖然不能很清晰的表達(dá)表分區(qū)的執(zhí)行過(guò)程,但是可以看出表分區(qū)要用到那些對(duì)象,比如數(shù)據(jù)文件,文件組,分區(qū)方案,分區(qū)函數(shù)等。

我們以一個(gè)用戶表(TestUser)為例,假設(shè)這個(gè)表準(zhǔn)備用來(lái)存儲(chǔ)中國(guó)部分公民的數(shù)據(jù),每條數(shù)據(jù)記錄著每個(gè)人所屬的省份(Area),以及每個(gè)人的姓名(UserName),如下圖所示。當(dāng)數(shù)據(jù)量達(dá)到1千萬(wàn)的時(shí)候,查詢就比較慢了,這時(shí)候的數(shù)據(jù)優(yōu)化就迫在眉睫。

在優(yōu)化之前,根據(jù)數(shù)據(jù)的結(jié)構(gòu),讀寫操作等,肯定會(huì)提出若干個(gè)解決方案。在這兒就以分區(qū)表的方案來(lái)優(yōu)化數(shù)據(jù)庫(kù)的查詢,這兒以區(qū)域來(lái)分別存儲(chǔ)數(shù)據(jù),比如廣東的公民存放在AreaFile01.MDF文件中,湖南的公民存放在AreaFile02.MDF的文件中,四川的公民存放在 AreaFile03.MDF的文件中,以此類推其它省份,為了實(shí)現(xiàn)這個(gè)功能我們就得做分區(qū)方案。在做分區(qū)方案時(shí),首先要搞清楚分區(qū)方案要涉及到的四個(gè)對(duì)象:文件組,文件,分區(qū)函數(shù),分區(qū)方案。

a:文件組,用來(lái)組織數(shù)據(jù)文件(.MDF)的一個(gè)虛擬名稱,一個(gè)文件組可以添加多個(gè)數(shù)據(jù)文件(.MDF)。打開(kāi)SQL管理器,找到具體的數(shù)據(jù)庫(kù),然后右鍵【屬性】,進(jìn)入到【文件組】選項(xiàng)卡,添加Area01,Area02,Area03,Area04四個(gè)文件組。如圖:

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

c:分區(qū)函數(shù),就是指定數(shù)據(jù)的存儲(chǔ)規(guī)則。就是告訴SQL,把新增的數(shù)據(jù)如何分區(qū)。創(chuàng)建一個(gè)分區(qū)函數(shù),可以用下邊的SQL語(yǔ)句來(lái)實(shí)現(xiàn)。

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

d:辛苦的創(chuàng)建了文件,又為其指定文件組,還建一個(gè)分區(qū)函數(shù),目的只有一個(gè),就是為了創(chuàng)建一個(gè)分區(qū)方案。分區(qū)方案可以用以下代碼來(lái)創(chuàng)建。

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

經(jīng)過(guò)緊張的四步操作,一個(gè)分區(qū)方案就呈現(xiàn)在我們的眼前了。接下來(lái)的事,就是我們要怎樣來(lái)消費(fèi)這個(gè)分區(qū)方案。

首先我們創(chuàng)建一人普通的表,然后給這個(gè)表指定一個(gè)分區(qū)方案。如下代碼。

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

為了能看到效果,再插入一些數(shù)據(jù)。

  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('湖南','楊二'); 

查詢所有的數(shù)據(jù),可以用select * from TestUser; 按分區(qū)查詢:就用如下方法:

  1. select $PARTITION.partitionFunArea([Area]) as 分區(qū)編號(hào),count(id) as 記錄數(shù)   
  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 

效果圖:

你們看我一個(gè)簡(jiǎn)單的表的分區(qū)是不是就已經(jīng)完成了。呵呵,當(dāng)然在實(shí)際應(yīng)用中,僅僅掌握這點(diǎn)是不夠的,比如在原分區(qū)方案上添加一個(gè)分區(qū)刪除一個(gè)分區(qū)。

#p#

方法2:用xml類型代替主從表設(shè)計(jì),從而達(dá)到提高查詢性能。

優(yōu)化和提高數(shù)據(jù)庫(kù)的性能,是從一個(gè)良好的數(shù)據(jù)庫(kù)設(shè)計(jì)開(kāi)始的。以一個(gè)會(huì)議預(yù)訂系統(tǒng)為例,一個(gè)預(yù)訂會(huì)議系統(tǒng)包括了會(huì)議時(shí)間,會(huì)議地點(diǎn),主持人,參與人,知會(huì)人,記錄者等相關(guān)信息。在的TDD,DDD模型主導(dǎo)的時(shí)代,在這兒為了更好的想表達(dá)我要闡述的問(wèn)題,還是以表驅(qū)動(dòng)模型來(lái)進(jìn)行開(kāi)發(fā)。

用戶需求:

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

b:一個(gè)會(huì)議有多個(gè)參與人,這個(gè)不難理解。

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

d:一個(gè)會(huì)議有可能有零個(gè)或者多個(gè)記錄者。

e:一個(gè)會(huì)議需要遠(yuǎn)程視頻,投影儀,電腦,麥克風(fēng)等會(huì)議設(shè)備中的某些設(shè)備。

f:會(huì)議預(yù)訂成功,或者會(huì)議時(shí)間,會(huì)議地點(diǎn)等重要信息修改后,郵件通知與會(huì)人員。

常規(guī)數(shù)據(jù)庫(kù)設(shè)計(jì):

a:建一個(gè)Meeting的主表,用于存放會(huì)議名稱,會(huì)議地點(diǎn),會(huì)議時(shí)間等的相關(guān)信息。

b:再建一個(gè)MeetingUser的表存儲(chǔ)主持人,參與人,知會(huì)人,記錄者。

c:同樣,會(huì)議所需要的設(shè)備用MeetingDevice表來(lái)存儲(chǔ)相關(guān)的信息。如圖:

這樣的表結(jié)構(gòu),是比較常規(guī)的設(shè)計(jì)方法,但是在實(shí)際應(yīng)用中,你會(huì)發(fā)現(xiàn)一些待改進(jìn)的問(wèn)題。比如:

a:在提取一個(gè)會(huì)議的相關(guān)信息時(shí),會(huì)連接多個(gè)表進(jìn)行查詢。這種查詢?cè)诤艽蟮某绦蛏嫌绊懥藬?shù)據(jù)庫(kù)性能。

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

吐槽了這么多,是否有更好的解決方案呢?當(dāng)然,在SQL里,我們可以XML數(shù)據(jù)類型來(lái)消除主從表的設(shè)計(jì)。如圖:

上面的表結(jié)構(gòu)設(shè)計(jì),是不是有一個(gè)小清新的感覺(jué)呢?很明顯,可以把***種表的設(shè)計(jì)缺陷給消除了。一個(gè)會(huì)議的相關(guān)信息都存儲(chǔ)在了一個(gè)表的一條記錄中,這樣的數(shù)據(jù)看起來(lái)是不是更直觀呢?

a:獲取一個(gè)預(yù)訂會(huì)議的詳細(xì)信息,我不需要進(jìn)行多個(gè)表的連接查詢,我要做的是只需用C#的Linq.Xml來(lái)解析查詢出來(lái)的XML字符串即可。

b:修改操作時(shí),我只需要重新組合XML數(shù)據(jù),一個(gè)Update就更新了與會(huì)議相關(guān)的信息,操作是不是簡(jiǎn)單多了。

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

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

責(zé)任編輯:林師授 來(lái)源: 博客園
相關(guān)推薦

2024-07-22 11:48:42

2024-10-28 10:50:33

2011-08-10 15:58:12

WPS符號(hào)欄

2018-05-12 16:26:17

互聯(lián)網(wǎng)VPC子網(wǎng)

2024-04-09 12:08:51

Next組件Next.js

2021-07-30 16:01:05

大數(shù)據(jù)技術(shù)應(yīng)用

2019-06-12 08:57:43

Oracle數(shù)據(jù)庫(kù)恢復(fù)

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大數(shù)據(jù)服務(wù)器

2019-12-04 08:44:59

前后端分離開(kāi)發(fā)

2017-01-15 15:20:47

Linux編程log

2024-04-26 09:17:20

MySQL事務(wù)隔離

2015-10-26 09:37:27

數(shù)據(jù)中心互聯(lián)網(wǎng)思維
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)