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

手把手教你提升SQL性能

開發
SQL通過響應時間,吞吐量,可伸縮性性能參數來表示其的性能高低,在日常的編些程序工作中我們可以注意一些問題來提升SQL的性能。

SQL.NET都是微軟旗下的產品,它們延續了微軟的一貫風格,它們的性能是相互影響的,不可分割的,所以要優化SQL的性能,除了SQL可以注意的一些問題外,還可以從.NET程序優化做起。

SQL性能參數
響應時間:在數據請求和數據返回這個過程中經歷的時間。

  吞吐量:在一段時間內從發送程序向接收程序傳輸的數據的數量。

  可伸縮性:當同時訪問數據庫的用戶數量增加時,應用程序維持可以接受的響應時間和吞吐量的能力。

編寫SQL代碼原則
  減少網絡通信量

       限制磁盤I/O

       優化應用程序和驅動程序之間的交互

       簡化請求

NET程序優化要點

使用連接池。

  連接池是應用程序能夠重復使用的一個或多個數據庫連接的高速緩存。

  創建一個新的數據庫連接所耗費的時間主要取決于網絡的速度以及應用程序和數據庫服務器的(網絡)距離,而且這個過程通常是一個很耗時的過程。而采用數據庫連接池后,數據庫連接請求可以直接通過連接池滿足而不需要為該請求重新連接、認證到數據庫服務器,減少建立物理連接所需要的相關資源開銷,這樣就節省了時間。

  適用:

  應用程序運行在應用服務器上時。因為這意味著多個用戶會同時使用應用程序。

  應用程序具有多個用戶,并且數據庫服務器具有足夠的內存管理***數量的連接。

  不適用:

  應用程序每天重新啟動很多次。每次啟動會在連接池中建立一些連接,這會降低性能。

  單用戶應用程序。

  對于.NET應用程序而言,默認為允許連接池。當然,如果你可以在SQLConnection對象的連接字符串中加進Pooling=false禁止連接池的使用。

高效的建立和斷開連接。

       因為建立連接需要耗費內存,如果待垃圾收集器清除不再使用的連接,連接占用內存的時間比所需要的時間更長,從而削弱應用程序的性能。

關閉事務的自動提交。

使用tran.Commit()方法進行手動提交,因為每個提交操作都會耗費大量的磁盤I/O,并且需要在驅動程序和數據庫服務器之間進行額外的網絡往返,使用手動提交,應用程序可以控制何時提交數據庫工作,從而顯著提高系統的性能。

       如果需要多次執行SQL語句,可以使用cmd.Prepare()進行預編譯,但如果只是執行一次SQL,則沒有必要,因為沒有預先編譯的Command對象只需要一次網絡往返,而編譯的Command對象需要兩次(一次往返用于解析和優化語句,一次往返用于執行語句并檢索結果)。

       當更新大量數據時,為了減少網絡往返次數,可以使用參數數組或批處理取代預編譯。

  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.  

  上面的代碼演示了使用預編譯的Command對象執行一條Insert語句多次的情況,這種情況下,為了執行100次插入操作,需要101次網絡往返, 1次用于準備語句,另外100次用于執行迭代操作。

  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對象的CommandText屬性設置為一個包含一條Insert語句和一個參數數組的字符串,這種方法只需要兩次網絡往返,一次用于準備語句,另外一次用于執行數組。

  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();  

 

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

 

  如果應用程序更新斷開連接的DataSet,并且數據提供程序支持批處理,可以通過設置DataAdapter對象的UpdateBatchSize屬性優化性能。設置這個屬性指定與數據庫服務器的網絡往返次數,從而優化性能:

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

 

  避免使用CommandBuilder對象

因為并發操作的限制,CommandBuilder經常生成效率低下的SQL語句,此外CommandBuilder對象在運行時生成語句,每次調用DataAdapter.Update方法時,CommandBuilder都會分析結果集的內容,并為DataAdapter生成Insert/Update/Delete語句,當顯示指定了Insert/Update/Delete語句時,就不需要這個額外的處理步驟。

       如果需要檢索大量只讀數據,選擇DataReader,如果需要插入、更新或刪除數據,以任何順序返回數據,才使用DataSet對象。雖然DataSet靈活,但是隨之而來的是它要消耗大量的內存。

  DataReader對象針對快速檢索大量數據進行了優化,數據時只讀的,并且只能以向前的順序讀取數據,內存使用量最小。DataSet對象是代表整個數據結果集的數據緩存,可以修改DataSet中的數據,并可以使用任意順序獲取數據。

  使用GetXXX方法從DataReader獲取數據

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

  在DataSet中搜索數據

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


  ·如果查詢是在數據表的主鍵列上進行的,使用DataTable.Rows.Find代替DataTable.Select。
  ·查詢非主鍵列,可以使用數據視圖來提高多個數據查詢的速度。當給數據視圖添加排序時,將建立搜索時使用的索引,數據視圖暴露了查詢下層數據表的Find和FindRows方法。
  ·如果你不是查詢表的排序視圖,也可以通過為數據表建立數據視圖獲得基于索引的查看表的好處。注意如果你執行數據上的多個查詢這是唯一的好處。如果你只執行單個查詢,需要建立索引的過程將因為使用索引而降低了性能。

       總結

       SQL.NET性能相互影響,所以兩方的性能優化都做好了,才是王道。

【編輯推薦】

  1. 微軟 SQL Server 2008中自動化數據采集器
  2. 詳細講解SQL Server索引的性能問題
  3. SQL Server數據庫同步問題
  4. 動態創建SQL Server數據庫表存儲過程

 

責任編輯:佚名 來源: 博客園
相關推薦

2020-10-09 17:43:25

計算機CPU技術

2017-07-07 11:01:04

Spark性能調優

2017-10-20 13:41:11

Spark集群代碼

2009-04-22 09:17:19

LINQSQL基礎

2020-08-12 07:41:39

SQL 優化語句

2011-01-10 14:41:26

2025-05-07 00:31:30

2011-05-03 15:59:00

黑盒打印機

2021-07-14 09:00:00

JavaFX開發應用

2010-08-09 09:25:23

SQL Server鏡

2021-06-07 09:35:11

架構運維技術

2021-02-26 11:54:38

MyBatis 插件接口

2021-12-28 08:38:26

Linux 中斷喚醒系統Linux 系統

2021-02-04 09:00:57

SQLDjango原生

2023-04-26 12:46:43

DockerSpringKubernetes

2022-01-08 20:04:20

攔截系統調用

2022-07-27 08:16:22

搜索引擎Lucene

2022-12-07 08:42:35

2022-03-14 14:47:21

HarmonyOS操作系統鴻蒙

2020-07-09 08:59:52

if else模板Service
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲看片网站 | 欧美精品一区二区三区四区 在线 | 最新av中文字幕 | 日韩欧美网 | 亚洲精品一区二区三区中文字幕 | 国产欧美精品一区二区色综合朱莉 | 成人综合一区二区 | 午夜视频在线观看一区二区 | 99精品国产在热久久 | 国产精品成人一区二区三区吃奶 | 国产一区二区日韩 | 日韩综合在线 | 精品久久国产 | 在线播放一区 | 国产精品久久久久无码av | www.国产精品 | 国产9999精品 | 黄色一级大片在线免费看产 | 国产一区影院 | 81精品国产乱码久久久久久 | 国产精品福利网 | 亚洲国产欧美精品 | 天堂久久久久久久 | 操到爽 | 91久久精品视频 | 精品一区二区av | 亚洲成人午夜电影 | 国产一区二区三区www | 中文字幕第三页 | 国产福利视频导航 | 成人精品一区二区三区 | 欧美日韩精品一区二区三区四区 | 超碰97人人人人人蜜桃 | 日韩中文字幕免费在线观看 | 欧美视频1| 国产91 在线播放 | 国产成人99久久亚洲综合精品 | 精品91av| 免费网站在线 | 人人操日日干 | 亚洲最大成人综合 |