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

手把手教你提升SQL性能

開(kāi)發(fā)
SQL通過(guò)響應(yīng)時(shí)間,吞吐量,可伸縮性性能參數(shù)來(lái)表示其的性能高低,在日常的編些程序工作中我們可以注意一些問(wèn)題來(lái)提升SQL的性能。

SQL.NET都是微軟旗下的產(chǎn)品,它們延續(xù)了微軟的一貫風(fēng)格,它們的性能是相互影響的,不可分割的,所以要優(yōu)化SQL的性能,除了SQL可以注意的一些問(wèn)題外,還可以從.NET程序優(yōu)化做起。

SQL性能參數(shù)
響應(yīng)時(shí)間:在數(shù)據(jù)請(qǐng)求和數(shù)據(jù)返回這個(gè)過(guò)程中經(jīng)歷的時(shí)間。

  吞吐量:在一段時(shí)間內(nèi)從發(fā)送程序向接收程序傳輸?shù)臄?shù)據(jù)的數(shù)量。

  可伸縮性:當(dāng)同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)的用戶(hù)數(shù)量增加時(shí),應(yīng)用程序維持可以接受的響應(yīng)時(shí)間和吞吐量的能力。

編寫(xiě)SQL代碼原則
  減少網(wǎng)絡(luò)通信量

       限制磁盤(pán)I/O

       優(yōu)化應(yīng)用程序和驅(qū)動(dòng)程序之間的交互

       簡(jiǎn)化請(qǐng)求

NET程序優(yōu)化要點(diǎn)

使用連接池。

  連接池是應(yīng)用程序能夠重復(fù)使用的一個(gè)或多個(gè)數(shù)據(jù)庫(kù)連接的高速緩存。

  創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)連接所耗費(fèi)的時(shí)間主要取決于網(wǎng)絡(luò)的速度以及應(yīng)用程序和數(shù)據(jù)庫(kù)服務(wù)器的(網(wǎng)絡(luò))距離,而且這個(gè)過(guò)程通常是一個(gè)很耗時(shí)的過(guò)程。而采用數(shù)據(jù)庫(kù)連接池后,數(shù)據(jù)庫(kù)連接請(qǐng)求可以直接通過(guò)連接池滿(mǎn)足而不需要為該請(qǐng)求重新連接、認(rèn)證到數(shù)據(jù)庫(kù)服務(wù)器,減少建立物理連接所需要的相關(guān)資源開(kāi)銷(xiāo),這樣就節(jié)省了時(shí)間。

  適用:

  應(yīng)用程序運(yùn)行在應(yīng)用服務(wù)器上時(shí)。因?yàn)檫@意味著多個(gè)用戶(hù)會(huì)同時(shí)使用應(yīng)用程序。

  應(yīng)用程序具有多個(gè)用戶(hù),并且數(shù)據(jù)庫(kù)服務(wù)器具有足夠的內(nèi)存管理***數(shù)量的連接。

  不適用:

  應(yīng)用程序每天重新啟動(dòng)很多次。每次啟動(dòng)會(huì)在連接池中建立一些連接,這會(huì)降低性能。

  單用戶(hù)應(yīng)用程序。

  對(duì)于.NET應(yīng)用程序而言,默認(rèn)為允許連接池。當(dāng)然,如果你可以在SQLConnection對(duì)象的連接字符串中加進(jìn)Pooling=false禁止連接池的使用。

高效的建立和斷開(kāi)連接

       因?yàn)榻⑦B接需要耗費(fèi)內(nèi)存,如果待垃圾收集器清除不再使用的連接,連接占用內(nèi)存的時(shí)間比所需要的時(shí)間更長(zhǎng),從而削弱應(yīng)用程序的性能。

關(guān)閉事務(wù)的自動(dòng)提交。

使用tran.Commit()方法進(jìn)行手動(dòng)提交,因?yàn)槊總€(gè)提交操作都會(huì)耗費(fèi)大量的磁盤(pán)I/O,并且需要在驅(qū)動(dòng)程序和數(shù)據(jù)庫(kù)服務(wù)器之間進(jìn)行額外的網(wǎng)絡(luò)往返,使用手動(dòng)提交,應(yīng)用程序可以控制何時(shí)提交數(shù)據(jù)庫(kù)工作,從而顯著提高系統(tǒng)的性能。

       如果需要多次執(zhí)行SQL語(yǔ)句,可以使用cmd.Prepare()進(jìn)行預(yù)編譯,但如果只是執(zhí)行一次SQL,則沒(méi)有必要,因?yàn)闆](méi)有預(yù)先編譯的Command對(duì)象只需要一次網(wǎng)絡(luò)往返,而編譯的Command對(duì)象需要兩次(一次往返用于解析和優(yōu)化語(yǔ)句,一次往返用于執(zhí)行語(yǔ)句并檢索結(jié)果)。

       當(dāng)更新大量數(shù)據(jù)時(shí),為了減少網(wǎng)絡(luò)往返次數(shù),可以使用參數(shù)數(shù)組或批處理取代預(yù)編譯。

  1. string sql = “INSERT INTO employees VALUES (? , ?)”;    
  2. cmd.CommandText = sql;    
  3. cmd.Prepare();    
  4. for(int i = 0 ; i<100 ; i++)   
  5. {    
  6.      cmd.Parameters[0].Value = id[i];     
  7.      cmd.Parameters[1].Value = name[i];     
  8.      cmd.ExecuteNonQuery();   
  9. }   
  10.  

  上面的代碼演示了使用預(yù)編譯的Command對(duì)象執(zhí)行一條Insert語(yǔ)句多次的情況,這種情況下,為了執(zhí)行100次插入操作,需要101次網(wǎng)絡(luò)往返, 1次用于準(zhǔn)備語(yǔ)句,另外100次用于執(zhí)行迭代操作。

  1. string sql = “INSERT INTO employees VALUES (? , ?)”;    
  2. cmd.CommandText = sql;    
  3. cmd.ArrayBindCount = 10;    
  4. cmd.Prepare();    
  5. cmd.Parameters[0].Value = idArray;     
  6. cmd.Parameters[1].Value = nameArray;     
  7. cmd.ExecuteNonQuery();   
  8.  

 

  將Command對(duì)象的CommandText屬性設(shè)置為一個(gè)包含一條Insert語(yǔ)句和一個(gè)參數(shù)數(shù)組的字符串,這種方法只需要兩次網(wǎng)絡(luò)往返,一次用于準(zhǔn)備語(yǔ)句,另外一次用于執(zhí)行數(shù)組。

  1. string sql = “INSERT INTO employees VALUES (? , ?)”+      
  2.                  “INSERT INTO employees VALUES (? , ?)”+    
  3.                    …    
  4.               “INSERT INTO employees VALUES (? , ?)”    
  5. cmd.CommandText = sql;    
  6. cmd.Prepare();    
  7. cmd.Parameters[0].Value = id[0];     
  8. cmd.Parameters[1].Value = name[0];     
  9. …    
  10. cmd.ExecuteNonQuery();  

 

       以上代碼使用批處理的方式。

 

  如果應(yīng)用程序更新斷開(kāi)連接的DataSet,并且數(shù)據(jù)提供程序支持批處理,可以通過(guò)設(shè)置DataAdapter對(duì)象的UpdateBatchSize屬性?xún)?yōu)化性能。設(shè)置這個(gè)屬性指定與數(shù)據(jù)庫(kù)服務(wù)器的網(wǎng)絡(luò)往返次數(shù),從而優(yōu)化性能:

  1. view sourceprint?SqlDataAdapter sda = new SqlDataAdapter();    
  2. sda.InsertCommand = cmd;    
  3. sda.UpdateatchSize = 5;  //告訴數(shù)據(jù)提供程序打包5條命令,并在一次網(wǎng)絡(luò)往返中將它們發(fā)送到數(shù)據(jù)庫(kù)   

 

  避免使用CommandBuilder對(duì)象

因?yàn)椴l(fā)操作的限制,CommandBuilder經(jīng)常生成效率低下的SQL語(yǔ)句,此外CommandBuilder對(duì)象在運(yùn)行時(shí)生成語(yǔ)句,每次調(diào)用DataAdapter.Update方法時(shí),CommandBuilder都會(huì)分析結(jié)果集的內(nèi)容,并為DataAdapter生成Insert/Update/Delete語(yǔ)句,當(dāng)顯示指定了Insert/Update/Delete語(yǔ)句時(shí),就不需要這個(gè)額外的處理步驟。

       如果需要檢索大量只讀數(shù)據(jù),選擇DataReader,如果需要插入、更新或刪除數(shù)據(jù),以任何順序返回?cái)?shù)據(jù),才使用DataSet對(duì)象。雖然DataSet靈活,但是隨之而來(lái)的是它要消耗大量的內(nèi)存。

  DataReader對(duì)象針對(duì)快速檢索大量數(shù)據(jù)進(jìn)行了優(yōu)化,數(shù)據(jù)時(shí)只讀的,并且只能以向前的順序讀取數(shù)據(jù),內(nèi)存使用量最小。DataSet對(duì)象是代表整個(gè)數(shù)據(jù)結(jié)果集的數(shù)據(jù)緩存,可以修改DataSet中的數(shù)據(jù),并可以使用任意順序獲取數(shù)據(jù)。

  使用GetXXX方法從DataReader獲取數(shù)據(jù)

通用的方法是GetValue()和GetValues(),但需要額外的處理將值數(shù)據(jù)類(lèi)型裝換為引用數(shù)據(jù)類(lèi)型,為了避免裝箱,可以使用特性的如GetInt32()方法避免此問(wèn)題。

  在DataSet中搜索數(shù)據(jù)

  在一個(gè)數(shù)據(jù)集中查詢(xún)符合特定條件的行時(shí),使用基于索引(index-based)的查看表將提高性能。給數(shù)據(jù)表指定主鍵(PrimaryKey)值時(shí),就建立了一個(gè)索引。


  ·如果查詢(xún)是在數(shù)據(jù)表的主鍵列上進(jìn)行的,使用DataTable.Rows.Find代替DataTable.Select。
  ·查詢(xún)非主鍵列,可以使用數(shù)據(jù)視圖來(lái)提高多個(gè)數(shù)據(jù)查詢(xún)的速度。當(dāng)給數(shù)據(jù)視圖添加排序時(shí),將建立搜索時(shí)使用的索引,數(shù)據(jù)視圖暴露了查詢(xún)下層數(shù)據(jù)表的Find和FindRows方法。
  ·如果你不是查詢(xún)表的排序視圖,也可以通過(guò)為數(shù)據(jù)表建立數(shù)據(jù)視圖獲得基于索引的查看表的好處。注意如果你執(zhí)行數(shù)據(jù)上的多個(gè)查詢(xún)這是唯一的好處。如果你只執(zhí)行單個(gè)查詢(xún),需要建立索引的過(guò)程將因?yàn)槭褂盟饕档土诵阅堋?/P>

       總結(jié)

       SQL.NET性能相互影響,所以?xún)煞降男阅軆?yōu)化都做好了,才是王道。

【編輯推薦】

  1. 微軟 SQL Server 2008中自動(dòng)化數(shù)據(jù)采集器
  2. 詳細(xì)講解SQL Server索引的性能問(wèn)題
  3. SQL Server數(shù)據(jù)庫(kù)同步問(wèn)題
  4. 動(dòng)態(tài)創(chuàng)建SQL Server數(shù)據(jù)庫(kù)表存儲(chǔ)過(guò)程

 

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

2020-10-09 17:43:25

計(jì)算機(jī)CPU技術(shù)

2017-07-07 11:01:04

Spark性能調(diào)優(yōu)

2017-10-20 13:41:11

Spark集群代碼

2020-08-12 07:41:39

SQL 優(yōu)化語(yǔ)句

2009-04-22 09:17:19

LINQSQL基礎(chǔ)

2021-07-14 09:00:00

JavaFX開(kāi)發(fā)應(yīng)用

2010-08-09 09:25:23

SQL Server鏡

2011-01-10 14:41:26

2025-05-07 00:31:30

2011-05-03 15:59:00

黑盒打印機(jī)

2021-06-07 09:35:11

架構(gòu)運(yùn)維技術(shù)

2022-01-08 20:04:20

攔截系統(tǒng)調(diào)用

2022-03-14 14:47:21

HarmonyOS操作系統(tǒng)鴻蒙

2022-07-27 08:16:22

搜索引擎Lucene

2023-04-26 12:46:43

DockerSpringKubernetes

2022-12-07 08:42:35

2021-02-04 09:00:57

SQLDjango原生

2021-02-26 11:54:38

MyBatis 插件接口

2021-12-28 08:38:26

Linux 中斷喚醒系統(tǒng)Linux 系統(tǒng)

2024-03-05 18:27:43

點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产一区二区三区在线视频 | 黄色一级毛片 | 亚洲免费视频一区 | 亚洲欧美激情精品一区二区 | 在线免费观看黄视频 | 日韩成人免费在线视频 | 久久99精品国产自在现线小黄鸭 | 亚洲婷婷六月天 | 亚洲第一视频 | 日韩a| 国产精品视频一区二区三区 | 成人三级网址 | 一片毛片 | 日韩在线| 国产视频一视频二 | 丁香久久| 人碰人操 | 日韩一区在线观看视频 | 美女黄色在线观看 | 毛片黄 | 欧美日韩中文字幕在线 | 欧美日韩国产精品 | 日韩 欧美 综合 | 免费一看一级毛片 | 亚洲a在线观看 | 久久人体 | 国产激情一区二区三区 | 亚洲精品在线免费观看视频 | 亚洲一区二区免费 | 99热都是精品 | 欧美精品一区二区免费视频 | 国产一区中文字幕 | 日本一区二区三区在线观看 | 国产精品一区二区在线观看 | 国产午夜精品福利 | www.色综合 | 国产欧美精品一区二区色综合朱莉 | 国产 日韩 欧美 中文 在线播放 | 色爱综合网 | 成人精品鲁一区一区二区 | 亚洲天堂免费 |