Tại sao Insert lại nhanh hơn Delete?
- Trong khi chúng ta thực hiện một lệnh xóa (delete) bất kỳ hàng thì Oracle tiến hành tìm kiếm giá trị đó từ tablespace, index,... Nhưng nếu trong khi ta thực hiện chèn (insert) bất kỳ hàng dữ liệu nào vào thì Oracle chỉ việc mang nó vào đúng table được chỉ định.
- Cả chèn và xóa được sử dụng cho nhiều mục đích khác nhau và chèn không phải lúc nào cũng nhanh hơn xóa. Nếu table đó đã được đánh index thì chèn sẽ chậm và xóa sẽ thực hiện nhanh chóng (nếu mệnh đề WHERE được cột có index). Nếu table đó không có bất kỳ index nào thì insert sẽ nhanh và delete sẽ chậm.
- Chèn nhanh hơn xóa bởi vì chèn chỉ cần thêm dòng dữ liệu vào bảng nhưng xóa vẫn còn giữ lại logs trong bộ nhớ(memory).
SQL> EXPLAIN PLAN FOR
INSERT INTO DUP_TEST (ID, NAME) VALUES (106, 'Plan');
SQL> SELECT PLAN_TABLE_OUTPUT
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'));
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 11 | 1 (0)| 00:00:01 |
| 1 | LOAD TABLE CONVENTIONAL | DUP_TEST | | | | |
-------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - INS$1
INSERT INTO DUP_TEST (ID, NAME) VALUES (106, 'Plan');
SQL> SELECT PLAN_TABLE_OUTPUT
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'));
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 11 | 1 (0)| 00:00:01 |
| 1 | LOAD TABLE CONVENTIONAL | DUP_TEST | | | | |
-------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - INS$1
SQL> EXPLAIN PLAN FOR
DELETE DUP_TEST WHERE ID = 102;
SQL> SELECT PLAN_TABLE_OUTPUT
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'));
PLAN_TABLE_OUTPUT
Plan hash value: 2603986714
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 4 | 3 (0)| 00:00:01 |
| 1 | DELETE | DUP_TEST | | | | |
|* 2 | TABLE ACCESS FULL| DUP_TEST | 1 | 4 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - DEL$1
2 - DEL$1 / DUP_TEST@DEL$1
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
FULL(@"DEL$1" "DUP_TEST"@"DEL$1")
OUTLINE_LEAF(@"DEL$1")
ALL_ROWS
OPT_PARAM('star_transformation_enabled' 'true')
DB_VERSION('12.1.0.2')
OPTIMIZER_FEATURES_ENABLE('12.1.0.2')
IGNORE_OPTIM_EMBEDDED_HINTS
END_OUTLINE_DATA
*/
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("ID"=102)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
2 - (cmp=2) "DUP_TEST".ROWID[ROWID,10], "ID"[NUMBER,22]
Chú ý các chỉ số và dựa vào đó ta có thể có cái nhìn tổng quan về chi phí thực thi của Insert & Delete:DELETE DUP_TEST WHERE ID = 102;
SQL> SELECT PLAN_TABLE_OUTPUT
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'));
PLAN_TABLE_OUTPUT
Plan hash value: 2603986714
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 4 | 3 (0)| 00:00:01 |
| 1 | DELETE | DUP_TEST | | | | |
|* 2 | TABLE ACCESS FULL| DUP_TEST | 1 | 4 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - DEL$1
2 - DEL$1 / DUP_TEST@DEL$1
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
FULL(@"DEL$1" "DUP_TEST"@"DEL$1")
OUTLINE_LEAF(@"DEL$1")
ALL_ROWS
OPT_PARAM('star_transformation_enabled' 'true')
DB_VERSION('12.1.0.2')
OPTIMIZER_FEATURES_ENABLE('12.1.0.2')
IGNORE_OPTIM_EMBEDDED_HINTS
END_OUTLINE_DATA
*/
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("ID"=102)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
2 - (cmp=2) "DUP_TEST".ROWID[ROWID,10], "ID"[NUMBER,22]
-
OPERATION: Tên của hoạt động được thực hiện bên trong bước này. Đối với hàng đầu tiên của cột này sẽ có các giá trị như sau tùy câu lệnh SQL là gì:DELETE STATEMENTINSERT STATEMENTSELECT STATEMENTUPDATE STATEMENT
- NAME: Tên của đối tượng được sử dụng trong Execution Plan này. Trong trường hợp này là table DUP_TEST- BYTES: Số byte ước tính mà trình tối ưu hóa truy vấn thực thi.- COST CPU: Chi phí CPU ước tính mà trình tối ưu hóa truy vấn thực thi.- TIME: Thời gian ước tính mà trình tối ưu hóa truy vấn thực thi, theo định dạng HH:MM:SS.
Hãy tham gia và để lại nhận xét của bạn vào bên dưới. Càng nhiều người tham gia, chúng ta càng được hưởng lợi nhiều =)). Vì vậy, để lại những suy nghĩ của bạn trước khi rời khỏi trang nhé.
(ORA-00019) - Tại sao INSERT nhanh hơn DELETE?
Reviewed by Uit Lân
on
12/16/2018 06:46:00 SA
Rating:
Reviewed by Uit Lân
on
12/16/2018 06:46:00 SA
Rating:




Không có nhận xét nào: