激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

dba信參考

時(shí)間:2020-12-12 14:25:30 推薦信 我要投稿

dba推薦信參考

  篇一:(DBA)部門(mén)(DBA)職務(wù)-職位說(shuō)明書(shū)

dba推薦信參考

  職位說(shuō)明書(shū)

  Position Clarification

  職位說(shuō)明書(shū)

  Position Clarification

  申明:

  本人已認真閱讀了上述崗位說(shuō)明書(shū),并承諾遵守上述規范。

  任職人簽字:

  日期:2010-8-27

  篇二:DBA怎樣提高數據庫性能

  在程序開(kāi)發(fā)中怎樣寫(xiě)SQL語(yǔ)句可以提高數據庫的性能

  1、首先要搞明白什么叫執行計劃?

  執行計劃是數據庫根據SQL語(yǔ)句和相關(guān)表的統計信息作出的一個(gè)查詢(xún)方案,這個(gè)方案是由查詢(xún)優(yōu)化器自動(dòng)分析產(chǎn)生的,比如一條SQL語(yǔ)句如果用來(lái)從一個(gè)10萬(wàn)條記錄的表中查1條記錄,那查詢(xún)優(yōu)化器會(huì )選擇“索引查找”方式,如果該表進(jìn)行了歸檔,當前只剩下5000條記錄了,那查詢(xún)優(yōu)化器就會(huì )改變方案,采用“全表掃描”方式。

  可見(jiàn),執行計劃并不是固定的,它是“個(gè)性化的”。產(chǎn)生一個(gè)正確的“執行計劃”有兩點(diǎn)很重要:

  (1) SQL語(yǔ)句是否清晰地告訴查詢(xún)優(yōu)化器它想干什么?

  (2) 查詢(xún)優(yōu)化器得到的數據庫統計信息是否是最新的、正確的?

  2、統一SQL語(yǔ)句的寫(xiě)法

  對于以下兩句SQL語(yǔ)句,程序員認為是相同的,數據庫查詢(xún)優(yōu)化器認為是不同的。 select * from dual

  Select * From dual

  其實(shí)就是大小寫(xiě)不同,查詢(xún)分析器就認為是兩句不同的SQL語(yǔ)句,必須進(jìn)行兩次解析。生成2個(gè)執行計劃。所以作為程序員,應該保證相同的查詢(xún)語(yǔ)句在任何地方都一致,多一個(gè)空格都不行!

  3、不要把SQL語(yǔ)句寫(xiě)得太復雜

  我經(jīng)?吹,從數據庫中捕捉到的一條SQL語(yǔ)句打印出來(lái)有2張A4紙這么長(cháng)。一般來(lái)說(shuō)這么復雜的語(yǔ)句通常都是有問(wèn)題的。我拿著(zhù)這2頁(yè)長(cháng)的SQL語(yǔ)句去請教原作者,結果他說(shuō)時(shí)間太長(cháng),他一時(shí)也看不懂了?上攵,連原作者都有可能看糊涂的SQL語(yǔ)句,數據庫也一樣會(huì )看糊涂。

  一般,將一個(gè)Select語(yǔ)句的結果作為子集,然后從該子集中再進(jìn)行查詢(xún),這種一層嵌套語(yǔ)句還是比較常見(jiàn)的,但是根據經(jīng)驗,超過(guò)3層嵌套,查詢(xún)優(yōu)化器就很容易給出錯誤的執行計劃。因為它被繞暈了。像這種類(lèi)似人工智能的東西,終究比人的分辨力要差些,如果人都看暈了,我可以保證數據庫也會(huì )暈的。

  另外,執行計劃是可以被重用的,越簡(jiǎn)單的SQL語(yǔ)句被重用的可能性越高。而復雜的SQL語(yǔ)句只要有一個(gè)字符發(fā)生變化就必須重新解析,然后再把這一大堆垃圾塞在內存里?上攵,數據庫的效率會(huì )何等低下。

  4、使用“臨時(shí)表”暫存中間結果

  簡(jiǎn)化SQL語(yǔ)句的重要方法就是采用臨時(shí)表暫存中間結果,但是,臨時(shí)表的好處遠遠不止這些,將臨時(shí)結果暫存在臨時(shí)表,后面的查詢(xún)就在tempdb中了,這可以避免程序中多次掃描主表,也大大減少了程序執行中“共享鎖”阻塞“更新鎖”,減少了阻塞,提高了并發(fā)性能。

  5、 OLTP系統SQL語(yǔ)句必須采用綁定變量

  select * from orderheader where changetime> ‘2010-10-20 00:00:01’

  select * from orderheader where changetime> ‘2010-09-22 00:00:01’

  以上兩句語(yǔ)句,查詢(xún)優(yōu)化器認為是不同的SQL語(yǔ)句,需要解析兩次。如果采用綁定變量

  select * from orderheader where changetime> @chgtime

  @chgtime變量可以傳入任何值,這樣大量的類(lèi)似查詢(xún)可以重用該執行計劃了,這可以大大降低數據庫解析SQL語(yǔ)句的負擔。一次解析,多次重用,是提高數據庫效率的原則。

  6、綁定變量窺測

  事物都存在兩面性,綁定變量對大多數OLTP處理是適用的,但是也有例外。比如在where條件中的字段是“傾斜字段”的時(shí)候。

  “傾斜字段”指該列中的絕大多數的值都是相同的,比如一張人口調查表,其中“民族”這列,90%以上都是漢族。那么如果一個(gè)SQL語(yǔ)句要查詢(xún)30歲的漢族人口有多少,那“民族”這列必然要被放在where條件中。這個(gè)時(shí)候如果采用綁定變量@nation會(huì )存在很大問(wèn)題。

  試想如果@nation傳入的第一個(gè)值是“漢族”,那整個(gè)執行計劃必然會(huì )選擇表掃描。然后,第二個(gè)值傳入的是“布依族”,按理說(shuō)“布依族”占的比例可能只有萬(wàn)分之一,應該采用索引查找。但是,由于重用了第一次解析的“漢族”的那個(gè)執行計劃,那么第二次也將采用表掃描方式。這個(gè)問(wèn)題就是著(zhù)名的“綁定變量窺測”,建議對于“傾斜字段”不要采用綁定變量。

  7、只在必要的情況下才使用begin tran

  SQL Server中一句SQL語(yǔ)句默認就是一個(gè)事務(wù),在該語(yǔ)句執行完成后也是默認commit的。其實(shí),這就是begin tran的一個(gè)最小化的形式,好比在每句語(yǔ)句開(kāi)頭隱含了一個(gè)begin tran,結束時(shí)隱含了一個(gè)commit。

  有些情況下,我們需要顯式聲明begin tran,比如做“插、刪、改”操作需要同時(shí)修改幾個(gè)表,要求要么幾個(gè)表都修改成功,要么都不成功。begin tran可以起到這樣的作用,它可以把若干SQL語(yǔ)句套在一起執行,最后再一起commit。好處是保證了數據的一致性,但任何事情都不是完美無(wú)缺的。Begin tran付出的代價(jià)是在提交之前,所有SQL語(yǔ)句鎖住的資源都不能釋放,直到commit掉。

  可見(jiàn),如果Begin tran套住的SQL語(yǔ)句太多,那數據庫的性能就糟糕了。在該大事務(wù)提交之前,必然會(huì )阻塞別的語(yǔ)句,造成block很多。

  Begin tran使用的原則是,在保證數據一致性的前提下,begin tran套住的SQL語(yǔ)句越少越好!有些情況下可以采用觸發(fā)器同步數據,不一定要用begin tran。

  8、一些SQL查詢(xún)語(yǔ)句應加上nolock

  在SQL語(yǔ)句中加nolock是提高SQL Server并發(fā)性能的重要手段,在oracle中并不需要這樣做,因為oracle的結構更為合理,有undo表空間保存“數據前影”,該數據如果在修改中還未commit,那么你讀到的是它修改之前的副本,該副本放在undo表空間中。這樣,oracle的讀、寫(xiě)可以做到互不影響,這也是oracle廣受稱(chēng)贊的地方。SQL Server 的讀、寫(xiě)是會(huì )相互阻塞的,為了提高并發(fā)性能,對于一些查詢(xún),可以加上nolock,這樣讀的時(shí)候可以允許寫(xiě),但缺點(diǎn)是可能讀到未提交的臟數據。使用nolock有3條原則。

  (1) 查詢(xún)的結果用于“插、刪、改”的不能加nolock!

  (2) 查詢(xún)的表屬于頻繁發(fā)生頁(yè)分裂的,慎用nolock!

  (3) 使用臨時(shí)表一樣可以保存“數據前影”,起到類(lèi)似oracle的undo表空間的功能, 能采用臨時(shí)表提高并發(fā)性能的,不要用nolock。

  9、聚集索引沒(méi)有建在表的順序字段上,該表容易發(fā)生頁(yè)分裂

  比如訂單表,有訂單編號orderid,也有客戶(hù)編號contactid,那么聚集索引應該加在哪個(gè)字段上呢?對于該表,訂單編號是順序添加的,如果在orderid上加聚集索引,新增的行都是添加在末尾,這樣不容易經(jīng)常產(chǎn)生頁(yè)分裂。然而,由于大多數查詢(xún)都是根據客戶(hù)編號來(lái)查的,因此,將聚集索引加在contactid上才有意義。而contactid對于訂單表而言,并非順序字段。

  比如“張三”的“contactid”是001,那么“張三”的訂單信息必須都放在這張表的第一個(gè)數據頁(yè)上,如果今天“張三”新下了一個(gè)訂單,那該訂單信息不能放在表的最后一頁(yè),而是第一頁(yè)!如果第一頁(yè)放滿(mǎn)了呢?很抱歉,該表所有數據都要往后移動(dòng)為這條記錄騰地方。

  SQL Server的索引和Oracle的索引是不同的,SQL Server的聚集索引實(shí)際上是對表按照聚集索引字段的'順序進(jìn)行了排序,相當于oracle的索引組織表。SQL Server的聚集索引就是表本身的一種組織形式,所以它的效率是非常高的。也正因為此,插入一條記錄,它的位置不是隨便放的,而是要按照順序放在該放的數據頁(yè),如果那個(gè)數據頁(yè)沒(méi)有空間了,就引起了頁(yè)分裂。所以很顯然,聚集索引沒(méi)有建在表的順序字段上,該表容易發(fā)生頁(yè)分裂。

  曾經(jīng)碰到過(guò)一個(gè)情況,一位哥們的某張表重建索引后,插入的效率大幅下降了。估計情況大概是這樣的。該表的聚集索引可能沒(méi)有建在表的順序字段上,該表經(jīng)常被歸檔,所以該表的數據是以一種稀疏狀態(tài)存在的。比如張三下過(guò)20張訂單,而最近3個(gè)月的訂單只有5張,歸檔策略是保留3個(gè)月數據,那么張三過(guò)去的15張訂單已經(jīng)被歸檔,留下15個(gè)空位,可以在發(fā)生時(shí)重新被利用。在這種情況下由于有空位可以利用,就不會(huì )發(fā)生頁(yè)分裂。但是查詢(xún)性能會(huì )比較低,因為查詢(xún)時(shí)必須掃描那些沒(méi)有數據的空位。

  重建聚集索引后情況改變了,因為重建聚集索引就是把表中的數據重新排列一遍,原來(lái)的空位沒(méi)有了,而頁(yè)的填充率又很高,插入數據經(jīng)常要發(fā)生頁(yè)分裂,所以性能大幅下降。

  對于聚集索引沒(méi)有建在順序字段上的表,是否要給與比較低的頁(yè)填充率?是否要避免重建聚集索引?是一個(gè)值得考慮的問(wèn)題!

  10、加nolock后查詢(xún)經(jīng)常發(fā)生頁(yè)分裂的表,容易產(chǎn)生跳讀或重復讀

  加nolock后可以在“插、刪、改”的同時(shí)進(jìn)行查詢(xún),但是由于同時(shí)發(fā)生“插、刪、改”,在某些情況下,一旦該數據頁(yè)滿(mǎn)了,那么頁(yè)分裂不可避免,而此時(shí)nolock的查詢(xún)正在發(fā)生,比如在第100頁(yè)已經(jīng)讀過(guò)的記錄,可能會(huì )因為頁(yè)分裂而分到第101頁(yè),這有可能使得nolock查詢(xún)在讀101頁(yè)時(shí)重復讀到該條數據,產(chǎn)生“重復讀”。同理,如果在100頁(yè)上的數據還沒(méi)被讀到就分到99頁(yè)去了,那nolock查詢(xún)有可能會(huì )漏過(guò)該記錄,產(chǎn)生“跳讀”。

  上面提到的哥們,在加了nolock后一些操作出現報錯,估計有可能因為nolock查詢(xún)產(chǎn)生了重復讀,2條相同的記錄去插入別的表,當然會(huì )發(fā)生主鍵沖突。

  11、使用like進(jìn)行模糊查詢(xún)時(shí)應注意

  有的時(shí)候會(huì )需要進(jìn)行一些模糊查詢(xún)比如

  Select * from contact where username like ‘%yue%’

  關(guān)鍵詞%yue%,由于yue前面用到了“%”,因此該查詢(xún)必然走全表掃描,除非必要,否則不要在關(guān)鍵詞前加%,

  12、數據類(lèi)型的隱式轉換對查詢(xún)效率的影響

  sql server2000的數據庫,我們的程序在提交sql語(yǔ)句的時(shí)候,沒(méi)有使用強類(lèi)型提交這個(gè)字段的值,由sql server 2000自動(dòng)轉換數據類(lèi)型,會(huì )導致傳入的參數與主鍵字段類(lèi)型不一致,這個(gè)時(shí)候sql server 2000可能就會(huì )使用全表掃描。Sql2005上沒(méi)有發(fā)現這種問(wèn)題,但是還是應該注意一下。

  13、SQL Server 表連接的三種方式

  (1) Merge Join

  (2) Nested Loop Join

  (3) Hash Join

  SQL Server 2000只有一種join方式——Nested Loop Join,如果A結果集較小,那就默認作為外表,A中每條記錄都要去B中掃描一遍,實(shí)際掃過(guò)的行數相當于A(yíng)結果集行數x B結果集行數。所以如果兩個(gè)結果集都很大,那Join的結果很糟糕。

  SQL Server 2005新增了Merge Join,如果A表和B表的連接字段正好是聚集索引所在字段,那么表的順序已經(jīng)排好,只要兩邊拼上去就行了,這種join的開(kāi)銷(xiāo)相當于A(yíng)表的結果集行數加上B表的結果集行數,一個(gè)是加,一個(gè)是乘,可見(jiàn)merge join 的效果要比Nested Loop Join好多了。

  如果連接的字段上沒(méi)有索引,那SQL2000的效率是相當低的,而SQL2005提供了Hash join,相當于臨時(shí)給A,B表的結果集加上索引,因此SQL2005的效率比SQL2000有很大提高,我

  認為,這是一個(gè)重要的原因。

  總結一下,在表連接時(shí)要注意以下幾點(diǎn):

  (1) 連接字段盡量選擇聚集索引所在的字段

  (2) 仔細考慮where條件,盡量減小A、B表的結果集

  (3) 如果很多join的連接字段都缺少索引,而你還在用SQL2000,干緊升級吧.

【dba推薦信參考】相關(guān)文章:

Oracle DBA職業(yè)要求11-10

英文推薦信參考11-16

Oracle OCP DBA認證類(lèi)型簡(jiǎn)介09-26

Oracle DBA邏輯備份試題精選09-23

英文推薦信參考范文12-24

Oracle數據庫DBA基礎試題08-27

精選班長(cháng)推薦信范文參考12-16

出國留學(xué)英語(yǔ)推薦信參考12-02

Oracle DBA認證考試存儲管理試題及答案09-23

2016年Oracle DBA用戶(hù)管理試題及答案09-23

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频