當前位置:首頁 » 編程語言 » SQl索引要經常重建嗎
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

SQl索引要經常重建嗎

發布時間: 2022-06-01 19:27:43

sql2005重建表索引會不會對表數據有影響

重建普通的索引, 對表的數據不會有影響。

因為 索引 不修改數據, 只是 某些情況下, 幫助查詢的時候,快速定位數據。

例如你現在有本 新華字典。
你按照 部首筆畫, 找某個字。
就是先查找 索引, 通過索引, 知道 某個字, 在某一頁上面, 然後再翻到那一頁,去看這個字的說明。

❷ 如何重建SQL索引 要具體的命令

USE TableName
DECLARE @TableName varchar(255)
DECLARE TableCursor CURSOR FOR
SELECT table_name FROM information_schema.tables
WHERE table_type = 'base table'
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
DBCC DBREINDEX(@TableName,' ',90)
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor

❸ mysql 資料庫遷移的時候 如果之前的資料庫使用了主鍵索引,那麼需要重新構建主鍵索引么

不需要。資料庫遷移的時候,MySql會自動重建主鍵索引。

❹ SQL Server 2000資料庫中如何重建索引

連續索引頁由從一個頁到下一個頁的指針鏈接在一起。當對數據的更改影響到索引時,索引中的信息可能會在資料庫中分散開來。重建索引可以重新組織索引數據(對於聚集索引還包括表數據)的存儲,清除碎片。這可通過減少獲得請求數據所需的頁讀取數來提高磁碟性能。 在Microsoft�0�3 SQL Server�6�4 2000 中,如果要用一個步驟重新創建索引,而不想刪除舊索引並重新創建同一索引,則使用 CREATE INDEX 語句的 DROP_EXISTING 子句可以提高效率。這一優點既適用於聚集索引也適用於非聚集索引。 以刪除舊索引然後重新創建同一索引的方式重建聚集索引,是一種昂貴的方法,因為所有二級索引都使用聚集鍵指向數據行。如果只是刪除聚集索引然後重新創建,則會使所有非聚集索引都被刪除和重新創建兩次。一旦刪除聚集索引並再次重建該索引,就會發生這種情形。通過在一個步驟中重新創建索引,可以避免這一昂貴的做法。在一個步驟中重新創建索引時,會告訴 SQL Server 要重新組織現有索引,避免了刪除和重新創建非聚集索引這些不必要的工作。該方法的另一個重要優點是可以使用現有索引中的數據排序次序,從而避免了對數據重新排序。這對於聚集索引和非聚集索引都十分有用,可以顯著減少重建索引的成本。另外,通過使用 DBCC DBREINDEX 語句,SQL Server 還允許對一個表重建(在一個步驟中)一個或多個索引,而不必單獨重建每個索引。 DBCC DBREINDEX 也可用於重建執行 PRIMARY KEY 或 UNIQUE 約束的索引,而不必刪除並創建這些約束(因為對於為執行 PRIMARY KEY 或 UNIQUE 約束而創建的索引,必須先刪除該約束,然後才能刪除該索引)。

❺ oracle 資料庫 索引有必要定時重建嗎

需要,如果索引所在的表經常有插入刪除操作時

❻ sql怎麼建立索引

什麼是索引
拿漢語字典的目錄頁(索引)打比方:正如漢語字典中的漢字按頁存放一樣,SQL Server中的數據記錄也是按頁存放的,每頁容量一般為4K 。為了加快查找的速度,漢語字(詞)典一般都有按拼音、筆畫、偏旁部首等排序的目錄(索引),我們可以選擇按拼音或筆畫查找方式,快速查找到需要的字(詞)。
同理,SQL Server允許用戶在表中創建索引,指定按某列預先排序,從而大大提高查詢速度。
• SQL Server中的數據也是按頁( 4KB )存放
• 索引:是SQL Server編排數據的內部方法。它為SQL Server提供一種方法來編排查詢數據。
• 索引頁:資料庫中存儲索引的數據頁;索引頁類似於漢語字(詞)典中按拼音或筆畫排序的目錄頁。
• 索引的作用:通過使用索引,可以大大提高資料庫的檢索速度,改善資料庫性能。

索引類型
• 唯一索引:唯一索引不允許兩行具有相同的索引值
• 主鍵索引:為表定義一個主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的,並且不能為空
• 聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個表只能有一個
• 非聚集索引(Non-clustered):非聚集索引指定表的邏輯順序。數據存儲在一個位置,索引存儲在另一個位置,索引中包含指向數據存儲位置的指針。可以有多個,小於249個

索引類型:再次用漢語字典打比方,希望大家能夠明白聚集索引和非聚集索引這兩個概念。

唯一索引:
唯一索引不允許兩行具有相同的索引值。
如果現有數據中存在重復的鍵值,則大多數資料庫都不允許將新創建的唯一索引與表一起保存。當新數據將使表中的鍵值重復時,資料庫也拒絕接受此數據。例如,如果在stuInfo表中的學員員身份證號(stuID) 列上創建了唯一索引,則所有學員的身份證號不能重復。
提示:創建了唯一約束,將自動創建唯一索引。盡管唯一索引有助於找到信息,但為了獲得最佳性能,建議使用主鍵約束或唯一約束。

主鍵索引:
在資料庫關系圖中為表定義一個主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的。當在查詢中使用主鍵索引時,它還允許快速訪問數據。

聚集索引(clustered index)
在聚集索引中,表中各行的物理順序與鍵值的邏輯(索引)順序相同。表只能包含一個聚集索引。例如:漢語字(詞)典默認按拼音排序編排字典中的每頁頁碼。拼音字母a,b,c,d……x,y,z就是索引的邏輯順序,而頁碼1,2,3……就是物理順序。默認按拼音排序的字典,其索引順序和邏輯順序是一致的。即拼音順序較後的字(詞)對應的頁碼也較大。如拼音「ha」對應的字(詞)頁碼就比拼音「ba」 對應的字(詞)頁碼靠後。

非聚集索引(Non-clustered)
如果不是聚集索引,表中各行的物理順序與鍵值的邏輯順序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的數據訪問速度。例如,按筆畫排序的索引就是非聚集索引,「1」畫的字(詞)對應的頁碼可能比「3」畫的字(詞)對應的頁碼大(靠後)。
提示:SQL Server中,一個表只能創建1個聚集索引,多個非聚集索引。設置某列為主鍵,該列就默認為聚集索引

如何創建索引
使用T-SQL語句創建索引的語法:
CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]
INDEX index_name
ON table_name (column_name…)
[WITH FILLFACTOR=x]
q UNIQUE表示唯一索引,可選
q CLUSTERED、NONCLUSTERED表示聚集索引還是非聚集索引,可選
q FILLFACTOR表示填充因子,指定一個0到100之間的值,該值指示索引頁填滿的空間所佔的百分比

在stuMarks表的writtenExam列創建索引:
USE stuDB
GO
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'IX_writtenExam')
DROP INDEX stuMarks.IX_writtenExam
/*--筆試列創建非聚集索引:填充因子為30%--*/
CREATE NONCLUSTERED INDEX IX_writtenExam
ON stuMarks(writtenExam)
WITH FILLFACTOR= 30
GO
/*-----指定按索引 IX_writtenExam 查詢----*/
SELECT * FROM stuMarks (INDEX=IX_writtenExam)
WHERE writtenExam BETWEEN 60 AND 90
雖然我們可以指定SQL Server按哪個索引進行數據查詢,但一般不需要我們人工指定。SQL Server將會根據我們創建的索引,自動優化查詢。

索引的優缺點
• 優點
– 加快訪問速度
– 加強行的唯一性
• 缺點
– 帶索引的表在資料庫中需要更多的存儲空間
– 操縱數據的命令需要更長的處理時間,因為它們需要對索引進行更新

創建索引的指導原則
• 請按照下列標准選擇建立索引的列。
– 該列用於頻繁搜索
– 該列用於對數據進行排序
• 請不要使用下面的列創建索引:
– 列中僅包含幾個不同的值。
– 表中僅包含幾行。為小型表創建索引可能不太劃算,因為SQL Server在索引中搜索數據所花的時間比在表中逐行搜索所花的時間更長

❼ oracle 索引什麼時候重建和重建方法討論

Normal 0 7.8 pt 0 2 false false false MicrosoftInternetExplorer4
oracle 索引什麼時候重建和重建方法討論
分類:資料庫技術 字型大小: 大大中中小小 索引什麼時候需要重建和重建的方法
一提到索引,大家都知道,但是怎樣建索引,什麼時候重建索引,重建索引用什麼方法,可能有的就不太清楚了,我根據一些資料簡單的整理一點,如果哪裡不對或是不妥請大家指點,希望大家有更好經驗也share出來。
索引的目的是為了加快尋找數據的速度,但是如果對表經常做改動,則索引也會相應改動,時間長了,查詢速度的效率就會降低,就有可能要重建索引,那麼什麼時候需要重建索引和用什麼方法重建索引可能是大家關心的。
一. 索引在內部進行自身的管理以確保對數據行的快速訪問。但是數據表中大量的活動會導致oracle索引動態地對自身的進行重新配置,這些配置包括三個方面:
1.索引分割
當新數據行產生的索引節點要建立在現有級別上時,出現此動作。
2.索引生成
在某些位置,索引達到此級索引的最大容量的時候,就會生成更深一級的索引結構。
3.索引節點的刪除
你可能了解到,刪除表中的數據行後,索引中相應的節點不會從物理意義上刪除,也沒有從索引中刪除此項目。而是從邏輯上刪除此索引項目,並在索引樹中留下了一個「死「節點,當索引刪除了葉節點或是生成了過深的的級別層次後,就需要進行重建。
二 索引的種類:
a.B-tree(B樹)索引
b.壓縮B樹索引
c.Bitmap(點陣圖)索引
d.函數索引
e.Reverse Key Index(反向鍵索引)
f.Index Organized Table(索引組織表)
三 下面分別對各種索引進行說明
在進行介紹前先說明幾個術語:
高基數:簡單理解就是表中列的不同值多
低基數:建單理解就是表中的列的不同值少
以刪除的葉節點數量:指得是數據行的delete操作從邏輯上刪除的索引節點的數量,要記住oracle在刪除數據行後,將「死「節點保留在索引中,這樣做可以加快sql刪除操作的速度,因此oracle刪除數據行後可以不必重新平衡索引。
索引高度:索引高度是指由於數據行的插入操作而產生的索引層數,當表中添加大量數據時,oracle將生成索引的新層次以適應加入的數據行,因此, oracle索引可能有4層,但是這只會出現在索引數中產生大量插入操作的區域。Oracle索引的三層結構可以支持數百萬的項目,而具備4層或是更多層的需要重建。
每次索引訪問的讀取數:是指利用索引讀取一數據行時所需要的邏輯I/O操作數,邏輯讀取不必是物理讀取,因為索引的許多內容已經保存在數據緩沖區,然而,任何數據大於10的索引都需要重建。
1. B-tree(B樹)索引
是現代關系型資料庫中最常用的索引。除了存儲索引數據外,還存儲一個行ID,用來指出該行其餘數據存儲在這個被索引表中的什麼地方。該索引以一種數結構格式存儲這些值。
Oracle建議如果表經過排序,當返回40%一下的數據時使用索引,如果高於40%則使用全表掃描,如果沒有經過排序,則當返回7%以下時,使用索引。看錶是否排序,可以看dba_indexes字典中的CLUSTERING_FACTOR列,如果與表佔用的數據塊數相近,則經過了排序,如果與行數相近,則沒有排序。那麼什麼時候重建呢?我們可以利用analyze index …….. compute statistics 對表進行分析。然後察看dba_indexes中的blevel。這列是說明索引從根塊到葉快的級別,或是深度。如果級別大於等於4。則需要重建,如下:
Select index_name,blevel from dba_indexeswhere blevel>=4.
另一個從重建中受益的指標顯然是當該索引中的被刪除項占總的項數的百分比。如果在20%以上時,也應當重建,如下
SQL>anlyze index ------ validatestructure
SQL>select(del_lf_rows_len/lf_rows_len)*100 from index_stats where 刪除並從頭開始建立索引。
b. 使用alter index -------- rebuild 命令重建索引
c. 使用alter index -------- coalesce命令重建索引。
下面討論一下這三種方法的優缺點:
1).刪除並從頭開始建索引:方法是最慢的,最耗時的。一般不建議。
2).Alter index ---- rebuild 快速重建索引的一種有效的辦法,因為使用現有索引項來重建新索引,如果客戶操作時有其他用戶在對這個表操作,盡量使用帶online參數來最大限度的減少索引重建時將會出現的任何加鎖問題,alter index ------- rebuild online.但是,由於新舊索引在建立時同時存在,因此,使用這種技巧則需要有額外的磁碟空間可臨時使用,當索引建完後把老索引刪除,如果沒有成功,也不會影響原來的索引。利用這種辦法可以用來將一個索引以到新的表空間。
Alter index ------ rebuild tablespace -----。
這個命令的執行步驟如下:
首先,逐一讀取現有索引,以獲取索引的關鍵字。
其次,按新的結構填寫臨時數據段。
最後,一旦操作成功,刪除原有索引樹,降臨時數據段重命名為新的索引。
需要注意的是alterindex ---rebuild 命令中必須使用tablespace字句,以保證重建工作是在現有索引相同的表空間進行。
3).alter index ----- coalesce 使用帶有coalesce參數時重建期間不需要額外空間,它只是在重建索引時將處於同一個索引分支內的葉塊拼合起來,這最大限度的減少了與查詢過程中相關的潛在的加鎖問題,但是,coalesce選項不能用來講一個索引轉移到其他表空間。
2.壓縮B樹索引
當B樹索引基於大表時,尤其是當基於數據倉庫或決策支持系統中的大表時,這些索引會耗費大量的存儲空間,壓縮(compressed)B樹索引用來最大限度的減少某些類型的B樹索引使用的空間。當一個B樹索引得到壓縮時,被索引的獵的重復出現就被消除掉,進而減少了存儲索引的總的存儲空間。例如:
壓縮前:smith每次出現還要存儲它的相關的rowid.
姓 關聯rowid
smith AAABSOAAEAAAABTAAB
smith AAABSOAAEAAAABTAAC
smith AAABSOAAEAAAABTAAD
壓縮後:smith項和rowid指存儲一次。
smith AAABSOAAEAAAABTAAB,AAABSOAAEAAAABTAAB, AAABSOAAEAAAABTAAB
創建方法:
SQL>create index index_name ontable_name(column_name)
tablespace tablespace_name
compress;
另一種方法:
SQL>alter index index_name rebuildcompress;
3. itmap(點陣圖)索引。
B樹索引在數據具有高基數的列工作的最好,對於低基數的列,點陣圖索引可能是更有效的選擇。點陣圖索引創建錶行的一個二進制映像,並把映像存儲在索引塊中,這種類型的索引的DML操作少,長度大並且含有極少不同的值得列特別有用。點陣圖索引不應當用在頻繁發生insert,update,delete操作的表上,這些dml操作在性能方面的代價很高,因為,他們會引起點陣圖級的加鎖發生,而且要求動態的重建所有可能值的點陣圖。為圖索引最適合數據倉庫和決策支持系統。
4.基於函數的索引
當把一個函數運用於被索引的列上時,該列德索引都變得無效,基於函數的索引就是為了解決這個問題。
5.反向鍵索引
是一種特殊類型的B樹索引,在索引基於含有序數的列時使非常有用的,如果一個傳統的B樹索引基於一個含有這種數據的列,往往會產生許多級,由於B樹索引有 4級以上的深度會降低性能,因此反向鍵索引更適合這種類型,反向鍵索引通過簡單的煩象被索引的列中的數據來解決問題,他首先反向每個列鍵值的位元組,然後在反向後的新數據上進行索引,而新數據在值的范圍上的分布通常比原來的有序數更均勻。
6.索引組織表
由於B樹、點陣圖、反向鍵索引的使用而引起的性能將會導致這樣的事實,這些索引中的項目直接指向索引基表中對應數據的行ID,這是從錶行沒有按任何特定的順序來物理地存儲表中檢索錶行的一種有效方法,這種表叫做堆表,oracle大多數表中以一種堆疊方式存儲行數據,因為行以一種或多或少的隨機方式被分配給表內的塊,之所以出現這種隨機性,是因為oracle在決定把一個行存儲在何處時並不考慮改行的內容,oracle只是把該行存儲在它從該表的freelist 上所發現的第一個塊中。
如果希望按一種指定順序來存儲一個表的數據,就不能使用堆表,為此oracle提供了索引組織表,索引組織表不是存儲一個指向行數據的其餘部分存儲在了何處的行的ID指針,而是把行數據全部存儲在索引本身內,這產生了兩個性能好處:
n 錶行按索引順序來存儲。
n 使用B樹索引時引起的先讀取索引後讀取表鎖使用的額外I/O操作得到消除。
例如:
sql>create table emp
(last_name varchar2(9) primary key,
first_name varchar2(9),
hire_date date)
organization index tablespace users
pctthreshold 25
including first name
overflow tablespace qyl
mapping table;
所有索引組織表在將要作為索引基礎的那一列上都必須有一個主鍵約束,索引組織表不能含有唯一性約束或是被聚簇。
下面說明各個參數的含義:
organization index:說明該表是索引組織表
pctthreshold :指定整個數據塊的什麼百分比要保持打開,以便存儲一個與主鍵值相關聯的行數據,其中主鍵值必須在0到50之間(50是默認值)
including : 指定在行長度超過pctthershold中所設置的大小時按那一列 把行分解成兩段
overflow tablespace :指定在行長度超過pctthreshold中設置的大小時行數的的另一部分存儲到的表空間。
Mapping table:致使在創建索引組織表的點陣圖索引時所必需的一個關聯映像表的創建。
以上是我根據一些資料對索引的一個簡單闡述,大家可能有不同的見解,希望對大家有幫助,那些不妥的地方還希望大家提出來。
參考資料:ocp困惑racle9i性能調整
oracle statspack 高性能調整技術
[@more@]
analyze index t_id_ind validate structure
select (del_lf_rows_len/lf_rows_len)*100 from index_stats
>20%
b. 使用alter index t_id_ind rebuild 命令重建索引
c. 使用alter index t_id_ind coalesce命令重建索引。
alter indext_id_ind rebuild online.
但是,由於新舊索引在建立時同時存在,因此,使用這種技巧則需要有額外的磁碟空間可臨時使用,當索引建完後把老索引刪除,如果沒有成功,也不會影響原來的索引。利用這種辦法可以用來將一個索引以到新的表空間。
Alter index ------ rebuild tablespace -----。
這個命令的執行步驟如下:
首先,逐一讀取現有索引,以獲取索引的關鍵字。
其次,按新的結構填寫臨時數據段。
最後,一旦操作成功,刪除原有索引樹,降臨時數據段重命名為新的索引。
需要注意的是alter index ---rebuild 命令中必須使用tablespace字句,以保證重建工作是在現有索引相同的表空間進行
alter index ----- coalesce 使用帶有coalesce參數時重建期間不需要額外空間,它只是在重建索引時將處於同一個索引分支內的葉塊拼合起來,這最大限度的減少了與查詢過程中相關的潛在的加鎖問題,但是,coalesce選項不能用來講一個索引轉移到其他表空間

❽ 資料庫中一張表裡面的索引數據大小超過了表本身的數據大小,這種情況是否正常,是否要對索引進行重建

我認為是很有可能產生這樣情況的。當你的表創建的過多的索引時,索引數據大小會大於表數據大小。例如,表裡有10個欄位,為每一個欄位都創建一個索引。肯定會產生索引數據會大於表數據

❾ sql server 刪除記錄 會自動重建索引么

sql server的索引是自動建立、自動更新的。所以是會自動重建索引的