sql重新生成索引
『壹』 sql server 重新生成索引可以減小資料庫空間嗎
sql server 重新生成索引可以減小資料庫空間。
理由分析:
一、重新生成索引:
1、命令: ALTER INDEX 索引名 on 表名 REBUILD
2、解析:重新生成索引將刪除該索引並創建一個新索引。此過程中將刪除碎片,通過使用指定的或現有的填充因子設置壓縮頁來回收磁碟空間,並在連續頁中對索引行重新排序(根據需要分配新頁)。這樣可以減少獲取所請求數據所需的頁讀取數,從而提高磁碟性能。
二、重新組織索引:
1、命令:ALTER INDEX 索引名 on 表名 reorganize
2、解析: 重新組織索引是通過對葉頁進行物理重新排序,使其與葉節點的邏輯順序(從左到右)相匹配,從而對表或視圖的聚集索引和非聚集索引的葉級別進行碎片整理。使頁有序可以提高索引掃描的性能。索引在分配給它的現有頁內重新組織,而不會分配新頁。如果索引跨多個文件,將一次重新組織一個文件,不會在文件之間遷移頁。
重新組織還會壓縮索引頁。如果還有可用的磁碟空間,將刪除此壓縮過程中生成的所有空頁。壓縮基於 sys.indexes 目錄視圖中的填充因子值。
重新組織進程使用最少的系統資源。而且,重新組織是自動聯機執行的。該進程不持有長期阻塞鎖,所以不會阻止運行查詢或更新。
索引碎片不太多時,可以重新組織索引。
『貳』 如何重建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的數據源是基表
『肆』 sql重新生成索引的時候可以強制結束嗎
可以退出的,索引和數據不是一個概念,不會影響數據的。
2023款上汽大眾ID.6 X 品質七座純電SUV
坐擁升級配置,便捷家庭出行。全新六座版大空間,綜合補貼後售價253,288元起!
上海上汽大眾汽車銷售廣告
上汽大眾途觀L2023款,煥新上市
外觀設計動感升級,數字座艙處處精緻,更搭載智能輔助駕駛科技配置,智能全面升級!
上海上汽大眾汽車銷售有限公司廣告
更多專家
sql資料庫重建索引能夠中途退出嗎
專家1對1在線解答問題
5分鍾內響應 | 萬名專業答主
馬上提問
最美的花火 咨詢一個電子數碼問題,並發表了好評
lanqiuwangzi 咨詢一個電子數碼問題,並發表了好評
garlic 咨詢一個電子數碼問題,並發表了好評
188****8493 咨詢一個電子數碼問題,並發表了好評
籃球大圖 咨詢一個電子數碼問題,並發表了好評
動物樂園 咨詢一個電子數碼問題,並發表了好評
AKA 咨詢一個電子數碼問題,並發表了好評
大家還在搜
禮炮機
齊家網裝修怎麼樣
垃圾處理器
面部提升最好的方法
考研網校排名
手機賺錢軟體日入百元
現在學什麼手藝好
吸糞車
— 為你推薦更多精彩內容 —
『伍』 SQL表欄位如何建立索引難道就是添加SQL查詢語句
1、創建測試表,
create table test_index(id varchar2(20), v_date date);
『陸』 怎樣sql2008 重新生成索引任務
重新生成索引在對象資源管理器中,連接到SQLServer2005資料庫引擎實例,再展開該實例。展開「資料庫」,展開包括具有指定索引的表的資料庫,再展開「表」。展開該索引所屬的表,再展開「索引」。右鍵單擊要重新生成的索引,再單擊「重新生成」。
若要開始重新生成操作,請單擊「肯定」。為表重新生成所有索引在對象資源管理器中,連接到SQLServer2005資料庫引擎實例,再展開該實例。展開「資料庫」,展開包括具有指定索引的表的資料庫,再展開「表」。轉載,僅供參考。
展開索引所屬的表。右鍵單擊「索引」,再單擊「全部重新生成」。若要開始重新生成操作,請單擊「肯定」。
『柒』 創建索引的sql語句
創建索引的sql語句是【CREATE INDEX indexName ONtable_name(column_name)】。
【CREATE INDEX indexName ON table_name(column_name)】是最基本的創建索引的語法,它沒有任何限制。如果是CHAR,VARCHAR類型,length可以小於欄位實際長度;如果是BLOB和TEXT類型,必須指定length。下一步是修改表結構(添加索引),創建表的時候直接指定。