sql表重建索引
『壹』 sql重新生成索引的時候可以強制結束嗎
可以退出的,索引和數據不是一個概念,不會影響數據的。
2023款上汽大眾ID.6 X 品質七座純電SUV
坐擁升級配置,便捷家庭出行。全新六座版大空間,綜合補貼後售價253,288元起!
上海上汽大眾汽車銷售廣告
上汽大眾途觀L2023款,煥新上市
外觀設計動感升級,數字座艙處處精緻,更搭載智能輔助駕駛科技配置,智能全面升級!
上海上汽大眾汽車銷售有限公司廣告
更多專家
sql資料庫重建索引能夠中途退出嗎
專家1對1在線解答問題
5分鍾內響應 | 萬名專業答主
馬上提問
最美的花火 咨詢一個電子數碼問題,並發表了好評
lanqiuwangzi 咨詢一個電子數碼問題,並發表了好評
garlic 咨詢一個電子數碼問題,並發表了好評
188****8493 咨詢一個電子數碼問題,並發表了好評
籃球大圖 咨詢一個電子數碼問題,並發表了好評
動物樂園 咨詢一個電子數碼問題,並發表了好評
AKA 咨詢一個電子數碼問題,並發表了好評
大家還在搜
禮炮機
齊家網裝修怎麼樣
垃圾處理器
面部提升最好的方法
考研網校排名
手機賺錢軟體日入百元
現在學什麼手藝好
吸糞車
— 為你推薦更多精彩內容 —
『貳』 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 約慧談束而創建的索引,必須先刪除該約束,然後才能刪除該索引)。
『叄』 如何重建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
『肆』 在PL-SQL中如何給oracle資料庫重建索引
重建索引有多種方式,如drop and re-create、rebuild、rebuild online等。下面簡單比較空襲這幾種方式異同以及優缺點:
首先建立測試表及數據:
SQL> CREATE TABLE TEST AS SELECT CITYCODE C1 FROM CITIZENINFO2;
Table created
SQL> ALTER TABLE TEST MODIFY C1 NOT NULL;
Table altered
SQL> SELECT COUNT(1) FROM TEST;
COUNT(1)
----------
16000000
一、drop and re-create和rebuild
首先看看正常建立索引時,對表的加鎖情況。
suk@ORACLE9I> @show_sid
SID
----------
14
suk@ORACLE9I> CREATE INDEX IDX_TEST_C1 ON TEST(C1);
索引已創建。
SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=14;
OBJECT_NAME LMODE
------------------------------ ----------
OBJ$ 3
TEST 4
可見,普通情況下建立索引時,oracle會對基表加share鎖,由於share鎖和 row-X是不兼容的,也就是說,在建立索引期間,無法對基表進行DML操作。
對於刪除重建索引的方法就不介紹了,它與上面的描述是一樣的,下面我們看看用rebuild的方式建立索引有什麼特別。
suk@ORACLE9I> ALTER INDEX IDX_TEST_C1 REBUILD;
索引已更改。
另開一個會話,查詢此時test的加鎖情況:
SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=14;
OBJECT_NAME LMODE
------------------------------ ----------
TEST 4
可見,rebuild的方式對基表的加鎖方式與CREATE時是一樣的。
另開一個會話,在索引正在rebuild時,執行如下SQL:
suk@ORACLE9I> SET AUTOTRACE TRACE
suk@ORACLE9I> SELECT /*+ INDEX(TEST) */ COUNT(1) FROM TEST WHERE ROWNUM<10;
執行計劃
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=26 Card=1)
1 0 SORT (AGGREGATE)
2 1 COUNT (STOPKEY)
3 2 INDEX (FULL SCAN) OF 'IDX_TEST_C1' (NON-UNIQUE) (Cost=
26 Card=1986621)
可以看到索引在重建時,查詢仍然可以使用舊索引。實際上,oracle在rebuild時,在創建新索引過程中,並不會刪除舊索引,直到新索引rebuild成功。
從這點可以知道rebuild比刪除重建的一個好處是不肆和會影響原有的SQL查詢,但也正由於此,用rebuild方式建立索引需要相應表空間的空閑空間是刪除重建方式的2倍。
重建索引有多種方式,如drop and re-create、rebuild、rebuild online等。下面簡單比較這幾種方式異同以及裂虧盯優缺點:
相關文章:
oracle重建索引(一)
二、rebuild 和rebuild online
首先我們跟蹤一下rebuild online的過程。
另開一個會話查看鎖的信息:
SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=14;
OBJECT_NAME LMODE
------------------------------ ----------
SYS_JOURNAL_10499 4
TEST 2
SQL> INSERT INTO TEST VALUES(11);
1 row inserted
SQL> COMMIT;
Commit complete
可以看到,在rebuild online期間,oracle對基表加的是RS所,此時我們可以對基表進行DML操作。但奇怪的話在相同的session中有一個SYS_JOURNAL_10499表被加SHARE鎖,這個表是干什麼用的呢?
我們看看trace文件,有這樣的信息:
create table "SUK"."SYS_JOURNAL_10499" (C0 NUMBER(6,0), opcode char(1),
partno number, rid rowid, primary key( C0 , rid )) organization index
TABLESPACE "TEST"
CREATE UNIQUE INDEX "SUK"."SYS_IOT_TOP_10605" on
"SUK"."SYS_JOURNAL_10499"("C0","RID") INDEX ONLY TOPLEVEL TABLESPACE "TEST"
NOPARALLEL
drop table "SUK"."SYS_JOURNAL_10499"
我們在查查10499是什麼東西:
SQL> SELECT OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS WHERE OBJECT_ID=10499;
OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------
IDX_TEST_C1 INDEX
從這些信息可以推測:表SYS_JOURNAL_10499就是實現在重建索引時不阻塞DML操作而設計的,它存儲的是在索引重建期間發生在基表的數據變化。可以推測,CREATE INDEX .... ONLINE應該也有一張類似的表。
實際上,oracle之所以在創建索引時鎖表阻止DML操作就是為了防止不能索引新變化的數據,在online方式重建時,有了臨時表SYS_JOURNAL_XXXX,oracle就可以放心大膽地讓用戶操作了,因為所有重建索引期間的數據變化信息都會保留在SYS_JOURNAL_XXX表中,當索引重建完後再加上SYS_JOURNAL_XXX記錄的數據,就不會漏索引數據了。(XXX是被重建的索引對應的OBJECT_ID)
導讀:
重建索引有多種方式,如drop and re-create、rebuild、rebuild online等。下面簡單比較這幾種方式異同以及優缺點:
相關文章:
oracle重建索引(一)
oracle重建索引(二)
三、rebuild和rebuild online的數據源
網上一直有這樣一個說法:重建索引是以原索引作為數據源的。那麼,這種說法是否准確呢?我們做實驗來驗證一下:
suk@ORACLE9I> COL SEGMENT_NAME FORMAT A30
--首先看看錶和索引的大小
suk@ORACLE9I> SELECT SEGMENT_NAME,BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('TEST','IDX_TEST_C1');
SEGMENT_NAME BYTES
------------------------------ ----------
TEST 201326592
IDX_TEST_C1 293601280
suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD;
已解釋。
suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | ALTER INDEX STATEMENT | | | | |
| 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
| 2 | SORT CREATE INDEX | | | | |
| 3 | TABLE ACCESS FULL | TEST | | | |
-----------------------------------------------------------------------
Note: rule based optimization
已選擇11行。
--從執行計劃可以看出,當索引比表大時,rebuild索引用的數據源是基表。
suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD ONLINE;
已解釋。
suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | ALTER INDEX STATEMENT | | | | |
| 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
| 2 | SORT CREATE INDEX | | | | |
| 3 | TABLE ACCESS FULL | TEST | | | |
-----------------------------------------------------------------------
Note: rule based optimization
已選擇11行。
--從執行計劃可以看出,當索引比表大時,rebuild online索引用的數據源是基表。
--我們為TEST添加一列,使得表比索引大
suk@ORACLE9I> ALTER TABLE TEST ADD(C2 CHAR(30) DEFAULT '1');
表已更改。
suk@ORACLE9I> SELECT SEGMENT_NAME,BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('TEST','IDX_TEST_C
1');
SEGMENT_NAME BYTES
------------------------------ ----------
TEST 1476395008
IDX_TEST_C1 293601280
suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD;
已解釋。
suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | ALTER INDEX STATEMENT | | | | |
| 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
| 2 | SORT CREATE INDEX | | | | |
| 3 | INDEX FAST FULL SCAN| IDX_TEST_C1 | | | |
-----------------------------------------------------------------------
Note: rule based optimization
已選擇11行。
--從執行計劃可以看出,當表比索引大時,執行計劃已經改變,rebuild索引是以索引作為數據源的。
suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD ONLINE;
已解釋。
suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | ALTER INDEX STATEMENT | | | | |
| 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
| 2 | SORT CREATE INDEX | | | | |
| 3 | TABLE ACCESS FULL | TEST | | | |
-----------------------------------------------------------------------
Note: rule based optimization
已選擇11行。
--從執行計劃可以看出,當表比索引大時,rebuild online仍然以基表作為數據源。
rebuild模式下,因為表數據不會產生變化,oracle主要考慮性能問題,把更快掃描完成的段作為數據源。在上面的例子中,我們並沒有對表進行分析,故oracle應該根據數據段的大小來決定那個作為數據源的。一般索引欄位比較多,或者對索引欄位的DML操作較多,可能會導致索引比表大,這時oracle就會使用基表作為新索引的數據源進行rebuild了。
而在rebuild online模式下,因為允許DML操作,而表數據變化的同時索引也會跟著變化,為了索引與基表數據的一致性,比如採用基表數據作為數據源,而不能用原索引數據作為數據源。
我們用反證法證明不能用原索引作為新索引的數據源。
例如:
T1發出rebuild online命令
T2刪除某條數據,刪數據的同時,oracle會自動維護了舊索引
T3掃描經過T2數據所在索引節點
T4插入一條記錄,新記錄對應的索引節點剛好重用了T2刪除的數據對應的索引節點空間
如果是這樣的話,新建的索引將不包含T4插入的記錄的信息。所以,rebuild online情況下新索引的數據源不能是原索引。
rebuild online情況下,如果非用原索引作為新索引的數據源的話,用中間表記錄索引變化的方法應該是可以實現的,但由於數據變化會同時引起索引變化的特定決定了這種方法將異常復雜及效率底下,所以oracle不考慮舊索引作為新索引的數據源是有道理的。
結論:
1、rebuild會阻塞對基表的DML操作,但不會影響rebuild期間查詢對原有索引的使用。
2、rebuild的數據源可能是基表,也可能是原索引。取決於基表和原索引的大小,那個小,rebuild時就會用那個作為數據源。這也說明了網上盛傳的rebuild以原索引作為資料庫的說法是不完全正確的。
3、rebuild online運行用戶在索引重建期間執行DML操作。
4、rebuild online的數據源是基表
『伍』 sqlserver2000 必須要重建索引嗎
這個東西沒有必須,誰也無法規定你一定要怎樣,搞清楚做這件事是為了什麼,你才知道有沒有必要做。
重建索引的目的是為了讓索引更高效的工作,如果一個索引長時間的沒有整理,那麼整個索引上的數據就會雜亂無章的排列,無法起到提高效率的作用,這樣的索引並沒有什麼卵用。所以對於頻繁寫入數據的表,適時重建索引是需要的。對於不頻繁的表,可以延長索引重建的時間,如果一個表完全只用於查詢而從來不寫入,那可以永遠不需要重建索引。重建索引主要解決索引碎片問題,索引碎片會導致更多的磁碟IO,而磁碟IO恰恰是最消耗時間的操作。
以聚集索引為例,原理在於:
當一個表新增數據時,數據是依次寫入數據頁,索引同理;
而數據寫入並不一定會按順序,例如公司新增員工,你並不能確定每次新增員工他們的姓氏一定就是按照A-Z的順序來的;
那麼時間一長,以字母A為首字母的用戶信息將會遍布整個索引,從頭到尾;
這對於數據檢索沒有什麼好處,假如索引存儲用了1000頁,那麼你需要讀取1000頁的數據來檢索信息;
這時就需要通過索引重建,來把數據按照規則重新排列,以期望在檢索字母A開頭的員工時,可以讓資料庫知道,這些數據都是聚集在前200頁的;
從而讓資料庫減少讀取,提高讀取速度。
更多的細節上的東西,你需要學習2個知識點就可以知道了,
資料庫中的數據是怎麼存儲的,索引又是怎麼存儲的,是什麼結構
索引碎片對性能的影響
『陸』 關於SQL索引(Index)
SQL索引是提高資料庫查詢效率的關鍵結構。以下是關於SQL索引的詳細解答:
索引的作用:
- 加速查詢:索引類似於圖書館的索引,幫助快速定位數據,減少查詢時間。
- 優化性能:在大量數據的查詢操作中,索引可以顯著提升資料庫的整體性能。
索引的類型:
- 聚集索引:
- 數據行按索引鍵的順序存儲。
- 每個表只能有一個聚集索引。
- 示例創建語句:create clustered index [id_idx] on [dbo].[actor_registration]。
- 非聚集索引:
- 索引結構獨立於數據行,包含一個指向數據行的指針。
- 一個表可以有多個非聚集索引。
- 示例創建語句:create nonclustered index [last_name_idx] on [dbo].[actor_registration]。
- 聚集索引:
索引的選擇:
- 獨特且經常用於查詢的列:如ID、Name和account number等,適合創建索引。
- 變化較小的欄位:如性別、國家和年份等,索引效果可能不明顯,不建議創建索引。
索引的維護:
- 更新與重建:隨著數據量的增長和需求變化,可能需要適時更新和維護索引。
- 性能診斷:如果查詢效率下降,可以藉助Execution Plan來診斷問題,找出性能瓶頸並進行優化。
綜上所述,SQL索引是提高資料庫查詢效率的重要手段,通過合理選擇和維護索引,可以顯著提升資料庫的整體性能。