日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

[翻譯]——SQL Server使用鏈接服務(wù)器的5個(gè)性能

系統(tǒng) 3033 0
原文: [翻譯]——SQL Server使用鏈接服務(wù)器的5個(gè)性能殺手

? 前言: 本文是對(duì)博客 http://www.dbnewsfeed.com/2012/09/08/5-performance-killers-when-working-with-linked-servers/ 的翻譯 , 如有翻譯不對(duì)或不好的地方,敬請(qǐng)指出,大家一起學(xué)習(xí)進(jìn)步。尊重原創(chuàng)和翻譯勞動(dòng)成果,轉(zhuǎn)載時(shí)請(qǐng)注明出處。謝謝!

?

當(dāng)使用鏈接服務(wù)器(Linked Servers)時(shí),最昂貴的代價(jià)就是網(wǎng)絡(luò)帶寬間大量數(shù)據(jù)的傳輸。在正確的服務(wù)器書(shū)寫(xiě)正確的代碼是非常重要的,因?yàn)槊恳粋€(gè)錯(cuò)誤都會(huì)導(dǎo)致在網(wǎng)絡(luò)帶寬上付出非常昂貴的代價(jià)。 下面是使用鏈接服務(wù)器(Linked Servers)時(shí)的幾個(gè)常見(jiàn)錯(cuò)誤:

1:使用推送方式而不是拉方式取數(shù)

?? 出人意料之外的是,使用鏈接服務(wù)器推送數(shù)據(jù)比拉取數(shù)據(jù)慢得多。Linchi Shea寫(xiě)了一篇很好的 博客 討論這個(gè)。

?? Linchi Shea 使用openquery來(lái)說(shuō)明兩者間的差異,但是這個(gè)也會(huì)發(fā)生在使用鏈接服務(wù)器的SQL語(yǔ)句中(這里不好翻譯,其實(shí)就是查詢(xún)中使用Linked Server需要用到 LinkServer.DatabaseName.dbo.TableName)

2: 使用JOIN

??? 跨服務(wù)器查詢(xún)時(shí),為了在兩臺(tái)服務(wù)器之間的數(shù)據(jù)集之間執(zhí)行JOIN操作,SQL Server需要將數(shù)據(jù)從一臺(tái)服務(wù)器傳送到另外一臺(tái)服務(wù)器。如果傳送的數(shù)據(jù)是一個(gè)非常大的表,這個(gè)過(guò)程可能會(huì)非常痛苦。通常來(lái)說(shuō),數(shù)據(jù)會(huì)從遠(yuǎn)程服務(wù)器傳送到本地服務(wù)器。為了防止大量數(shù)據(jù)在服務(wù)器之間大傳送,你可以通過(guò)在查詢(xún)條件中過(guò)濾數(shù)據(jù),通過(guò)一個(gè)遠(yuǎn)程存儲(chǔ)過(guò)程只取回相關(guān)數(shù)據(jù)來(lái)達(dá)到目的,萬(wàn)一你需要使用INNER JOIN關(guān)聯(lián)兩個(gè)不同服務(wù)器之間的數(shù)據(jù)集,而且本地表的數(shù)據(jù)量遠(yuǎn)小于遠(yuǎn)程服務(wù)器的那個(gè)表。你可以使用REMOTE JOIN HINT, 這樣就會(huì)將數(shù)據(jù)從本地服務(wù)器將數(shù)據(jù)傳送到遠(yuǎn)程服務(wù)器,從而提高性能

3:使用UNION

??? 正如JOIN操作,UNIION不同服務(wù)器之間的兩個(gè)數(shù)據(jù)集必定導(dǎo)致從遠(yuǎn)程服務(wù)器傳送數(shù)據(jù)到本地服務(wù)器。即使你執(zhí)行遠(yuǎn)程查詢(xún)合并(UNION)同一個(gè)遠(yuǎn)程服務(wù)器的兩個(gè)數(shù)據(jù)集,還是會(huì)先將兩個(gè)數(shù)據(jù)集傳送到本地服務(wù)器,然后UNION兩個(gè)數(shù)據(jù)集,可以通過(guò)遠(yuǎn)程存儲(chǔ)過(guò)程,函數(shù)或視圖先UNION數(shù)據(jù)庫(kù)來(lái)阻止這個(gè)

4:書(shū)寫(xiě)太復(fù)雜的查詢(xún)語(yǔ)句

? 優(yōu)化器不能總是能明白你需要做什么,尤其是你的SQL語(yǔ)句中使用了鏈接服務(wù)器(Linked Server)時(shí),例如, 我遇到過(guò)一個(gè)類(lèi)似如下SQL語(yǔ)句,執(zhí)行了10分鐘

        
             1:
        
        
          SELECT
        
         *
      
        
             2:
        
        
          FROM
        
         LocalTable
      
        
             3:
        
        
          WHERE
        
         SomeColumn <
      
        
             4:
        
         (
        
          SELECT
        
        
          COUNT
        
        (*)
      
        
             5:
        
        
          FROM
        
         RemoteServer.SomeDB.dbo.SomeTable
      
        
             6:
        
        
          WHERE
        
         SomeColumn > 100)
      

我像這樣修改了查詢(xún)語(yǔ)句

        
             1:
        
        
          DECLARE
        
         @
        
          Count
        
        
          INT
        
      
        
             2:
        
        
          SELECT
        
         @
        
          Count
        
         = 
        
          COUNT
        
        (*)
      
        
             3:
        
        
          FROM
        
         RemoteServer.SomeDB.dbo.SomeTable
      
        
             4:
        
        
          WHERE
        
         SomeColumn > 100
      
        
             5:
        
      
        
             6:
        
        
          SELECT
        
         *
      
        
             7:
        
        
          FROM
        
         LocalTable
      
        
             8:
        
        
          WHERE
        
         SomeColumn < @Count
      


這樣重寫(xiě)SQL后,查詢(xún)語(yǔ)句只跑了一秒就查詢(xún)出結(jié)果了,保持SQL腳本簡(jiǎn)單。


5:當(dāng)數(shù)據(jù)庫(kù)位于同一個(gè)實(shí)例時(shí)使用鏈接服務(wù)器(Linked Server)
??

這種場(chǎng)景的性能損耗可能不像其它場(chǎng)景那樣明顯,但是這種方式比使用數(shù)據(jù)庫(kù)前綴(Database.dbo.TableName)要慢

如果你想?yún)^(qū)別這兩種情形,可以在測(cè)試數(shù)據(jù)庫(kù)測(cè)試、對(duì)比這兩種方法的性能,然后決定性能的提升是否值得在生產(chǎn)環(huán)境修改代碼。在某些情況下,它是會(huì)提升性能的。

?

--------------------------------------- 自己的體會(huì)、理解 ----------------------------------------------

??? 關(guān)于SQL SERVER的鏈接服務(wù)器(Linked Servers)這項(xiàng)功能,跨數(shù)據(jù)庫(kù)/跨服務(wù)器查詢(xún)時(shí)非常有用(比如分布式數(shù)據(jù)庫(kù)系統(tǒng)中),開(kāi)發(fā)人員尤其喜歡使用它連接到遠(yuǎn)程數(shù)據(jù)源查詢(xún)數(shù)據(jù),甚至都到了濫用的地步。正所謂很多東西都具有兩面性,鏈接服務(wù)器(Linked Servers)給跨服務(wù)器查詢(xún)、分布式查詢(xún)帶來(lái)方便、簡(jiǎn)單化的同時(shí),也帶來(lái)了性能、安全等一系列問(wèn)題。

1:性能問(wèn)題

??? 在復(fù)雜環(huán)境下(大數(shù)據(jù)時(shí)代更是如此),可能需要在多個(gè)不同服務(wù)器之間的數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)交互。由于數(shù)據(jù)可以無(wú)處不在,開(kāi)發(fā)人員自然要編寫(xiě)一個(gè)查詢(xún)聯(lián)接盡可能多的數(shù)據(jù)可以不考慮它是本地的還是遠(yuǎn)程的。于是鏈接服務(wù)器的大量使用應(yīng)運(yùn)而生,但是鏈接服務(wù)器的濫用和不合理使用可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)出現(xiàn)很多ASYNC_NETWORK_IO等待事件。另外,書(shū)寫(xiě)不好的SQL有可能導(dǎo)致嚴(yán)重的性能問(wèn)題。

? 解決方法:你可以通過(guò)發(fā)布-訂閱或者作業(yè)將數(shù)據(jù)集(表)數(shù)據(jù)先同步到本地服務(wù)器,然后將SQL腳本中的鏈接服務(wù)器去掉,這樣對(duì)SQL查詢(xún)性能有非常大的提升,尤其是查詢(xún)比較頻繁或數(shù)據(jù)量大的SQL語(yǔ)句。但是這樣隨之而來(lái)了其它問(wèn)題: 同步數(shù)據(jù)的及時(shí)性(作業(yè)同步數(shù)據(jù))、額外的精力去管理、監(jiān)控?cái)?shù)據(jù)同步(發(fā)布-訂閱)。

? SQL里面使用了Linked Servers導(dǎo)致性能低下,一方面是由于網(wǎng)絡(luò)數(shù)據(jù)傳送的延時(shí),另外一方面則是優(yōu)化器不能很好的生成最佳的執(zhí)行計(jì)劃. 解釋:由于權(quán)限問(wèn)題,使用了鏈接服務(wù)器(Linked Servers)的SQL導(dǎo)致SQL SERVER優(yōu)化器不能利用遠(yuǎn)程服務(wù)器這些表的統(tǒng)計(jì)信息,從而不能生成最優(yōu)的執(zhí)行計(jì)劃。如果SQL SERVER優(yōu)化器可以利用到遠(yuǎn)程服務(wù)器相關(guān)表的統(tǒng)計(jì)信息,則鏈接服務(wù)器使用的賬號(hào)必須擁有sysadmin、 db_owner, db_ddladmin這樣的角色,但是很多時(shí)候處于安全考慮,創(chuàng)建鏈接服務(wù)器時(shí)使用的賬號(hào)往往沒(méi)有這么大的權(quán)限。在SQL SERVER 2012 SP1中這個(gè)問(wèn)題已經(jīng)解決了,只需要擁有SELECT權(quán)限就可以使用遠(yuǎn)程服務(wù)器相關(guān)表的統(tǒng)計(jì)信息。

?

下面這段摘自 TOP 3 PERFORMANCE KILLERS FOR LINKED SERVER QUERIES

----------------------------------------------------------------------------------------------------------------

1. INSUFFICIENT PERMISSIONS

Without a doubt this is the number one reason for why linked server query performance suffers. Historically in order for SQL Server to take advantage of using statistics on the remote server then the login used to make the connection on the remote servers needed sufficient rights. The role needed would have been one of the following:

  • sysadmin
  • db_owner
  • db_ddladmin

If you don’t have sufficient permissions then you aren’t able to use stats, and this is killing your performance across that linked server connections. So for everyone that has been assigning the db_datareader role to remote logins you are sacrificing performance for security. While that may be an acceptable tradeoff in your shop, I am willing to wager that most admins have no idea about this silent performance killer.

A good example of identifying these symptoms are contained in this article: http://www.sql-server-performance.com/2006/api-server-cursors/

In SQL 2012 SP1 the permissions to view the statistics on an object have been modified so that a user with SELECT permission would be able to use the stats on the remote tables. Check this link for more details in the ‘Permissions’ section towards the bottom .

?

---------------------------------------------------------------------------------------------------

2:安全問(wèn)題

??? 濫用鏈接服務(wù)器會(huì)導(dǎo)致一個(gè)數(shù)據(jù)庫(kù)實(shí)例跟N個(gè)數(shù)據(jù)庫(kù)實(shí)例之間建立Linked Server,導(dǎo)致數(shù)據(jù)庫(kù)管理、監(jiān)控的變得越來(lái)越復(fù)雜,管理問(wèn)題是一個(gè),另外一個(gè)則是數(shù)據(jù)庫(kù)的安全問(wèn)題。這個(gè)最是頭痛。

?

參考資料:

http://www.dbnewsfeed.com/2012/09/08/5-performance-killers-when-working-with-linked-servers/

http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/

[翻譯]——SQL Server使用鏈接服務(wù)器的5個(gè)性能殺手


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 比如县| 连州市| 永川市| 永城市| 洪雅县| 瓦房店市| 巴马| 和田县| 宜宾市| 安义县| 固阳县| 城步| 昭平县| 蕲春县| 中阳县| 乐至县| 清徐县| 什邡市| 宁河县| 安达市| 全州县| 华蓥市| 海晏县| 新密市| 临邑县| 隆安县| 都匀市| 华蓥市| 长寿区| 登封市| 伊金霍洛旗| 静海县| 青海省| 峨眉山市| 黄冈市| 勃利县| 彝良县| 尤溪县| 孝感市| 法库县| 吉木乃县|