青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-381  評論-37  文章-0  trackbacks-0

轉:http://blog.csdn.net/jiangxinyu/archive/2008/09/03/2874201.aspx

摘要:數據庫優化不僅是數據庫管理員的任務,程序員也必須知道一些優化技巧,有利于開發高效的數據庫系統。
關鍵字:數據庫 優化 技巧

如果是團隊開發,作為程序員必須知道本文描述的數據庫優化技巧,如果你的sa水平比較差,那即使你再努力也些不出高效的數據庫應用系統。
如果是單獨開發,那就更不必說了。

多數公司的數據庫管理員(sa)是不夠格的,即使拿了各種認證證件,也差不多還是垃圾管理員,無非是可以混個好職位,多拿一些工資。
如果你所在的公司沒有合格的sa,作為程序員的你必須執行做許多數據庫優化的工作了。
市面上的數據庫類圖書也不過是騙錢的把戲,無非為了出書而出書,為了出名而出書。
95%以上的作者沒有實踐的經驗,99%以上的作者沒有優化的經驗。他們編寫圖書的來源無非是外文(不見得好啊)或者是互聯網上的資訊。

廢話不說了,開始吧。程序員級別的優化有哪些手段?

(1)數據庫的設置:如果你的數據庫記錄數不會超過30萬條?如果你的數據庫記錄超過100萬條?該如何設置數據庫?一個或多個?
(2)數據庫表的設置:當你的某個數據庫表記錄超過100萬級別,而且每天大量增長,這是一個不得不考慮的問題。如果你的系統瀏覽量很大,即使是30萬條記錄也是需要考慮的。
(3)索引的使用:索引可以大大提高數據庫訪問速度。什么時候用?哪些字段使用?
(4)存儲過程的使用:存儲過程終歸是比較好的,但是如果需要維護成百上千的存儲過程,未必是劃算的工程。
(5)高效的分頁技術:數據庫記錄分頁列表是大量必須使用的基本技術,怎樣的分頁是快速的?

宗旨你需要從上述5個方面考慮數據庫的優化。

什么時候需要數據庫優化?
(1)編寫代碼之前;
(2)系統速度慢了的時候;

下面就是一些具體的優化技巧了。

(1)超大量記錄數據庫的優化技巧

如果你的數據庫表記錄有超過100萬級別,而且不斷增長中。可以采取兩個手段:
第一:將數據庫表拆分到不同的庫中,比如 tblMEMBER 就可以拆分到 DB1 與 DB2 中去。
實際上,可以拆分到 DB001 ... DB100 甚至更多的庫中間去。
DB1 與 DB2 最好不在一塊硬盤上。
第二:如果更大量級的數據,則最好拆分到不同的數據庫服務器中去。

數據庫的拆分帶來的是查詢等操作的復雜性。簡單地可以通過 hash 或者 按序號 匹配不同的數據庫。復雜一些,應該設置一個獨立的應用服務器(軟件)協調其中的操作。

(2)中等量級數據庫的優化技巧

所謂中等量級數據庫是指數據庫100萬-500萬條記錄左右(單個數據庫表)。這樣的數據庫為了提高訪問(響應)速度,可以將表拆分到更小的表。比如 tblMEMBER 可以拆分為 tblMEMBER_00 ... tblMEMBER_99 。
這樣可以保證每個表的記錄數不超過50萬,那速度是"相當"快了。

(3)避免使用視圖(viewport)與關聯

視圖viewport與關聯都是為了程序員處理相對復雜的數據管理提供方便的手段。萬物有其利,必有其弊。視圖和關聯提高了編程效率,都會較大地影響數據庫的訪問效率(事實上并不像一般資料說介紹的的那樣高效),因此如果是web應用,則建議一般不要使用視圖與關聯。

(4)不要忘記索引(index)也不要濫用索引(index)

索引是提高數據庫效率的簡單又高效的方法。只要是設置了數據庫表(table),就不要忘記設置索引(index)。將索引設置在經常用于排序的字段上,其他字段就不要設置了。
索引不是越多越好,也不是什么字段都適合建立索引的。數據重復性太多的字段不要設置索引。比如 tblMEMBER 的 iSex 字段只有 0 1 兩個值,就不要設置索引。

(5)二進制的 text image 等字段應該單獨設置別的表中

一般的數據庫應用難免都需要保存比如描述、圖片等信息;一般描述類信息用 text 字段,圖片類信息用 image 字段;這里要說的是,不要將這些字段與其他字段放在一個表中。
比如:

view plaincopy to clipboardprint?
tblMEMBER   
id (int)   
cName (varchar)(64)   
cDescription (text)   
bPhoto (image)   
dDate (datetime)   
就應該拆分為3個表   
tblMEMBER   
id (int)   
cName (varchar)(64)   
dDate (datetime)   
tblMEMBER_DESC   
id (int)   
cDescription (text)   
dDate (datetime)   
tblMEMBER_PHOTO   
id (int)   
bPhoto (image)   
dDate (datetime) 
  tblMEMBER
  id (int)
  cName (varchar)(64)
  cDescription (text)
  bPhoto (image)
  dDate (datetime)
  就應該拆分為3個表
  tblMEMBER
  id (int)
  cName (varchar)(64)
  dDate (datetime)
  tblMEMBER_DESC
  id (int)
  cDescription (text)
  dDate (datetime)
  tblMEMBER_PHOTO
  id (int)
  bPhoto (image)
  dDate (datetime)
 (6)不要使用文本類型的 id

一般的數據庫表都會以一個種子字段作為主鍵。可以在與不少年青的程序員朋友溝通過程中,發現他們很喜歡用字符串類型的作為系統的 id 號。
比如:id = XX XX XX XX 這樣的字符串,每兩個位置代表不同的類別等含義。
不知道是那本教材如此誤人子弟,作出這樣的表率 :<
作為系統的 id 號,一定要使用數字型的。

(7)數據庫表table的字段field不要太多

本以為無需說明,也是發現不少的朋友,為了省事,一股腦把所有的相關字段都放在一個表中間。這樣做的后果便是,程序寫起來簡單了,運行效率下來了。
無論字段多少,有兩類字段是必須獨立出去的:一是進程更新的字段,比如文章的點擊次數字段iShow,二是二進制或者是text字段;

(8)將字符串(varchar)比較變成數字型(int)比較

每個系統都會有用戶管理,其中必然有 昵稱,密碼,郵件等的字符串類型數據比較的問題。在數據庫操作中,字符串比較的效率是相當低下的。因此遇到字符串的比較,必須將其轉換為數字型比較。
具體做法是:在數據庫表中增加相應的數字字段,比如 cNickname -> iNickNumber ,其中 iNickNumber 的數值為 cNickname 的 哈希值(如何計算字符串的哈希值?請參閱本站的其他文章)。
通過這樣的轉換,系統效率可以提高 100 倍哦!!!

(9)為每個數據庫表(table)設置 datetime 字段

在許多情況下,很多的表是不需要 datetime 字段用于保存時間的。本文的建議是你應該為每個表都設置 datetime 字段,而且默認值為 getdate()。
我們的經驗是,datetime 是實數,占用字節不多;在進行系統維護,遠程備份等環節都會發揮意想不到的效果。

(10)適當使用存儲過程(Stored Processing)

存儲過程(sp)已經被大大地宣傳了,本文也不例外地贊許采用存儲過程。本文的建議是只在下列情況才使用存儲過程:一是一個業務處理是事務,包含了多個處理過程;二是一種處理被高頻使用,使用存儲過程可以提高效率;

(11)使用高效的分頁(ination)技術

數據庫記錄分頁列表是大量必須使用的基本技術,因此本文建議你在每個數據庫中建立下面的存儲過程:

view plaincopy to clipboardprint?
CREATE PROCEDURE xsp_ination   
(   
@tblName   varchar(64),                
@strGetFields varchar(256) = "*",    
@fldName varchar(64)="",               
@PageSize   int = 20,                  
@PageIndex  int = 1,                   
@OrderType bit = 1,                    
@strWhere  varchar(256) = ""     
)   
AS    
BEGIN  
declare @strSQL   varchar(1000)      
declare @strTmp   varchar(110)        
declare @strOrder varchar(400)      
SET NOCOUNT ON  
if @OrderType != 0   
   begin  
      set @strTmp = "<(select min"    
      set @strOrder = " order by [" + @fldName +"] desc"    
   end  
else    
   begin    
      set @strTmp = ">(select max"    
      set @strOrder = " order by [" + @fldName +"] asc"    
   end    
if @PageIndex = 1   
   begin  
      if @strWhere != ""      
         set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from " + @tblName + " where " + @strWhere + " " + @strOrder   
      else    
         set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from "+ @tblName + " "+ @strOrder   
   end  
else    
   begin  
      set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from "  
                     + @tblName + " where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] from " + @tblName + " " + @strOrder + ") as tblTmp)"+ @strOrder   
      if @strWhere != ""    
         set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from "  
                     + @tblName + " where [" + @fldName + "]" + @strTmp + "(["  
                     + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["    
                     + @fldName + "] from " + @tblName + " where " + @strWhere + " "  
                     + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder    
   end  
EXEC (@strSQL)   
if @@error=0 return 1   
SET NOCOUNT OFF  
END  
GO 
CREATE PROCEDURE xsp_ination
(
@tblName   varchar(64),      
@strGetFields varchar(256) = "*",
@fldName varchar(64)="",    
@PageSize   int = 20,     
@PageIndex  int = 1,      
@OrderType bit = 1,      
@strWhere  varchar(256) = "" 
)
AS
BEGIN
declare @strSQL   varchar(1000)  
declare @strTmp   varchar(110)    
declare @strOrder varchar(400)  
SET NOCOUNT ON
if @OrderType != 0
 begin
  set @strTmp = "<(select min"
  set @strOrder = " order by [" + @fldName +"] desc"
 end
else
 begin
  set @strTmp = ">(select max"
  set @strOrder = " order by [" + @fldName +"] asc"
 end
if @PageIndex = 1
 begin
  if @strWhere != ""  
   set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from " + @tblName + " where " + @strWhere + " " + @strOrder
  else
   set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from "+ @tblName + " "+ @strOrder
 end
else
 begin
  set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from "
       + @tblName + " where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] from " + @tblName + " " + @strOrder + ") as tblTmp)"+ @strOrder
  if @strWhere != ""
   set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from "
       + @tblName + " where [" + @fldName + "]" + @strTmp + "(["
       + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
       + @fldName + "] from " + @tblName + " where " + @strWhere + " "
       + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder
 end
EXEC (@strSQL)
if @@error=0 return 1
SET NOCOUNT OFF
END
GO
 
使用方法是(C#):

view plaincopy to clipboardprint?
sql = "EXEC [dbo].[xsp_ination] \"tblNEWS\",\"*\",\"id\",40," + pindex.ToString() + ",1,\"iType=" + type.ToString();   
SqlDataReader sr = ExecuteReader(sql);   
while (sr.Read())   
{   
   ...   
}   
sr.Close(); 
sql = "EXEC [dbo].[xsp_ination] \"tblNEWS\",\"*\",\"id\",40," + pindex.ToString() + ",1,\"iType=" + type.ToString();
SqlDataReader sr = ExecuteReader(sql);
while (sr.Read())
{
   ...
}
sr.Close();
 
上面的優化技巧僅是一些常見的手段,如果你的系統(小系統就算了)遇到效率問題,可以與聯高軟件聯系。

轉載本文請注明出處,以便遇到優化困難的朋友可以找到聯高提供幫助。

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jiangxinyu/archive/2008/09/03/2874201.aspx

posted on 2010-10-06 02:24 小王 閱讀(458) 評論(0)  編輯 收藏 引用 所屬分類: DB
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区视频在线观看视频| 欧美xxx成人| 国产精品视频999| 欧美亚洲成人网| 国产精品久久久久影院色老大| 欧美视频1区| 国产乱码精品一区二区三区忘忧草 | 一本久久综合| 亚洲香蕉视频| 欧美在线不卡视频| 老牛嫩草一区二区三区日本 | 午夜精品成人在线视频| 久久久久久久久久久久久久一区| 久久五月婷婷丁香社区| 亚洲国产精品一区二区尤物区 | 午夜精品久久久久| 免费成人毛片| 亚洲视频中文字幕| 久久精品三级| 欧美视频1区| 在线观看欧美成人| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲人成人一区二区在线观看| 一本到高清视频免费精品| 欧美制服丝袜第一页| 欧美区在线观看| 国产一区二区三区久久悠悠色av| 99re66热这里只有精品3直播| 欧美激情第一页xxx| 欧美大片免费看| 亚洲一区二区毛片| 嫩草影视亚洲| 国产丝袜美腿一区二区三区| 日韩一级成人av| 久久影视三级福利片| 一本色道久久| 欧美黄色网络| 在线观看亚洲a| 欧美在线视频播放| 夜夜爽www精品| 欧美激情综合在线| 亚洲高清不卡av| 久久久97精品| 午夜精品久久久久久久| 欧美性感一类影片在线播放 | 久久精品亚洲一区二区| 国产精品高潮久久| 国产精品99久久99久久久二8| 美日韩精品免费观看视频| 亚洲欧美日韩久久精品| 国产精品草莓在线免费观看| 日韩亚洲精品在线| 亚洲欧洲一区二区天堂久久| 久久综合影视| 亚洲国产美女精品久久久久∴| 久久久久久999| 久久精品成人| 一区二区三区亚洲| 久久综合给合| 久久久人成影片一区二区三区观看| 国产麻豆精品视频| 久久精品一区二区三区不卡| 欧美尤物一区| **性色生活片久久毛片| 欧美 亚欧 日韩视频在线| 老司机精品福利视频| 亚洲国产日韩欧美| 亚洲国产小视频| 欧美日韩直播| 欧美一级片在线播放| 欧美一级电影久久| 1024国产精品| 欧美国产日韩精品| 欧美成人国产一区二区| 艳妇臀荡乳欲伦亚洲一区| 一区电影在线观看| 国产亚洲欧美日韩美女| 女同性一区二区三区人了人一 | 国内精品久久久久伊人av| 久久视频在线看| 欧美黄色小视频| 亚洲综合欧美| 久久国内精品自在自线400部| 亚洲经典一区| 宅男在线国产精品| 午夜精品免费在线| 老司机精品导航| 在线亚洲一区二区| 午夜在线一区二区| 亚洲电影专区| 亚洲校园激情| 亚洲国产美女久久久久| 亚洲少妇自拍| 亚洲国产精品视频一区| 在线一区二区视频| 亚洲国产日韩一区| 亚洲自拍偷拍网址| 伊人精品久久久久7777| 一个人看的www久久| 亚洲成人在线免费| 亚洲视频一区在线观看| 在线日韩精品视频| 亚洲综合精品一区二区| 亚洲精品国产欧美| 亚洲影院免费观看| 亚洲精品日韩精品| 久久国内精品自在自线400部| 一区二区三区日韩欧美| 久久精品国产亚洲一区二区| 亚洲直播在线一区| 欧美激情偷拍| 欧美大学生性色视频| 国产午夜亚洲精品羞羞网站| 亚洲理伦在线| 亚洲人成网站在线观看播放| 久久国产视频网站| 欧美在线亚洲综合一区| 欧美视频日韩视频在线观看| 亚洲第一精品夜夜躁人人爽| 国产专区综合网| 亚洲欧美一区二区精品久久久| 亚洲视频在线观看免费| 欧美激情精品久久久久久大尺度 | 欧美激情一区二区三区在线视频| 久久精品国产一区二区三| 国产精品国产三级国产| 亚洲精品在线免费| 日韩图片一区| 欧美精品一级| 亚洲日本中文字幕| 亚洲精品乱码视频| 欧美激情一区二区三区| 亚洲欧洲一区二区在线观看| 日韩五码在线| 欧美日韩国内自拍| 亚洲美女少妇无套啪啪呻吟| 一本色道**综合亚洲精品蜜桃冫 | 久久久噜噜噜久久| 国产亚洲一区在线播放| 欧美一级播放| 久久中文字幕导航| 亚洲激情av在线| 欧美成人xxx| 夜夜嗨av一区二区三区四区 | 国色天香一区二区| 99在线|亚洲一区二区| 亚洲色图在线视频| 国产精品久久久久久久久久直播| av不卡免费看| 欧美一区二区三区在线看| 国产啪精品视频| 久久精品一区二区三区不卡牛牛 | 国产欧美一区二区三区视频| 亚洲影视在线播放| 久久综合色婷婷| 亚洲精品永久免费| 欧美体内she精视频| 亚洲欧美在线网| 免费成人在线观看视频| 99伊人成综合| 国产乱码精品一区二区三区忘忧草| 欧美有码视频| 亚洲人成网站影音先锋播放| 午夜精品婷婷| 亚洲第一黄网| 国产精品国产三级国产aⅴ浪潮 | 亚洲精品国产无天堂网2021| 欧美激情在线免费观看| 亚洲午夜激情免费视频| 久久综合999| 亚洲综合日本| 亚洲毛片在线看| 国产日韩欧美高清| 欧美成人免费在线视频| 亚洲欧美中文日韩在线| 亚洲国产日本| 久久久久久久久久看片| 亚洲午夜精品在线| 亚洲国产精品成人va在线观看| 国产精品家庭影院| 欧美成人免费大片| 久久乐国产精品| 亚洲一级黄色| 亚洲高清自拍| 久久久噜噜噜久久中文字免| 在线亚洲美日韩| 亚洲电影激情视频网站| 国产精品午夜国产小视频| 亚洲免费视频网站| 亚洲精品美女久久久久| 免费中文日韩| 久久久久久久97| 亚洲一区二区三区777| 亚洲人成在线观看网站高清| 国内精品久久久久影院色 | 1024成人网色www| 国产精品影音先锋| 欧美网站在线| 欧美片第1页综合| 欧美精品一区视频|