| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 99ํด๋ฝ
- ์ค๋ธ์
- i-type
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- reducible
- ์์๋ฒํธ
- ์ค๋ ๋
- ๋น์ฃผ๊ธฐ์ ํธ
- IEEE 802
- xv6
- ํ๋ ์ ๊ตฌ์กฐ
- java thread
- ์ฐ๋ถํฌdb
- tcp ์ธ๊ทธ๋จผํธ
- ํ๋ก์ด๋์์
- well known ํฌํธ
- ๋ฉํฐํ๋ ์ฑ
- mariadb
- til
- ์๋น์ค ํ๋ฆฌ๋ฏธํฐ๋ธ
- ๋ฐ์ดํฐ ์ ์ก
- ์ค๋ฅ์ ์ด
- git merge
- ์ฃผ๊ธฐ์ ํธ
- ์ฝ๋ฉํ ์คํธ์ค๋น
- ํ ํฐ ๋ฒ์ค
- ์ค๋ฅ๊ฒ์ถ
- ๊ฐ๋ฐ์์ทจ์
- ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
- ํญํด99
- Today
- Total
Unfazedโ๏ธ๐ฏ
[SQL] DELETE vs TRUNCATE (PostgreSQL, MySQL, SQL Server, Oracle) ๋ณธ๋ฌธ
[SQL] DELETE vs TRUNCATE (PostgreSQL, MySQL, SQL Server, Oracle)
9taetae9 2025. 8. 20. 17:261. DELETE(DML) vs TRUNCATE(DDL)
DELETE: ๋ฐ์ดํฐ ์กฐ์ ์ธ์ด(DML) ๋ช ๋ น์ด
DELETE๋ ๋ฐ์ดํฐ ์กฐ์ ์ธ์ด(DML)์ ์ํ๋ ๋ช ๋ น์ด๋ก, ํ ์ด๋ธ ๋ด๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
DELETE์ ํต์ฌ์ ๊ฐ๋ณ ํ(row) ์์ค์์ ์๋ํ๋ค๋ ์ ์ ๋๋ค. WHERE ์ ์ ์ฌ์ฉํ์ฌ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ๋ง ์ ํ์ ์ผ๋ก ์ญ์ ํ๊ฑฐ๋, WHERE ์ ์์ด ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ์ญ์ ํ ์ ์์ต๋๋ค.
DELETE๊ฐ ํ ๋จ์๋ก ์๋ํ๋ค๋ ๊ฒ์ ๊ฐ ํ์ ์ญ์ ํ ๋๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ค ํธ๋์ญ์ ๋ฐ ์ผ๊ด์ฑ ๋ฉ์ปค๋์ฆ๊ณผ ์ํธ์์ฉํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ด ํฌํจ๋ฉ๋๋ค.
- ์ญ์ ๋๋ ๊ฐ ํ์ ๋ํ ํธ๋์ญ์ ๋ก๊ทธ(๋๋ PostgreSQL์ WAL, Oracle์ Redo ๋ก๊ทธ) ๊ธฐ๋ก
- ๊ด๋ จ ์ธ๋ฑ์ค ์ ๋ฐ์ดํธ
- ON DELETE ํธ๋ฆฌ๊ฑฐ ์คํ
- ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ์ํ ์ธ๋ ํค(Foreign Key) ์ ์ฝ ์กฐ๊ฑด ํ์ธ
์ด์ฒ๋ผ DELETE๋ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ค๊ณ๋ ์ ๋ฐํ๊ณ ์์ ํ ๋ฐ์ดํฐ ์กฐ์ ๋๊ตฌ์ด๋ฉฐ, ๊ทธ ๊ธฐ๋ฅ์ ๊ตฌ์กฐ์ ๋ณ๊ฒฝ์ด ์๋ ๋ฐ์ดํฐ ์์ฒด์ ์กฐ์์ ์ด์ ์ ๋ง์ถฅ๋๋ค.
TRUNCATE: ๋ฐ์ดํฐ ์ ์ ์ธ์ด(DDL) ๋ช ๋ น์ด
TRUNCATE๋ ๋ฐ์ดํฐ ์ ์ ์ธ์ด(DDL)์ ์ํฉ๋๋ค. DDL ๋ช ๋ น์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ฑฐ๋ ์์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
TRUNCATE๋ ํ์ ํ๋์ฉ ์ฒ๋ฆฌํ๋ ๋์ , ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ ๋ฐ์ดํฐ ํ์ด์ง(page)๋ ์ต์คํ ํธ(extent)์ ํ ๋น์ ํด์ ํ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์ผ๋ถ ์์คํ ์์๋ ๋ด๋ถ์ ์ผ๋ก ํ ์ด๋ธ์ ์ญ์ (DROP)ํ๋ค๊ฐ ๋ค์ ์์ฑ(CREATE)ํ๋ ๊ฒ๊ณผ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ๋ ํฉ๋๋ค.
์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ๋จ์ํ ๋ฐ์ดํฐ ์กฐ์์ด ์๋, ํ ์ด๋ธ์ ๋ฌผ๋ฆฌ์ ๊ตฌ์กฐ์ ๋ํ ๋ณ๊ฒฝ์ผ๋ก ๊ฐ์ฃผ๋๋ฏ๋ก DDL๋ก ๋ถ๋ฅ๋ฉ๋๋ค. TRUNCATE๋ ํ ์์ค์ ์ฒ๋ฆฌ๋ฅผ ์ฐํํ๊ธฐ ๋๋ฌธ์ DELETE์ ๋น๊ต ์ ๋ค์๊ณผ ๊ฐ์ ๋์ ์ฐจ์ด๋ฅผ ๋ณด์ ๋๋ค.
- ๋น ๋ฅธ ์ฑ๋ฅ
- ์ต์ํ์ ๋ก๊น
- ON DELETE ํธ๋ฆฌ๊ฑฐ ๋ฏธ์๋
2. ๋ณดํธ์ ์ธ ๋ฉ์ปค๋์ฆ ๋น๊ต
DBMS ์ข ๋ฅ์ ๊ด๊ณ์์ด DELETE์ TRUNCATE๋ ๋ช ๊ฐ์ง ๊ณตํต์ ์ธ ์๋ ๋ฐฉ์๊ณผ ์ฑ๋ฅ์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ฑ๋ฅ๊ณผ ํจ์จ์ฑ: ํ ์ค์บ vs ํ์ด์ง ํ ๋น ํด์
DELETE ์์ ์ ์ญ์ ํ ํ์ ์ฐพ๊ธฐ ์ํด ํ ์ด๋ธ ์ค์บ์ด๋ ์ธ๋ฑ์ค ์ค์บ์ ์ํํ๊ณ , ๊ฐ ํ์ ๊ฐ๋ณ์ ์ผ๋ก ์ ๊ฑฐํฉ๋๋ค. ์ด ๊ณผ์ ์ ์๋นํ ์์ I/O์ CPU ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ๋ฉฐ, ํนํ ์๋ฐฑ๋ง ๊ฐ ์ด์์ ํ์ ๊ฐ์ง ๋์ฉ๋ ํ ์ด๋ธ์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๊ฒฝ์ฐ ๋งค์ฐ ์ค๋ ์๊ฐ์ด ์์๋ ์ ์์ต๋๋ค.
๋ฐ๋ฉด, TRUNCATE๋ ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๋ฐ์ดํฐ ํ์ด์ง์ ํ ๋น์ ํด์ ํ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์ด๋ ์์์ ๋ฉํ๋ฐ์ดํฐ๋ง ๋ณ๊ฒฝํ๋ ์์ ์ด๋ฏ๋ก I/O๊ฐ ๊ฑฐ์ ๋ฐ์ํ์ง ์์ ๋์ฉ๋ ํ ์ด๋ธ์ด๋ผ๋ ๊ฑฐ์ ์ฆ์ ์๋ฃ๋ฉ๋๋ค. ๋ํ, TRUNCATE๋ ๋์คํฌ ๊ณต๊ฐ์ ์ฆ์ ํ์ํ๋ฏ๋ก PostgreSQL์ VACUUM๊ณผ ๊ฐ์ ์ถ๊ฐ์ ์ธ ๊ณต๊ฐ ์ ๋ฆฌ ์์ ์ด ํ์ํ์ง ์์ต๋๋ค.
๋ฆฌ์์ค ์๋น: ๋ก๊น ๊ณต๊ฐ ์ฌ์ฉ๋
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณต๊ตฌ๋ฅผ ์ํด ๋ก๊ทธ์ ๊ธฐ๋ก๋ฉ๋๋ค. DELETE์ TRUNCATE๋ ๋ก๊น ๋ฐฉ์์์ ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ ๋๋ค.
DELETE๋ '์์ ๋ก๊น (fully logged)' ์์ ์ ๋๋ค. ์ฆ, ์ญ์ ๋๋ ๋ชจ๋ ํ์ ๋ฐ์ดํฐ๊ฐ ํธ๋์ญ์ ๋ก๊ทธ(SQL Server), WAL(PostgreSQL), Redo/Undo ๋ก๊ทธ(Oracle)์ ๊ธฐ๋ก๋ฉ๋๋ค. ๋๋์ ํ์ ์ญ์ ํ ๊ฒฝ์ฐ, ์ด๋ก ์ธํด ๋ก๊ทธ ํ์ผ์ด ๊ธ๊ฒฉํ๊ฒ ์ปค์ ธ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํ๊ณ ๋ง๋ํ ๋์คํฌ ๊ณต๊ฐ์ ์ฐจ์งํ ์ ์์ต๋๋ค.
TRUNCATE๋ '์ต์ ๋ก๊น (minimally logged)' ์์ ์ ๋๋ค. ๊ฐ๋ณ ํ์ ์ญ์ ๋ฅผ ๊ธฐ๋กํ๋ ๋์ , ๋ฐ์ดํฐ ํ์ด์ง๋ ์ต์คํ ํธ์ ํ ๋น ํด์ ์ ๋ณด๋ง์ ๋ก๊ทธ์ ๊ธฐ๋กํฉ๋๋ค. ์ด๋ฌํ ์ต์ ๋ก๊น ๋ฐฉ์์ด TRUNCATE๋ DELETE ๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ์๋๊ฐ ๋น ๋ฆ ๋๋ค.
ํธ๋ฆฌ๊ฑฐ ์คํ ๋์
๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋ฆฌ๊ฑฐ๋ ํน์ ์ด๋ฒคํธ(INSERT, UPDATE, DELETE)๊ฐ ๋ฐ์ํ์ ๋ ์๋์ผ๋ก ์คํ๋๋ ํ๋ก์์ ์ ๋๋ค.
- DELETE: ์ญ์ ๋๋ ๊ฐ ํ์ ๋ํด ON DELETE ํธ๋ฆฌ๊ฑฐ๋ฅผ ์คํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง, ๊ฐ์ฌ ์ถ์ , ์ฐ๊ด ๋ฐ์ดํฐ ์ ๋ฆฌ ๋ฑ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- TRUNCATE: ํ ๋จ์ ์ฒ๋ฆฌ๋ฅผ ์ฐํํ๊ธฐ ๋๋ฌธ์ ON DELETE ํธ๋ฆฌ๊ฑฐ๋ฅผ ์คํํ์ง ์์ต๋๋ค.
- ์์ธ: PostgreSQL์ ๋ค๋ฅธ ์ฃผ์ DBMS์๋ ์๋ ๊ณ ์ ํ ๊ธฐ๋ฅ์ผ๋ก, ์ ์ฒด TRUNCATE ์์ ์ ๋ํด ํ ๋ฒ ์คํ๋๋ ON TRUNCATE ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ง์ํฉ๋๋ค.
3. DBMS๋ณ ๊ตฌํ ๋ฐ ๋์ ๋ฐฉ์
DELETE์ TRUNCATE์ ๊ธฐ๋ณธ์ ์ธ ์ฐจ์ด์ ์ ๋ณดํธ์ ์ด์ง๋ง, ์ค์ ๊ตฌํ ๋ฐฉ์๊ณผ ์ธ๋ถ ๋์์ ๊ฐ DBMS๋ง๋ค ์ฐจ์ด๊ฐ ์กด์ฌํฉ๋๋ค. PostgreSQL, MySQL(InnoDB ์คํ ๋ฆฌ์ง ์์ง ๊ธฐ์ค), Microsoft SQL Server, Oracle 4๊ฐ์ง RDBMS์ ํต์ฌ์ ์ธ ์ฐจ์ด์ ์ ๋น๊ตํ๋ฉฐ ์์๋ณด๊ฒ ์ต๋๋ค.
ํธ๋์ญ์ ๋์ ๋ฐ ๋กค๋ฐฑ(Rollback) ๊ฐ๋ฅ์ฑ
PostgreSQL & SQL Server: ํธ๋์ญ์ ์ด ๋ณด์ฅ๋๋ TRUNCATE
PostgreSQL๊ณผ SQL Server๋ TRUNCATE๋ฅผ ํธ๋์ญ์ ์ด ๋ณด์ฅ๋๋ DDL ๋ฌธ์ผ๋ก ์ทจ๊ธํฉ๋๋ค. ์ฆ, BEGIN TRANSACTION ๋ธ๋ก ๋ด์์ TRUNCATE๋ฅผ ์คํํ ํ ROLLBACK์ ํธ์ถํ๋ฉด ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์์ ํ ๋ณต์๋ฉ๋๋ค.
- PostgreSQL์ ๋ฉ์ปค๋์ฆ: PostgreSQL์ ๋ค์ค ๋ฒ์ ๋์์ฑ ์ ์ด(MVCC) ์์คํ ์ ํ์ฉํ์ฌ ์ด๋ฅผ ๊ตฌํํฉ๋๋ค. TRUNCATE๊ฐ ์คํ๋๋ฉด, PostgreSQL์ ํ ์ด๋ธ์ ๋ํ ์๋ก์ด ๋ฌผ๋ฆฌ์ ํ์ผ(relfilenode)์ ์์ฑํฉ๋๋ค. ํธ๋์ญ์ ์ด COMMIT ๋๋ฉด ์ด ์๋ก์ด ๋น ํ์ผ์ด ๊ณต์์ ์ผ๋ก ํ ์ด๋ธ์ ํ์ผ์ด ๋๊ณ ์ด์ ํ์ผ์ ์ญ์ ๋๊ธฐ ์ํ๊ฐ ๋ฉ๋๋ค. ๋ฐ๋ฉด ROLLBACK์ด ์คํ๋๋ฉด, ์๋ก ์์ฑ๋ ํ์ผ์ ๋ฒ๋ ค์ง๊ณ ์ด์ ๋ฐ์ดํฐ ํ์ผ๋ก ์ฆ์ ๋ณต๊ทํฉ๋๋ค.
- SQL Server์ ๋ฉ์ปค๋์ฆ: SQL Server์์ TRUNCATE๋ ์ต์ ๋ก๊น ์์ ์ด์ง๋ง, ํ์ด์ง ํ ๋น ํด์ ์ ๋ณด๊ฐ ํธ๋์ญ์ ๋ก๊ทธ์ ๊ธฐ๋ก๋ฉ๋๋ค. ROLLBACK์ ์ด ๋ก๊ทธ ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง ํ ๋น ํด์ ๋ฅผ ๋๋๋ฆผ์ผ๋ก์จ ํ ์ด๋ธ์ ๋ณต์ํฉ๋๋ค.
MySQL (InnoDB) & Oracle: ์์์ ์ปค๋ฐ(Implicit Commit)
MySQL๊ณผ Oracle์์๋ DDL ๋ฌธ์ด ์คํ๋ ๋ ํ์ฌ ์งํ ์ค์ธ ํธ๋์ญ์ ์ด Implicitํ๊ฒ COMMIT๋๋ ๋์ ๋ฐฉ์์ ๊ฐ์ง๋๋ค. DDL๋ฌธ ์คํ ์ ๊ณผ ํ์ ๊ฐ๊ฐ COMMIT์ด ๋ฐ์ํฉ๋๋ค.
์ด๋ฌํ ํน์ฑ ๋๋ฌธ์ TRUNCATE ๋ฌธ์ ์ฌ์ฉ์๊ฐ ์ ์ํ ๋ ํฐ ํธ๋์ญ์ ์ ์ผ๋ถ๊ฐ ๋ ์ ์์ผ๋ฉฐ, ์ผ๋จ ์คํ๋๋ฉด ๋กค๋ฐฑ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
TRUNCATE ์ด์ ์ ๊ฐ์ ํธ๋์ญ์ ๋ธ๋ก์์ ์ํ๋ ๋ชจ๋ ์์ ์ TRUNCATE๊ฐ ์คํ๋๋ ์์ ์ ์๊ตฌ์ ์ผ๋ก ์ปค๋ฐ๋ฉ๋๋ค.
๋ค์ ํ๋ ๊ฐ DBMS๋ณ TRUNCATE์ ๋กค๋ฐฑ ๊ฐ๋ฅ์ฑ์ ์์ฝํ ๊ฒ์ ๋๋ค.
| DBMS | TRUNCATE ๋กค๋ฐฑ ๊ฐ๋ฅ ์ฌ๋ถ | ํน์ง |
| PostgreSQL | O | MVCC ๋ฐ ์๋ก์ด relfilenode ์์ฑ์ ํตํด ๊ตฌํ. |
| SQL Server | O | ์ต์ ๋ก๊น ๋์ง๋ง ๋กค๋ฐฑ ๊ฐ๋ฅํ ์์ . |
| MySQL (InnoDB) | X | ์์์ COMMIT์ ์ ๋ฐํ์ฌ ํธ๋์ญ์ ์ ์ผ๋ถ๊ฐ ๋ ์ ์์. |
| Oracle | X | DDL ์คํ ์ ํ์ ์์์ COMMIT ๋ฐ์ |
์ธ๋ ํค(Foreign Key) ์ ์ฝ ์กฐ๊ฑด ์ฒ๋ฆฌ ๋ฐฉ์
์ธ๋ ํค์ ์ํด ์ฐธ์กฐ๋๋ ํ ์ด๋ธ์ TRUNCATE๋ฅผ ์ฌ์ฉํด ๋น์ฐ๋ ค๊ณ ํ ๋ ๊ฐ DBMS์๋ ์๋ก ๋ค๋ฅธ ๊ท์น๋ค์ด ์กด์ฌํฉ๋๋ค.
- PostgreSQL: CASCADE ์ต์ ์ ์ ๊ณตํฉ๋๋ค. TRUNCATE my_table CASCADE;๋ฅผ ์คํํ๋ฉด my_table์ ์ฐธ์กฐํ๋ ๋ชจ๋ ํ ์ด๋ธ์ด ์ฌ๊ท์ ์ผ๋ก ํจ๊ป TRUNCATE๋ฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ฐ๋ ฅํ์ง๋ง, ์๋์น ์์ ๋๋ ๋ฐ์ดํฐ ์ญ์ ๋ก ์ด์ด์ง ์ ์์ด ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ธ RESTRICT๋ ์ธ๋ ํค ์ฐธ์กฐ๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
- SQL Server: ์ธ๋ ํค ์ ์ฝ ์กฐ๊ฑด์ ์ํด ์ฐธ์กฐ๋๋ ํ ์ด๋ธ์ TRUNCATE๋ฅผ ์๊ฒฉํ๊ฒ ๊ธ์งํฉ๋๋ค. CASCADE ์ต์ ์ด๋ ์ธ์ ์์ค์ ์ฌ์ ์ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ ์ฝ ์กฐ๊ฑด์ ์คํฌ๋ฆฝํธ๋ก ์ ์ฅํ ํ ์ญ์ (DROP)ํ๊ณ , TRUNCATE๋ฅผ ์ํํ ๋ค์, ์ ์ฝ ์กฐ๊ฑด์ ๋ค์ ์์ฑํ๋ ๊ฒ์ด ๋์์ด ๋ ์ ์์ต๋๋ค.
- Oracle: SQL Server์ ์ ์ฌํ๊ฒ, ํ์ฑํ๋ ์ธ๋ ํค ์ ์ฝ ์กฐ๊ฑด์ ๋ถ๋ชจ ํ ์ด๋ธ์ TRUNCATEํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค. ์ ์ฝ ์กฐ๊ฑด์ ๋จผ์ ๋นํ์ฑํํด์ผ ํฉ๋๋ค. Oracle 12c ๋ถํฐ CASCADE ์ต์ ์ด ๋์ ๋์๋๋ฐ, ์ธ๋ ํค๊ฐ ON DELETE CASCADE๋ก ์ ์๋ ๊ฒฝ์ฐ์๋ง ์๋ํฉ๋๋ค.
- MySQL: TRUNCATE์ ๋ํ CASCADE ์ต์ ์ด ์์ต๋๋ค. ์ธ๋ ํค ์ ์ฝ ์กฐ๊ฑด์ด ์กด์ฌํ๋ฉด ์์ ์ด ์คํจํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ํด๊ฒฐ์ฑ ์ ์ธ์ ๋์ ์ผ์์ ์ผ๋ก ์ธ๋ ํค ๊ฒ์ฌ๋ฅผ ๋นํ์ฑํํ๋ ๊ฒ์ ๋๋ค.
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE my_table;
SET FOREIGN_KEY_CHECKS=1
- ์ ๋ฐฉ๋ฒ ํจ๊ณผ์ ์ด์ง๋ง, ๊ฒ์ฌ๊ฐ ๋นํ์ฑํ๋ ๋์ ๋ค๋ฅธ ์์ ์ด ์ํ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ๋น์ผ๊ด์ ์ธ ์ํ์ ๋์ผ ์ํ์ด ์์ด ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
์ ๊ธ(Locking), ๋์์ฑ, ๊ฒฉ๋ฆฌ ์์ค
๋ฐ์ดํฐ ์ญ์ ์์ ์ค ๋ฐ์ํ๋ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ์์คํ ์ ๋์์ฑ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
- DELETE (๋ณดํธ์ ): ์ญ์ ๋๋ ํ์ ๋ํด ํ ์์ค ์ ๊ธ(์: PostgreSQL์ ROW EXCLUSIVE)์ ํ๋ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๋์ผํ ํ ์ด๋ธ์ ๋ค๋ฅธ ํ์ ์ฝ๊ณ ์ฐ๋ ์์ ์ ๊ณ์ํ ์ ์์ด ๋์์ฑ์ ๊ทน๋ํํฉ๋๋ค.
- TRUNCATE (DBMS๋ณ ์์ด)
- PostgreSQL: ํ ์ด๋ธ์ ACCESS EXCLUSIVE ์ ๊ธ์ ํ๋ํฉ๋๋ค. ๊ฐ์ฅ ๊ฐ๋ ฅํ ์ ๊ธ์ผ๋ก, SELECT๋ฅผ ํฌํจํ ๋ชจ๋ ๋ค๋ฅธ ์์ ์ ์ฐจ๋จํฉ๋๋ค.
- SQL Server: ํ ์ด๋ธ์ ์คํค๋ง ์์ (Sch-M) ์ ๊ธ์ ํ๋ํฉ๋๋ค. ๋ชจ๋ ๋ค๋ฅธ ์์ ์ ์ฐจ๋จํ๋ฉฐ, ๋จ์ SELECT ์ฟผ๋ฆฌ๊ฐ ํ๋ํ๋ ๊ฐ๋ฒผ์ด ์คํค๋ง ์์ ์ฑ(Sch-S) ์ ๊ธ๊ณผ๋ ํธํ๋์ง ์์ต๋๋ค.
- MySQL: ํ ์ด๋ธ ๋ฉํ๋ฐ์ดํฐ ์ ๊ธ(METADATA_LOCK)์ ํ์๋ก ํ๋ฉฐ, ์ด๋ ๋ค๋ฅธ ์ธ์ ์ด ๋์ผํ ํ ์ด๋ธ์ ๋ํด DDL์ด๋ ๋ค๋ฅธ ๋ฉํ๋ฐ์ดํฐ ์ ๊ธ์ ํ์๋ก ํ๋ ์์ ์ ์ํํ๋ ๊ฒ์ ์ฐจ๋จํฉ๋๋ค.
- Oracle: DDL ์์ ์ผ๋ก์ ๋ฐฐํ์ ์ธ DDL ์ ๊ธ์ ํ์๋ก ํ์ฌ ๋ค๋ฅธ DDL ์์ ์ ๋ง๊ณ , ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ง๊ธฐ ์ํ DML ์ ๊ธ๋ ํ๋ํฉ๋๋ค.
TRUNCATE๋ ํ ์ด๋ธ ์์ค ์ ๊ธ์ด๋ผ๋ ๋์ ๋๋ฌธ์ ๋์์ฑ์ด ๋์ ์จ๋ผ์ธ ํธ๋์ญ์ ์ฒ๋ฆฌ(OLTP) ์์คํ ์๋ ๊ทผ๋ณธ์ ์ผ๋ก ๋ถ์ ํฉํฉ๋๋ค. ์ด ๋ช ๋ น์ด๋ฅผ ์ค์๊ฐ ์ด์ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ฉด ์ฌ๊ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ฐจ์์ ๋ธ๋กํน๊ณผ ํ์์์์ ์ ๋ฐํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ TRUNCATE๋ ์ ์ง๋ณด์ ์๊ฐ, ETL๊ณผ ๊ฐ์ ๋ฐฐ์น ์์ , ๋๋ ๊ฐ๋ฐ/ํ ์คํธ ํ๊ฒฝ์ ์ํ ๋๊ตฌ๋ก ๊ฐ์ฃผ๋์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์, ๋์ ๋์์ฑ์ด ์๊ตฌ๋๋ ํ๊ฒฝ์์๋ ์ฑ๋ฅ ๋น์ฉ์ ๊ฐ์ํ๋๋ผ๋ DELETE๊ฐ ์ต์ ์ ์ ํ์ผ ์ ์์ต๋๋ค.
์๋ ์์ฑ ๊ฐ(Identity/Auto-increment/Sequence) ๊ด๋ฆฌ
์๋์ผ๋ก ์ฆ๊ฐํ๋ ์๋ณ์ ์ปฌ๋ผ์ ๊ฐ์ DELETE์ TRUNCATE์ ์ํด ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค.
- PostgreSQL: TRUNCATE๋ ์ํ์ค ๊ฐ์ ๋ํ ๋ช ์์ ์ธ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. RESTART IDENTITY ์ต์ ์ ์ฐ๊ฒฐ๋ ์ํ์ค๋ฅผ ์์ ๊ฐ์ผ๋ก ์ฌ์ค์ ํ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ธ CONTINUE IDENTITY๋ ์ํ์ค ๊ฐ์ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. DELETE๋ ์ํ์ค์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
- MySQL: TRUNCATE๋ AUTO_INCREMENT ์นด์ดํฐ๋ฅผ ์ด๊ธฐ ๊ฐ์ผ๋ก ์ฌ์ค์ ํฉ๋๋ค.
DELETE๋ ์นด์ดํฐ๋ฅผ ์ฌ์ค์ ํ์ง ์์ผ๋ฉฐ, ๋ค์ ์ฝ์ ๋๋ ํ์ ๋ง์ง๋ง์ผ๋ก ๊ฐ์ฅ ๋์๋ ๊ฐ์์ ๊ณ์๋ฉ๋๋ค. - SQL Server: TRUNCATE๋ IDENTITY ์ปฌ๋ผ์ ์๋์ ์๋(seed) ๊ฐ์ผ๋ก ์ฌ์ค์ ํฉ๋๋ค.
DELETE๋ ๊ทธ๋ ์ง ์์ต๋๋ค. DELETE ์ดํ์ IDENTITY ๊ฐ์ ์ฌ์ค์ ํ๋ ค๋ฉด DBCC CHECKIDENT('table_name', RESEED, new_value) ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. - Oracle: ์ํ์ค๋ ํ ์ด๋ธ๊ณผ ๋ณ๊ฐ์ ๊ฐ์ฒด์ด๋ฏ๋ก TRUNCATE๊ฐ ์๋์ผ๋ก ์ํ์ค๋ฅผ ์ฌ์ค์ ํ์ง ์์ต๋๋ค. ์ฌ์ค์ ์ด ํ์ํ๋ค๋ฉด ์ํ์ค๋ฅผ ์๋์ผ๋ก ์ญ์ ํ๊ณ ์ฌ์์ฑํ๊ฑฐ๋, ์ต์ ๋ฒ์ (18c ์ด์)์์๋ ALTER SEQUENCE... RESTART๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ๋จํ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. DELETE๋ ์ํ์ค์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
๋ก๊น ๋ด๋ถ ๊ตฌ์กฐ์ ๋ณต๊ตฌ ๊ฐ๋ฅ์ฑ
TRUNCATE๊ฐ '๋ก๊น ๋์ง ์๋๋ค'๋ ์คํด์ ๋ฌ๋ฆฌ, ๋ชจ๋ TRUNCATE ์์ ์ ์ด๋ค ํํ๋ก๋ ๋ณต๊ตฌ๋ฅผ ์ํด ๋ก๊ทธ์ ๊ธฐ๋ก๋ฉ๋๋ค. ์ด๋ฌํ ์คํด์ ์ด์ ๋ ๋ก๊น ๋๋ ๋ด์ฉ์ ์์ธ ์์ค ๋๋ฌธ์ ๋๋ค.
- DELETE ๋ก๊น : ์ญ์ ๋ ๊ฐ ํ์ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ก๊ทธ์ ๊ธฐ๋กํฉ๋๋ค. ์ด๋ฅผ ํตํด ํน์ ์์ ๋ณต๊ตฌ(Point-in-Time Recovery, PITR)๋ฅผ ์ฌ์ฉํ์ฌ DELETE ์ง์ ์ ์ํ๋ก ๋์๊ฐ ์ ์์ผ๋ฉฐ, ๋ก๊ทธ๋ฅผ ์ญ์ผ๋ก ์ฌ์ํ์ฌ DELETE ์์ ์ '์ทจ์'ํ ์ ์์ต๋๋ค.
- TRUNCATE ๋ก๊น : ํ์ด์ง/์ต์คํ ํธ์ ํ ๋น ํด์ ์ ๋ณด๋ง ๊ธฐ๋กํฉ๋๋ค. ์ด๋ ์์คํ ์ฅ์ ์ ๋ณต๊ตฌ(TRUNCATE๊ฐ ์์ ํ ์๋ฃ๋์๊ฑฐ๋ ์ ํ ์คํ๋์ง ์์ ์ํ๋ฅผ ๋ณด์ฅ)์ ํธ๋์ญ์ ๋กค๋ฐฑ(์ง์๋๋ DBMS์ ๊ฒฝ์ฐ)์ด ๊ฐ๋ฅํฉ๋๋ค.
- PITR์ ๋ฏธ์น๋ ์ํฅ: TRUNCATE๋ ํ ๋ฐ์ดํฐ๋ฅผ ๋ก๊ทธ์ ๋จ๊ธฐ์ง ์๊ธฐ ๋๋ฌธ์, ํธ๋์ญ์ ๋ก๊ทธ๋ง์ผ๋ก๋ TRUNCATE ์ง์ ์์ ์ผ๋ก ๋ณต๊ตฌํ ์ ์์ต๋๋ค. ์ค์๋ก TRUNCATE๋ฅผ ์คํํ ๊ฒฝ์ฐ, TRUNCATE๊ฐ ๋ฐ์ํ๊ธฐ ์ด์ ์ ์์ฑ๋ ๋ฐฑ์ ์ ์ฌ์ฉํ์ฌ ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ ์ด๋ธ์คํ์ด์ค๋ฅผ ๋ณต์ํ ํ ์ํ๋ ์์ ๊น์ง ๋กค ํฌ์๋ํด์ผ ํฉ๋๋ค. ์ด ๋๋ฌธ์ TRUNCATE๋ก ์ธํ ๋ฐ์ดํฐ ์์ค ๋ณต๊ตฌ๋ DELETE์ ๋นํด ํจ์ฌ ๋ ๋ณต์กํ๊ณ ์์คํ ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ ์์ ์ด ๋ฉ๋๋ค.
4. DELETE, TRUNCATE ์ฌ์ฉ
์ง๊ธ๊น์ง ์ดํด๋ณธ ๊ธฐ์ ์ ์ฐจ์ด์ ์ ๋ฐํ์ผ๋ก, ๊ฐ์์ ์๋๋ฆฌ์ค์ ๋ฐ๋ผ ์ด๋ค ๋ช ๋ น์ด๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ ๋ฆฌํ ์ง ์์๋ณด๊ฒ ์ต๋๋ค.
4.1. ETL ํ๋ก์ธ์ค์์ ์คํ ์ด์ง ํ ์ด๋ธ ๋น์ฐ๊ธฐ
- ๊ถ์ฅ: TRUNCATE
- ์ด์ : ์ด ์๋๋ฆฌ์ค์์๋ ์๋๊ฐ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์คํ ์ด์ง ํ ์ด๋ธ์ ๋ค์ ๋ฐ์ดํฐ ๋ก๋๋ฅผ ์ํด ๋น ๋ฅด๊ณ ์๋ฒฝํ๊ฒ ๋น์์ ธ์ผ ํฉ๋๋ค. TRUNCATE์ ์๋์ ์ธ ์ฑ๋ฅ, ์ฆ๊ฐ์ ์ธ ๊ณต๊ฐ ํ์, IDENTITY ๊ฐ ์ด๊ธฐํ๋ ETL ์์ ์ ์ด์์ ์ ๋๋ค. ํธ๋์ญ์ ์์ ์ฑ์ ๋ณดํต ETL ์์ ์ ์ฒด์ ์ํ ๊ด๋ฆฌ๋ก ์ฒ๋ฆฌ๋๋ฉฐ, ์ธ๋ ํค ์ ์ฝ ์กฐ๊ฑด์ ์คํ ์ด์ง ํ ์ด๋ธ์ ๊ฑฐ์ ์กด์ฌํ์ง ์์ต๋๋ค.
4.2. ํ ์คํธ ํ๊ฒฝ ์ด๊ธฐํ
- ๊ถ์ฅ: TRUNCATE
- ์ด์ : ํ ์คํธ๋ฅผ ๋ฐ๋ณต ์ํํ ๋๋ง๋ค ๊นจ๋ํ ์ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํ์ํฉ๋๋ค. TRUNCATE๋ ํ ์ด๋ธ์ ๋น ๋ฅด๊ฒ ๋น์ธ ๋ฟ๋ง ์๋๋ผ, IDENTITY๋ AUTO_INCREMENT ๊ฐ์ ์ด๊ธฐํํ์ฌ ๋งค ํ ์คํธ๊ฐ ์ผ๊ด๋ ์กฐ๊ฑด์์ ์์๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์์ธก ๊ฐ๋ฅํ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
4.3. ์ด์ ํ๊ฒฝ์ ๋์ฉ๋ ํ ์ด๋ธ์์ ์ค๋๋ ๋ฐ์ดํฐ ์์นด์ด๋น ๋๋ ์ญ์
- ๊ถ์ฅ: DELETE (๋ฐฐ์น ์ฒ๋ฆฌ)
- ์ด์ : ์ด ์์ ์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ง ์ ๋ณ์ ์ผ๋ก ์ญ์ ํด์ผ ํ๋ฏ๋ก WHERE ์ ์ด ํ์์ ์ ๋๋ค (์: WHERE created_at < '2022-01-01'). TRUNCATE๋ ์ด ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ, ํ ๋ฒ์ ์๋ฐฑ๋ง ๊ฑด์ ๋ฐ์ดํฐ๋ฅผ DELETEํ๋ฉด ํธ๋์ญ์ ๋ก๊ทธ๊ฐ ํญ์ฆํ๊ณ ์ฅ์๊ฐ ์ ๊ธ์ด ๋ฐ์ํ์ฌ ์ด์ ์์คํ ์ ์ฌ๊ฐํ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ๋ฐ๋ผ์ DELETE๋ฅผ ์์ฒ์์ ์๋ง ๊ฑด ๋จ์์ ์์ ๋ฐฐ์น(batch)๋ก ๋๋์ด ๋ฐ๋ณต ์คํํ๊ณ ๊ฐ ๋ฐฐ์น๋ง๋ค COMMITํ๋ ์ ๋ต์ด ํ์์ ์ ๋๋ค.
4.4. ์ค์๊ฐ ์ด์ ์ค์ธ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ ์ญ์
- ๊ถ์ฅ: ์ ์คํ ์ ๊ทผ ํ์ (์ฃผ๋ก ๋ฐฐ์น DELETE) + DBMS ํน์ฑ ๊ณ ๋ ค
- ์ด์ : ๋งค์ฐ ์ํํ ์์ ์ ๋๋ค. ์์คํ ์ ๋์์ฑ์ ๋ฐ๋์ ์ ์งํด์ผ ํ๋ค๋ฉด, ์์ ์ค๋ช ํ ๋ฐฐ์น DELETE ๋ฐฉ์์ด ์ ์ผํ ์ ํ์ง์ ๋๋ค. ์งง์ ์๊ฐ ๋์์ ์๋น์ค ์ค๋จ(์ ์ง๋ณด์ ์๊ฐ)์ด ํ์ฉ๋๋ค๋ฉด TRUNCATE๊ฐ ํจ์ฌ ๋น ๋ฆ ๋๋ค. ํ์ง๋ง ์ด๋ DBMS์ ํน์ฑ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. MySQL์ด๋ Oracle์์๋ ๋กค๋ฐฑ์ด ๋ถ๊ฐ๋ฅํ TRUNCATE ์คํ ํ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ๋น์ด์๋ ์น๋ช ์ ์ธ ์ํ์ ๋์ผ ์ ์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ:
https://www.cybertec-postgresql.com/en/postgresql-delete-vs-truncate/
PostgreSQL: DELETE vs. TRUNCATE
Archiving and database cleanup in PostgreSQL: Find out how DELETE and TRUNCATE compare in terms of performance and how the magic works
www.cybertec-postgresql.com
https://www.rockdata.net/docs/17/sql-createtrigger.html
PostgreSQL 17 Documentation: CREATE TRIGGER - Redrock Postgres
CREATE TRIGGER CREATE TRIGGER — define a new trigger Synopsis CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] } ON table_name [ FROM referenced_table_name ] [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALL
www.rockdata.net
https://dev.mysql.com/doc/refman/9.4/en/truncate-table.html
MySQL :: MySQL 9.4 Reference Manual :: 15.1.42 TRUNCATE TABLE Statement
15.1.42 TRUNCATE TABLE Statement TRUNCATE [TABLE] tbl_name TRUNCATE TABLE empties a table completely. It requires the DROP privilege. Logically, TRUNCATE TABLE is similar to a DELETE statement that deletes all rows, or a sequence of DROP TABLE and CREATE
dev.mysql.com
TRUNCATE TABLE (Transact-SQL) - SQL Server
TRUNCATE TABLE removes all rows from a table or specified partitions of a table.
learn.microsoft.com
https://stackoverflow.com/questions/3256242/pros-cons-of-truncate-vs-delete-from
Pros & Cons of TRUNCATE vs DELETE FROM
Could someone give me a quick overview of the pros and cons of using the following two statements: TRUNCATE TABLE dbo.MyTable vs DELETE FROM dbo.MyTable It seems like they both do the same thing ...
stackoverflow.com