亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

SQL Server數據庫索引優化

添加時間:2014-3-4 16:55:59  添加: 思海網絡 

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

  1)對什么列建索引

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

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

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

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

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

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

  可以用下面的sql做實驗:

  01 USE [Test]
  02 GO
  03 /****** 對象: Table [dbo].[testIndexOrder] 腳本日期: 05/27/2010 09:11:26 ******/
  04 SET ANSI_NULLS ON
  05 GO
  06 SET QUOTED_IDENTIFIER ON
  07 GO
  08 CREATE TABLE [dbo].[testIndexOrder](
  09 [ID] [int] IDENTITY(1,1) NOT NULL,
  10 [FirstName] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
  11 [LastName] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
  12 [Desc] [nvarchar](400) COLLATE Chinese_PRC_CI_AS NULL,
  13 CONSTRAINT [PK_testIndexOrder] PRIMARY KEY CLUSTERED
  14 (
  15 [ID] ASC
  16 )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
  17 ) ON [PRIMARY]
  18 GO
  19 /****** 對象: Index [IX_testIndexOrder] 腳本日期: 05/27/2010 09:11:51 ******/
  20 CREATE NONCLUSTERED INDEX [IX_testIndexOrder] ON [dbo].[testIndexOrder]
  21 (
  22 [FirstName] ASC,
  23 [LastName] ASC
  24 )WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
  25 GO
  26 declare @i INT;
  27 DECLARE @random varchar(36);
  28 set @i = 0;
  29 while @i < 100000
  30 begin
  31 set @random = newid();
  32
  33 INSERT INTO [testIndexOrder]
  34 (FirstName,LastName,[Desc])
  35 VALUES(
  36 substring(@random,1,8),substring(@random,12,8),@random
  37 );
  38 set @i = @i + 1
  39 end
  40
  41
  42 set statistics time on
  43 select * from [testIndexOrder] where lastname = '6F-4ECA-'
  44 select * from [testIndexOrder] where firstname = 'CAABE009'
  45 set statistics time off

  4)索引的個數問題

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

  5)在必要時重建索引

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

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

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

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

關鍵字:SQL Server、數據庫索引、優化

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站