點擊這里給我發消息
點擊這里給我發消息
首 頁
網站案例
虛擬主機
企業郵箱
域名注冊
Flash制作
軟件開發
廣告設計
服務報價
激情唯誠
聯系我們
公告:熱烈慶祝南京唯誠網絡2010版官方網站改版成功!
 
當前位置 :南京網站建設>網頁學堂>列表  
Asp.Net網站優化系列 數據庫和索引優化
時間:2010-06-19 15:55 來源:南京網站建設 點擊:
TAG:
 

索引的作用就類似于書的目錄,書的目錄會按照章節的順序排列,會指想某一張的位置。這樣如果在一本數百頁的書里面查找某個章節位置的時候,我們就可以只掃描書的目錄,掃描的范圍縮小了n倍,查詢的效率自然就提高了。另外在sql server內存夠用的情況下索引會被放到內存中,在內存中查找自然又會提高效率;所以我們必須得合理利用索引。

1)對什么列建索引

數據庫默認情況下會對主鍵建聚集索引,除了這個索引之外還需要在哪些列上建索引呢?這個問題只能具體情況具體分析,要看需要優化的sql語句(通常是查詢次數多,查詢相應想要高的語句),根據什么列的條件進行查詢。

例如:在論壇的數據庫中有一張表是帖子回復表,在論壇的應用中用到最多的就是對指定帖子的某一頁的回復進行查詢,查詢回復表的條件是主貼的id;這時候在主貼字段上建索引就勢在必然。

2)一定要在主鍵上建聚集索引嗎

通常情況下sql server會自動給主鍵加上聚集索引,但也有一些例外的情況我們需要把聚集索引建在其他列上,例如我們用到了表分區,而分區的字段不是主鍵,這時候就需要將聚集索引建在分區的列上。另外如果查詢時根據主鍵查詢較少,而根據其他列的查詢較頻繁,則也可以考慮將聚集索引建在非主鍵上。單需要注意的是聚集索引的列必須是不易變的列,如果聚集索引變了一會引起聚集索引內的記錄的搬遷,造成頁page的分離與碎片;二會引起每一個非聚 集索引被修改,以便于所有相關的非聚集索引的行的索引鍵的值被糾正。這既浪費時間和空間,也導致需要整理的碎片,增加了不必要的開銷(每個列重組聚集鍵)。

3)復合索引(索引有兩個以上的列)要注意列順序

索引在數據庫中是以B樹的形式存儲的。包含A,B兩個列的索引會首先根據A列建B樹,A列的葉節點上才會開始根據B列建B樹。所以包含兩個列的索引就需要根據查詢條件所在列來決定兩個列在索引中的順序。

可以用下面的sql做實驗:

 

以下為引用的內容:
USE [Test]
GO
/****** 對象:  Table [dbo].[testIndexOrder]    腳本日期: 05/27/2010 09:11:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[testIndexOrder](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [FirstName] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [LastName] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [Desc] [nvarchar](400) COLLATE Chinese_PRC_CI_AS NULL,
 CONSTRAINT [PK_testIndexOrder] PRIMARY KEY CLUSTERED 
(
 [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** 對象:  Index [IX_testIndexOrder]    腳本日期: 05/27/2010 09:11:51 ******/
CREATE NONCLUSTERED INDEX [IX_testIndexOrder] ON [dbo].[testIndexOrder] 
(
 [FirstName] ASC,
 [LastName] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
GO
declare @i INT;
DECLARE @random varchar(36);
set @i = 0;
while @i < 100000
 begin
 set @random = newid();

 INSERT INTO [testIndexOrder]
 (FirstName,LastName,[Desc])
 VALUES(
  substring(@random,1,8),substring(@random,12,8),@random
 );
 set @i = @i + 1
end


set statistics time on
select * from [testIndexOrder] where lastname = '6F-4ECA-'
select * from [testIndexOrder] where firstname = 'CAABE009'
set statistics time off

 

4)索引的個數問題

索引提高查詢效率是以降低更新、插入、刪除的速度為代價的。每當索引列發生變化時都需要對索引數據進行相應的調整。所以一個表上不可以建太多的索引,除非你完全不在乎修改數據的效率。另外sql server本身會對索引的數量和索引的數據長度有限制,具體請參考

5)在必要時重建索引

Sql server運行一段時間之后就會形成一些索引碎片,這時候就需要重建索引了,有時候重建索引可以起到意想不到的效果。

查看索引碎片,重建索引,可以通過sql server管理器來重建;也可以通過下面的sql語句來實現:

 

以下為引用的內容:

--顯示表testIndexOrder的索引碎片情況
DBCC SHOWCONTIG(testIndexOrder)

--重建表的索引
--第一個參數,可以是表名,也可以是表ID。
--第二個參數,如果是'',表示影響該表的所有索引。
--第三個參數,填充因子,即索引頁的數據填充程度。如果是,表示每一個索引頁都全部填滿,此時select效率最高,但以后要插入索引時,就得移動后面的所有頁,效率很低。如果是,表示使用先前的填充因子值。
DBCC DBREINDEX(testIndexOrder,'',)

 

數據庫優化是一門復雜的學問,需要不斷的學習實踐,積累經驗。

(責任編輯:admin)
 
 
上一篇:搜索文本字段的各種方式對比
下一篇:Asp.Net 網站優化系列
 


 推薦關注

 熱點關注

關于我們 | 工作機會 | 付款方式 | 網站制作 | 網頁制作 | 網頁設計 | 網絡公司 | 聯系我們 | 網站地圖
版權所有:南京唯誠信息技術有限公司 © 2005-2010 All Rights Reserved.
咨詢專線:400-657-0669 技術專線:025-83208669-808 傳真:025-83208669-803
地址:南京市鼓樓區廣州路37-1號江蘇科技大廈502室 郵編:210008 蘇ICP備05002558號
辽宁35选七最新开奖 金融投资股票 云南11选五5前三组走势图 现在做什么网站赚钱 黑龙江p62开奖官网 2020中超赛程对阵表 开元棋牌游戏大厅下载安装 赛车pk10永久稳赢技巧 4987铁算结果开奖结果小说 今日打麻将哪个位置能赢钱 一万块钱炒股可以赚钱吗 30选5开奖号码 不联网单机四人麻将 发行股票和发行债券 现在什么网游能赚钱 麻将游戏下载单机版 10月10日股票开