RAC 環境下,4 個應用並發執行 DELETE 語句極慢,AWR 報告顯示大量 enq: TX - row lock contention 等待事件,v$locked_object 顯示大量行鎖持有。
-- 1. 建表與位圖索引
CREATE TABLE test (id NUMBER, col VARCHAR2(20));
CREATE BITMAP INDEX idx_t_col ON test(col);
-- 2. 插入測試數據
INSERT INTO test VALUES (1, 'A');
INSERT INTO test VALUES (2, 'A');
INSERT INTO test VALUES (3, 'A');
INSERT INTO test VALUES (4, 'B');
COMMIT;
-- 3. Session 1:更新 col='A' 的第一行
UPDATE test SET col='A' WHERE id=1; -- 未提交
-- 4. Session 2:更新 col='A' 的第二行(被阻塞)
UPDATE test SET col='A' WHERE id=2; -- HANG,等待 Session 1 提交
-- 5. Session 3:更新 col='B' 的行(正常)
UPDATE test SET col='B' WHERE id=4; -- 立即成功

DROP INDEX idx_t_col; → 並發 DML 秒級完成CREATE INDEX idx_t_col_btree ON test(col);(高基數列適用)| 索引類型 | 適用列特徵 | DML 並發 | 典型場景 |
|---|---|---|---|
| 位圖索引 | 低基數(性別、狀態、類型)、靜態數據倉庫 | 極差(鎖升級) | OLAP、報表、數據集市 |
| B*Tree 索引 | 高基數(ID、手機、郵箱)、頻繁 DML | 優秀(行級鎖) | OLTP、核心業務表 |
-- 查找所有位圖索引
SELECT owner, index_name, table_name, uniqueness, index_type
FROM dba_indexes
WHERE index_type = 'BITMAP';
-- 監控實時鎖等待
SELECT s.sid, s.serial#, s.username, o.object_name, l.locked_mode
FROM v$locked_object l
JOIN dba_objects o ON l.object_id = o.object_id
JOIN v$session s ON l.session_id = s.sid
WHERE l.locked_mode > 2;