新聞中心
在數(shù)據(jù)庫(kù)中,經(jīng)常會(huì)聽(tīng)到“比2少3”的術(shù)語(yǔ)。對(duì)于一些新手來(lái)說(shuō),這可能是一個(gè)非常不好理解的概念。但是,一旦你理解了這個(gè)術(shù)語(yǔ)的含義和它在數(shù)據(jù)庫(kù)中的應(yīng)用方式,你就可以更好地理解數(shù)據(jù)庫(kù)的工作原理。

成都創(chuàng)新互聯(lián)公司從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元舞鋼做網(wǎng)站,已為上家服務(wù),為舞鋼各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
什么是“比2少3”的數(shù)據(jù)庫(kù)?
我們需要了解這個(gè)術(shù)語(yǔ)的含義。在數(shù)據(jù)庫(kù)中,“比2少3”實(shí)際上指的是冗余副本的數(shù)量。當(dāng)你聽(tīng)到某個(gè)數(shù)據(jù)庫(kù)存在“比2少3”的冗余副本時(shí),意味著在你能夠找到基本副本之外,還有3組冗余副本可以用來(lái)支持?jǐn)?shù)據(jù)的可靠性和可用性。
換句話說(shuō),一個(gè)“比2少3”的數(shù)據(jù)庫(kù)實(shí)際上是指有五組副本,其中有兩組作為基本副本,另外三組是冗余副本。這些冗余副本可以在故障發(fā)生時(shí)代替基本副本工作,以保證數(shù)據(jù)的可靠性和持續(xù)性。
“比2少3”與“3份2副本”的區(qū)別
有時(shí)候,“比2少3”的概念被認(rèn)為是等同于“3份2副本”。雖然這兩種概念有相似之處,但它們并不是相同的。
“3份2副本”指的是只有兩組基本副本和另外一組冗余副本。這樣的數(shù)據(jù)庫(kù)通常不能在任意一組基本副本不可用時(shí)繼續(xù)工作。
在“比2少3”的情況下,有五組副本,包括兩組基本副本和另外三組冗余副本。這相當(dāng)于在“3份2副本”基礎(chǔ)上多添加了三組冗余副本,可以提高數(shù)據(jù)庫(kù)的可靠性和可用性。
“比2少3”背后的重要性
冗余副本數(shù)量的增加可以在多個(gè)級(jí)別上增強(qiáng)數(shù)據(jù)庫(kù)的抗故障能力。這些級(jí)別包括:
1.防止數(shù)據(jù)丟失
在“比2少3”的情況下,即使兩組基本副本中的某一組發(fā)生故障,三組冗余副本也能保證數(shù)據(jù)不會(huì)丟失,從而確保數(shù)據(jù)可靠性。
2.提高恢復(fù)速度
“比2少3”的數(shù)據(jù)庫(kù)能夠比擁有較少副本的數(shù)據(jù)庫(kù)更快地恢復(fù)數(shù)據(jù)。當(dāng)發(fā)生問(wèn)題時(shí),備份數(shù)據(jù)庫(kù)中的數(shù)據(jù)可以快速替換損壞的老數(shù)據(jù)。
3.提高可用性
更多的副本意味著更高的可用性。未來(lái)如果基本副本出現(xiàn)任何問(wèn)題,其他冗余副本可以代替它工作,從而避免了服務(wù)終端。
結(jié)論
了解“比2少3”的數(shù)據(jù)庫(kù)概念可以幫助你更好地理解數(shù)據(jù)庫(kù)的工作過(guò)程,以及如何保護(hù)你的數(shù)據(jù)免受數(shù)據(jù)損壞或丟失的影響。盡管“比2少3”不一定適用于所有的數(shù)據(jù)庫(kù)環(huán)境,但它為保護(hù)和增強(qiáng)數(shù)據(jù)保障提供了一種方法。
相關(guān)問(wèn)題拓展閱讀:
- 影響數(shù)據(jù)庫(kù)性能的主要因素有哪些?
- 數(shù)據(jù)庫(kù)實(shí)驗(yàn)總結(jié)
影響數(shù)據(jù)庫(kù)性能的主要因素有哪些?
1、1、調(diào)整數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)。這一部分在開(kāi)發(fā)信息系統(tǒng)之前完成,程序員需要考慮是否使用ORACLE數(shù)據(jù)庫(kù)的分區(qū)功能,對(duì)于經(jīng)常訪問(wèn)的數(shù)據(jù)庫(kù)表是否需要建立索引等。
2、2、調(diào)整應(yīng)用程序結(jié)構(gòu)設(shè)計(jì)。這一部分也是在開(kāi)發(fā)信息系統(tǒng)之前完成,程序員在這一步需要考慮應(yīng)用程序使用什么樣的體系結(jié)構(gòu),是使用傳統(tǒng)的Client/Server兩層體系結(jié)構(gòu),還是使用Browser/Web/Database的三層體系結(jié)構(gòu)。不同的應(yīng)用程序體系結(jié)構(gòu)要求的數(shù)據(jù)庫(kù)資源是不同的。
3、3、調(diào)整數(shù)據(jù)庫(kù)SQL語(yǔ)句。應(yīng)用程序的執(zhí)行最終將歸結(jié)為數(shù)據(jù)庫(kù)中的SQL語(yǔ)句執(zhí)行,因此SQL語(yǔ)句的執(zhí)行效率最終決定了ORACLE數(shù)據(jù)庫(kù)的性能。ORACLE公司推薦使用ORACLE語(yǔ)句優(yōu)化器(Oracle Optimizer)和行鎖管理器(row-level manager)來(lái)調(diào)整優(yōu)化SQL語(yǔ)句。
4、4、調(diào)整服務(wù)器內(nèi)存分配。內(nèi)存分配是在信息系統(tǒng)運(yùn)行過(guò)程中優(yōu)化配置的,數(shù)據(jù)庫(kù)管理員可以根據(jù)數(shù)據(jù)庫(kù)運(yùn)行狀況調(diào)整數(shù)據(jù)庫(kù)系統(tǒng)全局區(qū)(SGA區(qū))的數(shù)據(jù)緩沖區(qū)、日志緩沖區(qū)和共享池的大??;還可以調(diào)整程序全局區(qū)(PGA區(qū))的大小。需要注意的是,SGA區(qū)不是越大越好,SGA區(qū)過(guò)大會(huì)占用操作系統(tǒng)使用的內(nèi)存而引起虛擬內(nèi)存的頁(yè)面交換,這樣反而會(huì)降低系統(tǒng)。
5、5、調(diào)整硬盤(pán)I/O,這一步是在信息系統(tǒng)開(kāi)發(fā)之前完成的。數(shù)據(jù)庫(kù)管理員可以將組成同一個(gè)表空間的數(shù)據(jù)文件放在不同的硬盤(pán)上,做到硬盤(pán)之間I/O負(fù)載均衡。
6、6、調(diào)整操作系統(tǒng)參數(shù),例如:運(yùn)行在UNIX操作系統(tǒng)上的ORACLE數(shù)據(jù)庫(kù),可以調(diào)整UNIX數(shù)據(jù)緩沖池的大小,每個(gè)進(jìn)程所能使用的內(nèi)存大小等參數(shù)。
實(shí)際上,上述數(shù)據(jù)庫(kù)優(yōu)化措施之間是相互聯(lián)系的。ORACLE數(shù)據(jù)庫(kù)性能惡化表現(xiàn)基本上都是用戶響應(yīng)時(shí)間比較長(zhǎng),需要用戶長(zhǎng)時(shí)間的等待。但性能惡化的原因卻是多種多樣的,有時(shí)是多個(gè)因素共同造成了性能惡化的結(jié)果,這就需要數(shù)據(jù)庫(kù)管理員有比較全面的計(jì)算機(jī)知識(shí),能夠敏感地察覺(jué)到影響數(shù)據(jù)庫(kù)性能的主要原因所在。另外,良好的數(shù)據(jù)庫(kù)管理工具對(duì)于優(yōu)化數(shù)據(jù)庫(kù)性能也是很重要的。
ORACLE數(shù)據(jù)庫(kù)性能優(yōu)化工具
常用的數(shù)據(jù)庫(kù)性能優(yōu)化工具有:
1、1、ORACLE數(shù)據(jù)庫(kù)在線數(shù)據(jù)字典,ORACLE在線數(shù)據(jù)字典能夠反映出ORACLE動(dòng)態(tài)運(yùn)行情況,對(duì)于調(diào)整數(shù)據(jù)庫(kù)性能是很有幫助的。
2、2、操作系統(tǒng)工具,例如UNIX操作系統(tǒng)的vmstat,iostat等命令可以查看到系統(tǒng)系統(tǒng)級(jí)內(nèi)存和硬盤(pán)I/O的使用情況,這些工具對(duì)于管理員弄清出系統(tǒng)瓶頸出現(xiàn)在什么地方有時(shí)候很有用。
3、3、SQL語(yǔ)言跟蹤工具(SQL TRACE FACILITY),SQL語(yǔ)言跟蹤工具可以記錄SQL語(yǔ)句的執(zhí)行情況,管理員可以使用虛擬表來(lái)調(diào)整實(shí)例,使用SQL語(yǔ)句跟蹤文件調(diào)整應(yīng)用程序性能。SQL語(yǔ)言跟蹤工具將結(jié)果輸出成一個(gè)操作系統(tǒng)的文件,管理員可以使用TKPROF工具查看這些文件。
4、4、ORACLE Enterprise Manager(OEM),這是一個(gè)圖形的用戶管理界面,用戶可以使用它方便地進(jìn)行數(shù)據(jù)庫(kù)管理而不必記住復(fù)雜的ORACLE數(shù)據(jù)庫(kù)管理的命令。
5、5、EXPLAIN PLAN——SQL語(yǔ)言優(yōu)化命令,使用這個(gè)命令可以幫助程序員寫(xiě)出高效的SQL語(yǔ)言。
ORACLE數(shù)據(jù)庫(kù)的系統(tǒng)性能評(píng)估
信息系統(tǒng)的類型不同,需要關(guān)注的數(shù)據(jù)庫(kù)參數(shù)也是不同的。數(shù)據(jù)庫(kù)管理員需要根據(jù)自己的信息系統(tǒng)的類型著重考慮不同的數(shù)據(jù)庫(kù)參數(shù)。
1、1、在線事務(wù)處理信息系統(tǒng)(OLTP),這種類型的信息系統(tǒng)一般需要有大量的Insert、Update操作,典型的系統(tǒng)包括民航機(jī)票發(fā)售系統(tǒng)、銀行儲(chǔ)蓄系統(tǒng)等。OLTP系統(tǒng)需要保證數(shù)據(jù)庫(kù)的并發(fā)性、可靠性和最終用戶的速度,這類系統(tǒng)使用的ORACLE數(shù)據(jù)庫(kù)需要主要考慮下述參數(shù):
l l 數(shù)據(jù)庫(kù)回滾段是否足夠?
l l 是否需要建立ORACLE數(shù)據(jù)庫(kù)索引、聚集、散列?
l l 系統(tǒng)全局區(qū)(SGA)大小是否足夠?
l l SQL語(yǔ)句是否高效?
2、2、數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)(Data Warehousing),這種信息系統(tǒng)的主要任務(wù)是從ORACLE的海量數(shù)據(jù)中進(jìn)行查詢,得到數(shù)據(jù)之間的某些規(guī)律。數(shù)據(jù)庫(kù)管理員需要為這種類型的ORACLE數(shù)據(jù)庫(kù)著重考慮下述參數(shù):
l l 是否采用B*-索引或者bitmap索引?
l l 是否采用并行SQL查詢以提高查詢效率?
l l 是否采用PL/SQL函數(shù)編寫(xiě)存儲(chǔ)過(guò)程?
l l 有必要的話,需要建立并行數(shù)據(jù)庫(kù)提高數(shù)據(jù)庫(kù)的查詢效率
SQL語(yǔ)句的調(diào)整原則
SQL語(yǔ)言是一種靈活的語(yǔ)言,相同的功能可以使用不同的語(yǔ)句來(lái)實(shí)現(xiàn),但是語(yǔ)句的執(zhí)行效率是很不相同的。程序員可以使用EXPLAIN PLAN語(yǔ)句來(lái)比較各種實(shí)現(xiàn)方案,并選出更優(yōu)的實(shí)現(xiàn)方案??偟脕?lái)講,程序員寫(xiě)SQL語(yǔ)句需要滿足考慮如下規(guī)則:
1、1、盡量使用索引。試比較下面兩條SQL語(yǔ)句:
語(yǔ)句A:SELECT dname, deptno FROM dept WHERE deptno NOT IN
(SELECT deptno FROM emp);
語(yǔ)句B:SELECT dname, deptno FROM dept WHERE NOT EXISTS
(SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);
這兩條查詢語(yǔ)句實(shí)現(xiàn)的結(jié)果是相同的,但是執(zhí)行語(yǔ)句A的時(shí)候,ORACLE會(huì)對(duì)整個(gè)emp表進(jìn)行掃描,沒(méi)有使用建立在emp表上的deptno索引,執(zhí)行語(yǔ)句B的時(shí)候,由于在子查詢中使用了聯(lián)合查詢,ORACLE只是對(duì)emp表進(jìn)行的部分?jǐn)?shù)據(jù)掃描,并利用了deptno列的索引,所以語(yǔ)句B的效率要比語(yǔ)句A的效率高一些。
2、2、選擇聯(lián)合查詢的聯(lián)合次序??紤]下面的例子:
SELECT stuff FROM taba a, tabb b, tabc c
WHERE a.acol between :alow and :ahigh
AND b.bcol between :blow and :bhigh
AND c.ccol between :clow and :chigh
AND a.key1 = b.key1
AMD a.key2 = c.key2;
這個(gè)SQL例子中,程序員首先需要選擇要查詢的主表,因?yàn)橹鞅硪M(jìn)行整個(gè)表數(shù)據(jù)的掃描,所以主表應(yīng)該數(shù)據(jù)量最小,所以例子中表A的acol列的范圍應(yīng)該比表B和表C相應(yīng)列的范圍小。
3、3、在子查詢中慎重使用IN或者NOT IN語(yǔ)句,使用where (NOT) exists的效果要好的多。
4、4、慎重使用視圖的聯(lián)合查詢,尤其是比較復(fù)雜的視圖之間的聯(lián)合查詢。一般對(duì)視圖的查詢更好都分解為對(duì)數(shù)據(jù)表的直接查詢效果要好一些。
5、5、可以在參數(shù)文件中設(shè)置SHARED_POOL_RESERVED_SIZE參數(shù),這個(gè)參數(shù)在SGA共享池中保留一個(gè)連續(xù)的內(nèi)存空間,連續(xù)的內(nèi)存空間有益于存放大的SQL程序包。
6、6、ORACLE公司提供的DBMS_SHARED_POOL程序可以幫助程序員將某些經(jīng)常使用的存儲(chǔ)過(guò)程“釘”在SQL區(qū)中而不被換出內(nèi)存,程序員對(duì)于經(jīng)常使用并且占用內(nèi)存很多的存儲(chǔ)過(guò)程“釘”到內(nèi)存中有利于提高最終用戶的響應(yīng)時(shí)間。
CPU參數(shù)的調(diào)整
CPU是服務(wù)器的一項(xiàng)重要資源,服務(wù)器良好的工作狀態(tài)是在工作高峰時(shí)CPU的使用率在90%以上。如果空閑時(shí)間CPU使用率就在90%以上,說(shuō)明服務(wù)器缺乏CPU資源,如果工作高峰時(shí)CPU使用率仍然很低,說(shuō)明服務(wù)器CPU資源還比較富余。
使用操作相同命令可以看到CPU的使用情況,一般UNIX操作系統(tǒng)的服務(wù)器,可以使用sar –u命令查看CPU的使用率,NT操作系統(tǒng)的服務(wù)器,可以使用NT的性能管理器來(lái)查看CPU的使用率。
數(shù)據(jù)庫(kù)管理員可以通過(guò)查看v$sysstat數(shù)據(jù)字典中“CPU used by this session”統(tǒng)計(jì)項(xiàng)得知ORACLE數(shù)據(jù)庫(kù)使用的CPU時(shí)間,查看“OS User level CPU time”統(tǒng)計(jì)項(xiàng)得知操作系統(tǒng)用戶態(tài)下的CPU時(shí)間,查看“OS System call CPU time”統(tǒng)計(jì)項(xiàng)得知操作系統(tǒng)系統(tǒng)態(tài)下的CPU時(shí)間,操作系統(tǒng)總的CPU時(shí)間就是用戶態(tài)和系統(tǒng)態(tài)時(shí)間之和,如果ORACLE數(shù)據(jù)庫(kù)使用的CPU時(shí)間占操作系統(tǒng)總的CPU時(shí)間90%以上,說(shuō)明服務(wù)器CPU基本上被ORACLE數(shù)據(jù)庫(kù)使用著,這是合理,反之,說(shuō)明服務(wù)器CPU被其它程序占用過(guò)多,ORACLE數(shù)據(jù)庫(kù)無(wú)法得到更多的CPU時(shí)間。
數(shù)據(jù)庫(kù)管理員還可以通過(guò)查看v$sesstat數(shù)據(jù)字典來(lái)獲得當(dāng)前連接ORACLE數(shù)據(jù)庫(kù)各個(gè)會(huì)話占用的CPU時(shí)間,從而得知什么會(huì)話耗用服務(wù)器CPU比較多。
出現(xiàn)CPU資源不足的情況是很多的:SQL語(yǔ)句的重解析、低效率的SQL語(yǔ)句、鎖沖突都會(huì)引起CPU資源不足。
1、數(shù)據(jù)庫(kù)管理員可以執(zhí)行下述語(yǔ)句來(lái)查看SQL語(yǔ)句的解析情況:
SELECT * FROM V$SYSSTAT
WHERE NAME IN
(‘parse time cpu’, ‘parse time elapsed’, ‘parse count (hard)’);
這里parse time cpu是系統(tǒng)服務(wù)時(shí)間,parse time elapsed是響應(yīng)時(shí)間,用戶等待時(shí)間
waite time = parse time elapsed – parse time cpu
由此可以得到用戶SQL語(yǔ)句平均解析等待時(shí)間=waite time / parse count。這個(gè)平均等待時(shí)間應(yīng)該接近于0,如果平均解析等待時(shí)間過(guò)長(zhǎng),數(shù)據(jù)庫(kù)管理員可以通過(guò)下述語(yǔ)句
SELECT SQL_TEXT, PARSE_CALLS, EXECUTIONS FROM V$SQLAREA
ORDER BY PARSE_CALLS;
來(lái)發(fā)現(xiàn)是什么SQL語(yǔ)句解析效率比較低。程序員可以優(yōu)化這些語(yǔ)句,或者增加ORACLE參數(shù)SESSION_CACHED_CURSORS的值。
2、數(shù)據(jù)庫(kù)管理員還可以通過(guò)下述語(yǔ)句:
SELECT BUFFER_GETS, EXECUTIONS, SQL_TEXT FROM V$SQLAREA;
查看低效率的SQL語(yǔ)句,優(yōu)化這些語(yǔ)句也有助于提高CPU的利用率。
3、3、數(shù)據(jù)庫(kù)管理員可以通過(guò)v$system_event數(shù)據(jù)字典中的“l(fā)atch free”統(tǒng)計(jì)項(xiàng)查看ORACLE數(shù)據(jù)庫(kù)的沖突情況,如果沒(méi)有沖突的話,latch free查詢出來(lái)沒(méi)有結(jié)果。如果沖突太大的話,數(shù)據(jù)庫(kù)管理員可以降低spin_count參數(shù)值,來(lái)消除高的CPU使用率。
內(nèi)存參數(shù)的調(diào)整
內(nèi)存參數(shù)的調(diào)整主要是指ORACLE數(shù)據(jù)庫(kù)的系統(tǒng)全局區(qū)(SGA)的調(diào)整。SGA主要由三部分構(gòu)成:共享池、數(shù)據(jù)緩沖區(qū)、日志緩沖區(qū)。
1、 1、 共享池由兩部分構(gòu)成:共享SQL區(qū)和數(shù)據(jù)字典緩沖區(qū),共享SQL區(qū)是存放用戶SQL命令的區(qū)域,數(shù)據(jù)字典緩沖區(qū)存放數(shù)據(jù)庫(kù)運(yùn)行的動(dòng)態(tài)信息。數(shù)據(jù)庫(kù)管理員通過(guò)執(zhí)行下述語(yǔ)句:
select (sum(pins – reloads)) / sum(pins) “Lib Cache” from v$librarycache;
來(lái)查看共享SQL區(qū)的使用率。這個(gè)使用率應(yīng)該在90%以上,否則需要增加共享池的大小。數(shù)據(jù)庫(kù)管理員還可以執(zhí)行下述語(yǔ)句:
select (sum(gets – getmisses – usage – fixed)) / sum(gets) “Row Cache” from v$rowcache;
查看數(shù)據(jù)字典緩沖區(qū)的使用率,這個(gè)使用率也應(yīng)該在90%以上,否則需要增加共享池的大小。
2、 2、 數(shù)據(jù)緩沖區(qū)。數(shù)據(jù)庫(kù)管理員可以通過(guò)下述語(yǔ)句:
SELECT name, value FROM v$sysstat WHERE name IN (‘db block gets’, ‘consistent gets’,’physical reads’);
來(lái)查看數(shù)據(jù)庫(kù)數(shù)據(jù)緩沖區(qū)的使用情況。查詢出來(lái)的結(jié)果可以計(jì)算出來(lái)數(shù)據(jù)緩沖區(qū)的使用命中率=1 – ( physical reads / (db block gets + consistent gets) )。
這個(gè)命中率應(yīng)該在90%以上,否則需要增加數(shù)據(jù)緩沖區(qū)的大小。
3、 3、 日志緩沖區(qū)。數(shù)據(jù)庫(kù)管理員可以通過(guò)執(zhí)行下述語(yǔ)句:
select name,value from v$sysstat where name in (‘redo entries’,’redo log space requests’);查看日志緩沖區(qū)的使用情況。查詢出的結(jié)果可以計(jì)算出日志緩沖區(qū)的申請(qǐng)失敗率:
申請(qǐng)失敗率=requests/entries,申請(qǐng)失敗率應(yīng)該接近于0,否則說(shuō)明日志緩沖區(qū)開(kāi)設(shè)太小,需要增加ORACLE數(shù)據(jù)庫(kù)的日志緩沖區(qū)。
以MySQL為例:
影響數(shù)據(jù)庫(kù)性能的主要因素總結(jié)如下:
1、sql查詢速度
2、網(wǎng)卡流量
3、服務(wù)器硬件
4、磁盤(pán)IO
以上因素并不是時(shí)時(shí)刻刻都會(huì)影響數(shù)據(jù)庫(kù)性能,而就像
木桶效應(yīng)
一樣。如果其中一個(gè)因素嚴(yán)重影響性能,那么整個(gè)數(shù)據(jù)庫(kù)性能就會(huì)嚴(yán)重受阻。另外,這些影響因素都是相對(duì)的。
例如
:當(dāng)數(shù)據(jù)量并沒(méi)有達(dá)到百萬(wàn)千萬(wàn)這樣的級(jí)別,那么sql查詢速度也許就不是個(gè)重要因素,換句話說(shuō),你的
sql語(yǔ)句
效率適當(dāng)?shù)拖驴赡懿⒉挥绊懻麄€(gè)效率多少,反之,這種情況,無(wú)論如何怎么優(yōu)化sql語(yǔ)句,可能都沒(méi)有太明顯的效果。
相關(guān)內(nèi)容拓展:
1、SQL查詢速度
風(fēng)險(xiǎn):效率低下的SQL
2、網(wǎng)卡流量
風(fēng)險(xiǎn):網(wǎng)卡IO被占滿(100Mb/8=100MB)
方案:
①減少?gòu)姆?wù)器的數(shù)量。從服務(wù)器都要從主服務(wù)器上復(fù)制日志,所以,從服務(wù)器越多,網(wǎng)絡(luò)流量越大。
②進(jìn)行分級(jí)緩存。前方大量緩存突然失效會(huì)對(duì)數(shù)據(jù)庫(kù)造成嚴(yán)重的沖擊。
③避免使用“select * ”進(jìn)行查詢
④分離業(yè)務(wù)網(wǎng)絡(luò)和服務(wù)器網(wǎng)絡(luò)
3、磁盤(pán)IO
風(fēng)險(xiǎn):磁盤(pán)IO性能突然下降。
方案:使用更好的磁盤(pán)設(shè)備解決。
就我的理解,除去硬件原因,軟件的性能提升主要是時(shí)間復(fù)雜性和空間復(fù)雜性這兩方面的優(yōu)化,就時(shí)間復(fù)雜性來(lái)說(shuō),主要是算法方面的優(yōu)化,也就是程序執(zhí)行邏輯的優(yōu)化,不能說(shuō)代碼越少程序越高效,代碼少只是減少了你的工作量,對(duì)程序性能方面沒(méi)有直接的影響.舉個(gè)例子,現(xiàn)在用得很多的struts2框架,在后臺(tái)能自動(dòng)幫你封裝頁(yè)面參數(shù),可以減少很多的代碼,但這種方式并不比傳統(tǒng)的在后臺(tái)用httpservletrequest.getParameter()方式高效,因?yàn)樗玫椒瓷湟ㄙM(fèi)多一點(diǎn)的時(shí)間;算法精短對(duì)性能也沒(méi)直接影響,只能減少你的代碼量,我覺(jué)得算法的合理性才是提高軟件性能最重要的原因.
至于空間復(fù)雜度,主要是I/O操作方面的問(wèn)題,例如數(shù)據(jù)庫(kù)操作,主要是sql合不合理,相同的實(shí)現(xiàn)不同的實(shí)現(xiàn)方法的執(zhí)行效率差距是巨大的.
除去這兩個(gè),服務(wù)器和數(shù)據(jù)庫(kù)的調(diào)優(yōu)也對(duì)軟件性能起很大的作用.
數(shù)據(jù)庫(kù)實(shí)驗(yàn)總結(jié)
數(shù)據(jù)庫(kù)實(shí)驗(yàn)總結(jié)【一】
試驗(yàn)內(nèi)容
1、 數(shù)據(jù)表的建立
基本表《簡(jiǎn)單的》帶有主鍵
帶有外碼約束的(外碼來(lái)自其他表或者本表)
2、 數(shù)據(jù)表的修改
添加刪除列
修改列屬性類型
添加刪除約束(約束名)
元組的添加,修改,刪除
刪除數(shù)據(jù)表
試驗(yàn)過(guò)程
1、create table student
(
sno char(9) primary key , /*sno是主碼 列級(jí)完整性約束條件*/
sname char(20) unique, /*sname取唯一值*/
ssex char(2),
sage allint, /*類型為allint*/
sdept char(20) /*所在系*/
);
create table course
(
cno char(4) primary key, /*列級(jí)完整性約束條件,cno是主碼*/
cname char(40),
cpno char(4), /*cpno的含義是先行課*/
ccredit allint,
foreign key (cpno) references course(cno)
/*表級(jí)完整性約束條件,cpno是外碼,被參照表是course,被參照列是cno*/
);
create table sc
(
sno char(9),
cno char(4),
grade allint,
primary key (sno,cno),
/*主碼有兩個(gè)屬性構(gòu)成,必須作為表級(jí)完整性進(jìn)行定義*/
foreign key (sno) references student(sno),
/*表級(jí)完整性約束條件,sno是外碼,被參照表是student*/
foreign key (cno) references course(cno),
/*表級(jí)完整性約束條件,cno是外碼,被參照表示course*/
);
例1、create table s
(
cno varchar(3), /*變長(zhǎng)的字符串,輸入2個(gè)字符就是兩個(gè)字符不會(huì)補(bǔ)空格*/
sname varchar(20),
status int,
city varchar(20),
constraint pk_sno primary key(sno), /*約束條件的名字為pk_sno*/
);
create table p
(
pno varchar(3),
pname varchar(20),
color varchar(3),
weight int,
constraint pk_pno primary key (pno), /*約束條件的名字是pk_pno*/
);
create table j
(
jno varchar(3),
jname varchar(20),
city varchar(20),
constraint pk_jno primary key(jno) /*約束條件的名字為pk_jno*/
);
例2、create table spj
(
sno varchar(3), /*之一個(gè)表中的主碼*/
pno varchar(3),
jno varchar(3),
qty int, /*數(shù)量*/
constraint pk_spj primary key(sno,pno,jno), /*主碼由3個(gè)屬性組成*/
foreign key(sno) references s(sno),
/*表級(jí)完整性約束條件,sno是外碼,被參照表是s*/
foreign key(pno) references p(pno),
/*表級(jí)完整性約束條件,pno是外碼,被參照表是p*/
foreign key(jno) references j(jno),
/*表級(jí)完整性約束條件,jno是外碼,被參照表是j*/
);
2、數(shù)據(jù)表的更改
在s表中添加一個(gè)concat 列
alter table s add concat varchar(20)
在s表中刪除concat 列
alter table s drop column concat
更改s表 concat列的屬性 把長(zhǎng)度由20改為30
alter table s alter column concat varchar(30)
聯(lián)系方式 名字為concat 修改屬性為唯一的 屬性名為con_concat
alter table s add constraint con_concat unique(concat)
刪除約束關(guān)系con_concat
alter table s drop constraint con_concat
/*插入一個(gè)元組*/
insert into s valus(‘s1’,’精益’,20,’天津’) /*20不能寫(xiě)成’20’*/
試驗(yàn)中的問(wèn)題的排除與總結(jié):
1、在創(chuàng)建spj時(shí)
有三個(gè)實(shí)體所以從3個(gè)實(shí)體中取主碼,還有一個(gè)數(shù)量屬性也要寫(xiě)上
主碼由那3個(gè)主碼確定
2、更改一個(gè)數(shù)據(jù)庫(kù)中數(shù)據(jù)表時(shí)一定要先使該數(shù)據(jù)庫(kù)處于正在使用狀態(tài)
3、constraint
是可選關(guān)鍵字,表示 primary key、not null、unique、foreign key 或 check 約束定義的開(kāi)始。約束是特殊屬性,用于強(qiáng)制數(shù)據(jù)完整性并可以為表及其列創(chuàng)建索引。
4、–go可以不加但是要注意順序 注:go –注釋 提示錯(cuò)誤
5、注意添加一個(gè)空元素用 null
附 sql備份
–創(chuàng)建一個(gè)數(shù)據(jù)庫(kù) student
create database student
go
–在數(shù)據(jù)庫(kù)student中創(chuàng)建表student course sc 注意順序
use student
create table student
(
sno char(9) primary key, /*sno是主碼 列級(jí)完整性約束條件*/
sname char(10) unique, /*sname取唯一值*/
ssex char(2),
sage allint, /*類型為allint*/
sdept char(20) /*所在系*/
); /*;要加*/
數(shù)據(jù)庫(kù)實(shí)驗(yàn)總結(jié)【二】
我在sql server 索引基礎(chǔ)知識(shí)系列中,之一篇就講了記錄數(shù)據(jù)的基本格式。那里主要講解的是,數(shù)據(jù)庫(kù)的最小讀存單元:數(shù)據(jù)頁(yè)。一個(gè)數(shù)據(jù)頁(yè)是8k大小。
對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),它不會(huì)每次有一個(gè)數(shù)據(jù)頁(yè)變化后,就存到硬盤(pán)。而是變化達(dá)到一定數(shù)量級(jí)后才會(huì)作這個(gè)操作。 這時(shí)候,數(shù)據(jù)庫(kù)并不是以數(shù)據(jù)頁(yè)來(lái)作為操作單元,而是以64k的數(shù)據(jù)(8個(gè)數(shù)據(jù)頁(yè),一個(gè)區(qū))作為操作單元。
區(qū)是管理空間的基本單位。一個(gè)區(qū)是八個(gè)物理上連續(xù)的頁(yè)(即 64 kb)。這意味著 sql server 數(shù)據(jù)庫(kù)中每 mb 有 16 個(gè)區(qū)。
為了使空間分配更有效,sql server 不會(huì)將所有區(qū)分配給包含少量數(shù)據(jù)的表。sql server 有兩種類型的區(qū):
統(tǒng)一區(qū),由單個(gè)對(duì)象所有。區(qū)中的所有 8 頁(yè)只能由所屬對(duì)象使用。
混合區(qū),最多可由八個(gè)對(duì)象共享。區(qū)中八頁(yè)的每頁(yè)可由不同的對(duì)象所有。
通常從混合區(qū)向新表或索引分配頁(yè)。當(dāng)表或索引增長(zhǎng)到 8 頁(yè)時(shí),將變成使用統(tǒng)一區(qū)進(jìn)行后續(xù)分配。如果對(duì)現(xiàn)有表創(chuàng)建索引,并且該表包含的行足以在索引中生成 8 頁(yè),則對(duì)該索引的所有分配都使用統(tǒng)一區(qū)進(jìn)行。
為何會(huì)這樣呢?
其實(shí)很簡(jiǎn)單:
讀或?qū)?8kb 的時(shí)間與讀或?qū)?64 kb的時(shí)間幾乎相同。
在 8 kb 到 64 kb 范圍之內(nèi),單個(gè)磁盤(pán) i/o 傳輸操作所花的時(shí)間主要是磁盤(pán)取數(shù)臂和讀/寫(xiě)磁頭運(yùn)動(dòng)的時(shí)間。
因此,從數(shù)學(xué)上來(lái)講,當(dāng)需要傳輸 64 kb 以上的 sql 數(shù)據(jù)時(shí),
盡可能地執(zhí)行 64 kb 磁盤(pán)傳輸是有益的,即分成數(shù)個(gè)64k的操作。
因?yàn)?64 kb 傳輸基本上與 8 kb 傳輸一樣快,而每次傳輸?shù)?sql server 數(shù)據(jù)是 8 kb 傳輸?shù)?8 倍。
我們通過(guò)一個(gè)實(shí)例來(lái)看 有and 操作符時(shí)候的最常見(jiàn)的一種情況。我們有下面一個(gè)表,
create table .( . identity(1,1) not null, . not null, . not null, . null, . not null, . not null, . not null, . not null, . not null, . null, null, not null default (getdate()), not null default (dateadd(year,1,getdate())), . not null, . null, null default (0), null default (0), . not null default (‘ ‘))
這個(gè)表具備下面的四個(gè)索引:
索引名 細(xì)節(jié) 索引的列
member_corporation_link nonclustered located on primary corp_no
member_ident clustered, unique, primary key located on primary member_no
member_region_link nonclustered located on primary region_no
memberfirstname nonclustered located on primary firstname
當(dāng)我們執(zhí)行下面的sql查詢時(shí)候,
select m.member_no, m.firstname, m.region_nofrom dbo.member as mwhere m.firstname like ‘k%’ and m.region_no > 6 and m.member_no 6) b
– 這個(gè)查詢可以直接使用 member_region_link 非聚集索引,而且這個(gè)非聚集索引覆蓋了所有查詢列– 實(shí)際執(zhí)行時(shí),只需要 邏輯讀取 10 次
where a.member_no = b.member_no
不信,你可以看這兩個(gè)sql 的執(zhí)行計(jì)劃,以及邏輯讀信息,都是一樣的。
其實(shí)上面的sql,如果優(yōu)化成下面的方式,實(shí)際的邏輯讀消耗也是一樣的。為何sql server 不會(huì)優(yōu)化成下面的方式。是因?yàn)?and 操作符優(yōu)化的另外一個(gè)原則。
1/26 的數(shù)據(jù)和 1/6 的數(shù)據(jù)找交集的速度要比 1/52 的數(shù)據(jù)和 1/3 的數(shù)據(jù)找交集速度要慢。
select a.member_no,a.firstname,b.region_nofrom(select m.member_no, m.firstname from dbo.member as mwhere m.firstname like ‘k%’ — 1/26 數(shù)據(jù)) a,
(select m.member_no, m.region_no from dbo.member as mwhere m.region_no > 6 and m.member_no 6 and m.member_no 6 and m.member_no 6 and m.member_no 6 and m.member_no
這里 index 計(jì)算符可以是 0 ,1, 指定的一個(gè)或者多個(gè)索引名字。對(duì)于 0 ,1 的意義如下:
如果存在聚集索引,則 index(0) 強(qiáng)制執(zhí)行聚集索引掃描,index(1) 強(qiáng)制執(zhí)行聚集索引掃描或查找(使用性能更高的一種)。
如果不存在聚集索引,則 index(0) 強(qiáng)制執(zhí)行表掃描,index(1) 被解釋為錯(cuò)誤。
總結(jié)知識(shí)點(diǎn):
簡(jiǎn)單來(lái)說(shuō),我們可以這么理解:sql server 對(duì)于每一條查詢語(yǔ)句。會(huì)根據(jù)實(shí)際索引情況(sysindexes 系統(tǒng)表中存儲(chǔ)這些信息),分析每種組合可能的成本。然后選擇它認(rèn)為成本最小的一種。作為它實(shí)際執(zhí)行的計(jì)劃。
成本代價(jià)計(jì)算的一個(gè)主要組成部分是邏輯i/o的數(shù)量,特別是對(duì)于單表的查詢。
and 操作要滿足所有條件,這樣,經(jīng)常會(huì)要求對(duì)幾個(gè)數(shù)據(jù)集作交集。數(shù)據(jù)集越小,數(shù)據(jù)集的交集計(jì)算越節(jié)省成本。
的項(xiàng)目中,竟然出現(xiàn)了濫用聚集索引的問(wèn)題??磥?lái)沒(méi)有培訓(xùn)最最基礎(chǔ)的索引的意義,代價(jià),使用場(chǎng)景,是一個(gè)非常大的失誤。這篇博客就是從這個(gè)角度來(lái)羅列索引的基礎(chǔ)知識(shí)。
使用索引的意義
索引在數(shù)據(jù)庫(kù)中的作用類似于目錄在書(shū)籍中的作用,用來(lái)提高查找信息的速度。
使用索引查找數(shù)據(jù),無(wú)需對(duì)整表進(jìn)行掃描,可以快速找到所需數(shù)據(jù)。
使用索引的代價(jià)
索引需要占用數(shù)據(jù)表以外的物理存儲(chǔ)空間。
創(chuàng)建索引和維護(hù)索引要花費(fèi)一定的時(shí)間。
當(dāng)對(duì)表進(jìn)行更新操作時(shí),索引需要被重建,這樣降低了數(shù)據(jù)的維護(hù)速度。
創(chuàng)建索引的列
主鍵
外鍵或在表聯(lián)接操作中經(jīng)常用到的列
在經(jīng)常查詢的字段上更好建立索引
不創(chuàng)建索引的列
很少在查詢中被引用
包含較少的惟一值
定義為 text、ntext 或者 image 數(shù)據(jù)類型的列
heaps是staging data的很好選擇,當(dāng)它沒(méi)有任何index時(shí)
excellent for high performance data loading (parallel bulk load and parallel index creation after load)
excellent as a partition to a partitioned view or a partitioned table
聚集索引提高性能的方法,在前面幾篇博客中分別提到過(guò),下面只是一個(gè)簡(jiǎn)單的大綱,細(xì)節(jié)請(qǐng)參看前面幾篇博客。
何時(shí)創(chuàng)建聚集索引?
clustered index會(huì)提高大多數(shù)table的性能,尤其是當(dāng)它滿足以下條件時(shí):
獨(dú)特, 狹窄, 靜止: 最重要的條件
持續(xù)增長(zhǎng)的,更好是只向上增加。例如:
identity
date, identity
guid (only when using newsequentialid() function)
聚集索引唯一性(獨(dú)特型的問(wèn)題)
由于聚集索引的b+樹(shù)結(jié)構(gòu)的葉子節(jié)點(diǎn)必須指向具體數(shù)據(jù)。如果你要建立聚集索引的列不唯一,并且你指定的創(chuàng)建的聚集索引是非唯一的聚集索引,則會(huì)有以下情況:
關(guān)于比2少3的數(shù)據(jù)庫(kù)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都服務(wù)器租用選創(chuàng)新互聯(lián),先試用再開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。物理服務(wù)器托管租用:四川成都、綿陽(yáng)、重慶、貴陽(yáng)機(jī)房服務(wù)器托管租用。
分享文章:解密:如何理解比2少3的數(shù)據(jù)庫(kù)? (比2少3的數(shù)據(jù)庫(kù))
轉(zhuǎn)載源于:http://m.fisionsoft.com.cn/article/cocijch.html


咨詢
建站咨詢
