Vladimir Sitnikov์ 2016๋ ์ด ๋ณด๊ณ ์ "PostgreSQL๊ณผ JDBC๊ฐ ๋ชจ๋ ์ฃผ์ค๋ฅผ ์ง๋ด๊ณ ์์ต๋๋ค"์ ๋ น์ทจ๋ก์ ์ฝ์ด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
์ข์ ์คํ์์ ๋ด ์ด๋ฆ์ ๋ธ๋ผ๋๋ฏธ๋ฅด ์ํธ๋์ฝํ์ ๋๋ค. ์ ๋ NetCracker์์ 10๋ ๋์ ์ผํด์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ์ฃผ๋ก ์์ฐ์ฑ์ ๊ด์ฌ์ด ์์ต๋๋ค. Java์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ, SQL๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ด ์ ๊ฐ ์ข์ํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ค๋์ ํ์ฌ์์ PostgreSQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๋ก ์ฌ์ฉํ๊ธฐ ์์ํ์ ๋ ๊ฒช์๋ ์ผ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์ฃผ๋ก Java๋ก ์์ ํฉ๋๋ค. ํ์ง๋ง ์ค๋ ์ ๊ฐ ๋ง์๋๋ฆด ๋ด์ฉ์ ๋จ์ง ์๋ฐ์ ๊ดํ ๊ฒ์ด ์๋๋๋ค. ์ค์ต์์ ์ ์ ์๋ฏ์ด ์ด๋ ๋ค๋ฅธ ์ธ์ด์์๋ ๋ฐ์ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ด์ผ๊ธฐํ ๊ฒ์ ๋๋ค:
- ๋ฐ์ดํฐ ์ํ๋ง์ ๋ํด.
- ๋ฐ์ดํฐ ์ ์ฅ์ ๋ํด.
- ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ์ ๋ํด์๋์.
- ๊ทธ๋ฆฌ๊ณ ๊ฑฐ๊ธฐ์ ๋ฌปํ ์๋ ์์ค ๊ฐํด์ ๋ํด์๋์.
๊ฐ๋จํ ์ง๋ฌธ๋ถํฐ ์์ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ธฐ๋ณธ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ด๋ธ์์ ํ๋์ ํ์ ์ ํํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋์ผํ ํธ์คํธ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ํ๋ฐ์๋ 20๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
์ด 20๋ฐ๋ฆฌ์ด๋ ๋ง์ ์๊ฐ์ ๋๋ค. ๊ทธ๋ฌํ ์์ฒญ์ด 100๊ฐ๋ผ๋ฉด ์ด๋ฌํ ์์ฒญ์ ์คํฌ๋กคํ๋ ๋ฐ ์ด๋น ์๊ฐ์ ์๋นํ๊ฒ ๋ฉ๋๋ค. ์ฆ, ์๊ฐ์ ๋ญ๋นํ๊ณ ์๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ข์ํ์ง ์์ผ๋ฉฐ ๊ธฐ์ง๊ฐ ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ์๊ฒ ๋ฌด์์ ์ ๊ณตํ๋์ง ์ดํด๋ด ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฟผ๋ฆฌ ์คํ์ ์ํ ๋ ๊ฐ์ง ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์ต์ ์ ๊ฐ๋จํ ์์ฒญ์ ๋๋ค. ๋ฌด์์ด ์ข์๊ฐ์? ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋ฐ์ ๋ณด๋ธ๋ค๋ ์ฌ์ค ๊ทธ ์ด์์ ์๋๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ๋ ๊น๋ค๋กญ์ง๋ง ๋ ๊ธฐ๋ฅ์ ์ธ ๊ณ ๊ธ ์ฟผ๋ฆฌ๋ ์์ต๋๋ค. ํ์ฑ, ์คํ, ๋ณ์ ๋ฐ์ธ๋ฉ ๋ฑ์ ์์ฒญ์ ๋ณ๋๋ก ๋ณด๋ผ ์ ์์ต๋๋ค.
์ํผ ํ์ฅ ์ฟผ๋ฆฌ๋ ์ด๋ฒ ๋ณด๊ณ ์์์ ๋ค๋ฃจ์ง ์์ ๋ด์ฉ์ ๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ํ๊ณ ์ด๋ค ํํ๋ก๋ ํ์ฑ๋ ์์ ๋ฆฌ์คํธ๊ฐ ์์ต๋๋ค. ์ฆ, ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ด์ง๋ง ํ์ฌ์ ๋ด๋ ์๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋์ ๊ทธ๋ฅ ๋ น์ํ๊ณ ์ฃผ์ ์ธ๋ฌผ๋ค์ ํ๋ค๋ฉด์ ๋์๋ค๋ ์์ ์ด์์.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ๊ฒ์ ๋จ์ ์ฟผ๋ฆฌ์ ํ์ฅ ์ฟผ๋ฆฌ์ ๋๋ค.
๊ฐ ์ ๊ทผ ๋ฐฉ์์ ํน๋ณํ ์ ์ ๋ฌด์์ ๋๊น?
์ผํ์ฑ ์คํ์๋ ๊ฐ๋จํ ์ฟผ๋ฆฌ๊ฐ ์ข์ต๋๋ค. ์ผ๋จ ์๋ฃํ๊ณ ์์ด๋ฒ๋ ธ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ํ์์ ์ง์ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ์ผ๋ถ ๊ณ ์ฑ๋ฅ ์์คํ ์๋ ์ ํฉํ์ง ์์ต๋๋ค.
ํ์ฅ ์ฟผ๋ฆฌ โ ๊ตฌ๋ฌธ ๋ถ์ ์๊ฐ์ ์ ์ฝํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ํ๊ณ ์ฌ์ฉํ๊ธฐ ์์ํ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ ๋ง๋ก ์ฐ๋ฆฌ์๊ฒ ๋์์ด ๋์์ต๋๋ค. ๊ตฌ๋ฌธ ๋ถ์ ๋น์ฉ๋ง ์ ๊ฐ๋๋ ๊ฒ์ ์๋๋๋ค. ๋ฐ์ดํฐ ์ ์ก ๋น์ฉ์ด ์ ๊ฐ๋ฉ๋๋ค. ๋ฐ์ด๋๋ฆฌ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒ์ด ํจ์ฌ ๋ ํจ์จ์ ์ ๋๋ค.
์ฐ์ต์ ๊ณ์ํด ๋ด ์๋ค. ์ด๊ฒ์ด ์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ์ต์ ๋๋ค. ์๋ฐ ๋ฑ์ด ๋ ์ ์์ต๋๋ค.
์ฑ๋ช ์๋ฅผ ์์ฑํ์ต๋๋ค. ๋ช ๋ น์ ์คํํ์ต๋๋ค. ๊ฐ๊น์ด์ ๋ง๋ค์ด์ก์ต๋๋ค. ์ฌ๊ธฐ์ ์ค์๋ ์ด๋์ ์์ต๋๊น? ๋ฌธ์ ๋ ๋ฌด์์ ๋๊น? ๊ด์ฐฎ์์. ๋ชจ๋ ์ฑ ์ ์ด๋ ๊ฒ ๋์ ์์ต๋๋ค. ์ด๋ ๊ฒ ์์ฑํด์ผ ํฉ๋๋ค. ์ต๋ ์ฑ๋ฅ์ ์ํ๋ค๋ฉด ์ด๋ ๊ฒ ์์ฑํ์ธ์.
๊ทธ๋ฌ๋ ์ค์ ๋ก๋ ์ด๊ฒ์ด ์๋ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์? "close" ๋ฉ์๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด์ ์์ ๋ณผ ๋ ์ด๋ ๋ง์น ํก์ฐ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค. ์ฐ๋ฆฌ๋ "PARSE EXECUTE DEALLOCATE"๋ผ๊ณ ๋งํ์ต๋๋ค.
์ ์ด ๋ชจ๋ ์ถ๊ฐ์ ์ธ ๋ช ๋ น๋ฌธ ์์ฑ ๋ฐ ์ธ๋ก๋๊ฐ ํ์ํฉ๋๊น? ์๋ฌด๋ ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋กPreparedStatements์์ ๋ฐ์ํ๋ ์ผ์ ์ฐ๋ฆฌ๊ฐ ์ด๋ฅผ ๋ซ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ๊ฒ์ ๋ซ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ด ์๋๋๋ค.
์ฐ๋ฆฌ๋ ๊ฑด๊ฐํ ์ฌ๋๋ค์ฒ๋ผ ๋ฒ ์ด์ค์ ํจ๊ป ์ผํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ฑ๋ช ์๋ฅผ ํ ๋ฒ ์์ฑํ๊ณ ์ค๋นํ ๋ค์ ์ฌ๋ฌ ๋ฒ ์คํํฉ๋๋ค. ์ค์ ๋ก ์ฌ๋ฌ ๋ฒ(์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด ์๋ช ์ค ํ ๋ฒ) ๊ตฌ๋ฌธ ๋ถ์๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๋ค๋ฅธ REST์์ ๋์ผํ ๋ช ๋ น๋ฌธ ID๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ์ ๋ชฉํ์ ๋๋ค.
์ด๋ป๊ฒ ์ด๋ฅผ ๋ฌ์ฑํ ์ ์๋์?
๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ๋ฌธ์ ๋ซ์ ํ์๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ โ์ค๋นํ๋คโ โ์คํํ๋คโ๋ผ๊ณ ์๋๋ค.
์ด๋ฐ ๊ฒ์ ์์ํ๋ฉด ์ด๋๊ฐ์์ ๋ญ๊ฐ๊ฐ ๋์น ๊ฒ์ด ๋ถ๋ช ํฉ๋๋ค. ํ์คํ์ง ์์ ๊ฒฝ์ฐ ์๋ํด ๋ณผ ์ ์์ต๋๋ค. ์ด ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๋ฒค์น๋งํฌ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ์ฑ๋ช ์ ์์ฑํ์ญ์์ค. ์ฐ๋ฆฌ๋ ๋๋ผ์ด๋ฒ์ ์ผ๋ถ ๋ฒ์ ์์ ์ด ํ๋ก๊ทธ๋จ์ ์คํํ๋๋ฐ, ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ค๋๋ฉด์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ถฉ๋ํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๊ทธ๋ฌํ ์ค๋ฅ๋ ์ฝ๊ฒ ์์ ๋ ์ ์๋ค๋ ๊ฒ์ด ๋ถ๋ช ํฉ๋๋ค. ๋๋ ๊ทธ๋ค์ ๋ํด ์ด์ผ๊ธฐํ์ง ์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ ๋ฒ์ ์ด ํจ์ฌ ๋ ๋น ๋ฅด๊ฒ ์๋ํ๋ค๊ณ ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ฐฉ๋ฒ์ ๋ฐ๋ณด๊ฐ์ง๋ง ๊ทธ๋๋์.
์ฌ๋ฐ๋ฅด๊ฒ ์ผํ๋ ๋ฐฉ๋ฒ? ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ ๋ฌด์์ ํด์ผ ํฉ๋๊น?
์ค์ ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ํญ์ ๋ฌธ์ ๋ซ์ต๋๋ค. ๋ชจ๋ ์ฑ ์๋ ๋ซ์ผ๋ผ๊ณ ๋์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋์ถ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ PostgreSQL์ ์ฟผ๋ฆฌ๋ฅผ ์บ์ํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค. ๊ฐ ์ธ์ ์ด ์์ฒด์ ์ผ๋ก ์ด ์บ์๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ตฌ๋ฌธ ๋ถ์์ ์๊ฐ์ ๋ญ๋นํ๊ณ ์ถ์ง ์์ต๋๋ค.
ํ์์ฒ๋ผ ์ฐ๋ฆฌ์๊ฒ๋ ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ์ต์ ์ ๋ชจ๋ ๊ฒ์ PgSQL๋ก ๋ํํ์๋ ๊ฒ์ ๋๋ค. ๊ฑฐ๊ธฐ์ ์บ์๊ฐ ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ ์บ์ํฉ๋๋ค. ๊ทธ๊ฒ์ ํ๋ฅญํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋ณด์์ต๋๋ค. ์์ฒญ์ด 100500๊ฐ ์์ต๋๋ค. ์๋ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์์ฒญ์ ์๋์ผ๋ก ์ ์ฐจ๋ก ์ ํํ๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค. ์๋ ์๋.
๋ ๋ฒ์งธ ์ต์ ์ด ์์ต๋๋ค. ์ง์ ๊ฐ์ ธ์์ ์๋ฅด๋ ๊ฒ์ ๋๋ค. ์์ค๋ฅผ ์ด๊ณ ์ ๋จ์ ์์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ณด๊ณ ๋ ๋ณด์์ต๋๋ค. ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค.
์ด๋ 2015๋ XNUMX์์ ๋ํ๋ฌ์ต๋๋ค. ์ด์ ๋ ํ๋์ ์ธ ๋ฒ์ ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฒ์ด ํ๋ฅญํฉ๋๋ค. ๋งค์ฐ ์ ์๋ํ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ฌด๊ฒ๋ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ PgSQL ๋ฐฉํฅ์ผ๋ก ์๊ฐํ๋ ๊ฒ์ ์ค๋จํ์ต๋๋ค. ์ฆ, ์ด๋ ๋ชจ๋ ์ค๋ฒํค๋ ๋น์ฉ์ ๊ฑฐ์ XNUMX์ผ๋ก ์ค์ด๋ ๋ฐ ์ถฉ๋ถํ์ต๋๋ค.
๋ฐ๋ผ์ ์ผํ์ฑ ์์ฒญ๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ญ๋น๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์๋ฒ ์ค๋น ๋ฌธ์ 5๋ฒ์งธ ์คํ ์ ํ์ฑํ๋ฉ๋๋ค.
๋น์ ์ ๋ฌผ์ ์ ์์ต๋๋ค โ ์ซ์๋ ์ด๋์ ์์ต๋๊น? ๋น์ ์ ๋ฌด์์ ์ป๊ณ ์๋์? ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์๋ ๊ฐ ์์ฒญ๋ง๋ค ๊ณ ์ ํ ์ซ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ซ์๋ฅผ ์ ๊ณตํ์ง ์๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ์ ์ฟผ๋ฆฌ๋ OLTP ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐ ์ฝ 20๋ฐ๋ฆฌ์ด๋ฅผ ์๋นํ์ต๋๋ค. ์คํ์๋ 0,5๋ฐ๋ฆฌ์ด, ๊ตฌ๋ฌธ ๋ถ์์๋ 20๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ ธ์ต๋๋ค. ์์ฒญ โ 10KiB์ ํ ์คํธ, 170์ค์ ๊ณํ. OLTP ์์ฒญ์ ๋๋ค. 1, 5, 10์ค์ ์์ฒญํ๋ฉฐ ๋๋ก๋ ๊ทธ ์ด์์ ์์ฒญํฉ๋๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๋ 20๋ฐ๋ฆฌ์ด๋ฅผ ์ ํ ๋ญ๋นํ๊ณ ์ถ์ง ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ 0์ผ๋ก ์ค์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ํ๋ฅญํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ฌด์์ ๊ฐ์ ธ๊ฐ ์ ์๋์? Java๊ฐ ์์ผ๋ฉด ์ต์ ๋ฒ์ ์ ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ปํ์ญ์์ค.
๋ค๋ฅธ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์๊ฐํด๋ณด์ญ์์ค. ์ด๊ฒ๋ ํ์ํ ๊น์? ์๋ฅผ ๋ค์ด PL 8 ๋๋ LibPQ๊ฐ ์๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ์ต์ข ์ธ์ด์ ๊ด์ ์์ ๋ณผ ๋ ์คํ์ด๋ ๊ตฌ๋ฌธ ๋ถ์์ด ์๋ ์๊ฐ์ ์๋นํ๊ณ ์๋ค๋ ๊ฒ์ด ๋ถ๋ช ํ์ง ์์ผ๋ฉฐ ์ด๋ ํ์ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ด๋ป๊ฒ? ๋ชจ๋ ๊ฒ์ด ๋ฌด๋ฃ์ ๋๋ค.
๊ทธ ์ธ์๋ ์ค๋ฅ์ ์ผ๋ถ ํน์ด์ฌํญ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๊ธ ๋น์ฅ ๊ทธ๋ค์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ๋๋ถ๋ถ์ ์ฐ์ ๊ณ ๊ณ ํ, ์ฐ๋ฆฌ๊ฐ ๋ฐ๊ฒฌํ ๊ฒ, ์ฐ๋ฆฌ๊ฐ ๋ฐ๊ฒฌํ ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค.
์์ฒญ์ด ๋์ ์ผ๋ก ์์ฑ๋๋ ๊ฒฝ์ฐ. ๊ทธ๋ฐ ์ผ์ด ์ผ์ด๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๋ฌธ์์ด์ ์๋ก ๋ถ์ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
๊ทธ ์ฌ๋์ ์ ๋์๊ฐ์? ๋งค๋ฒ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ๋๋๊ธฐ ๋๋ฌธ์ ์ข์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๋ค๋ฅธ ๋ฌธ์์ด์ hashCode๋ฅผ ๋ค์ ์ฝ์ด์ผ ํฉ๋๋ค. ์ด๋ ์ค์ ๋ก CPU ์์ ์ ๋๋ค. ๊ธฐ์กด ํด์์์๋ ๊ธด ์์ฒญ ํ ์คํธ๋ฅผ ์ฐพ๋ ๊ฒ์ ๊ทธ๋ฆฌ ์ฝ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฒฐ๋ก ์ ๊ฐ๋จํฉ๋๋ค. ์์ฒญ์ ์์ฑํ์ง ๋ง์ญ์์ค. ํ๋์ ๋ณ์์ ์ ์ฅํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ปํ์ญ์์ค.
๋ค์ ๋ฌธ์ . ๋ฐ์ดํฐ ์ ํ์ด ์ค์ํฉ๋๋ค. ์ด๋ค ์ข ๋ฅ์ NULL์ด ์๋์ง๋ ์ค์ํ์ง ์์ผ๋ฉฐ ์ด๋ค ์ข ๋ฅ๋ผ๋ ์กด์ฌํ๋๋ก ํ๋ ORM์ด ์์ต๋๋ค. Int๋ผ๋ฉด setInt๋ผ๊ณ ๋งํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ NULL์ธ ๊ฒฝ์ฐ ํญ์ VARCHAR๋ก ๋ก๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ตญ NULL์ด ์๋ค๋ ๊ฒ์ด ์ด๋ค ์ฐจ์ด๋ฅผ ๋ง๋ค๊น์? ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฒด๋ ๋ชจ๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ฌ์ง์ ์๋ํ์ง ์์ต๋๋ค.
์ค์ ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ ํ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ์ฒ์์ ์ด๊ฒ์ด ์ซ์๋ผ๊ณ ๋งํ๊ณ ๋ ๋ฒ์งธ์ VARCHAR์ด๋ผ๊ณ ๋งํ๋ฉด ์๋ฒ ์ค๋น ๋ฌธ์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ ์ ์ธ๋ฌธ์ ๋ค์ ์์ฑํด์ผ ํฉ๋๋ค.
๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ ์ด์ ๋ฐ์ดํฐ ์ ํ์ด ํผ๋๋์ง ์๋์ง ํ์ธํ์ธ์. NULL์ ์ฃผ์ํด์ผ ํฉ๋๋ค. ์ด๋ ReadyStatements๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ ํ์ ํํ ๋ฐ์ํ๋ ์ค๋ฅ์ ๋๋ค.
์๊ฒ ์ต๋๋ค. ์ผฐ์ต๋๋ค. ์ด์ฉ๋ฉด ๊ทธ๋ค์ด ์ด์ ์ฌ๋ฅผ ๋ฐ๋ ค๊ฐ์ ์๋ ์์ด์. ๊ทธ๋ฆฌ๊ณ ์์ฐ์ฑ๋ ๋จ์ด์ก์ต๋๋ค. ์ํฉ์ด ๋๋น ์ก์ต๋๋ค.
์ด๋ป๊ฒ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋์? ์ด๊ฒ์ ๋ฒ๊ทธ์ ๋๊น ์๋๋ฉด ๊ธฐ๋ฅ์ ๋๊น? ์ํ๊น๊ฒ๋ ์ด๊ฒ์ด ๋ฒ๊ทธ์ธ์ง ๊ธฐ๋ฅ์ธ์ง ์ดํดํ ์ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฌธ์ ๋ฅผ ์ฌํํ๊ธฐ ์ํ ๋งค์ฐ ๊ฐ๋จํ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๊ทธ๋ ๋ ์์ ํ ์๊ธฐ์น ์๊ฒ ์ฐ๋ฆฌ๋ฅผ ๋งค๋ณตํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๋ง ๊ทธ๋๋ก ํ๋์ ํ ์ด๋ธ์์ ์ํ๋งํ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๋ฌผ๋ก ์ฐ๋ฆฌ๋ ๊ทธ๋ฌํ ์์ฒญ์ ๋ ๋ง์ด ๋ฐ์์ต๋๋ค. ์์น์ ์ผ๋ก ๋์ธ ๊ฐ์ ํ ์ด๋ธ์ด ํฌํจ๋์ด ์์ง๋ง ์ด๋ฌํ ์ฌ์ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํ๋ ๋ฒ์ ์ ๊ฐ์ ธ์์ ์ฌ์ํด ๋ณด์ธ์.
์์ ์ ๋ ๊ฐ์ ์ด์ด ์๊ณ ๊ฐ ์ด์ ์ธ๋ฑ์ฑ๋๋ค๋ ๊ฒ์ ๋๋ค. ํ๋์ NULL ์ด์๋ ๋ฐฑ๋ง ๊ฐ์ ํ์ด ์์ต๋๋ค. ๋ ๋ฒ์งธ ์ด์๋ 20์ค๋ง ํฌํจ๋์ด ์์ต๋๋ค. ๋ฐ์ธ๋ฉ๋ ๋ณ์ ์์ด ์คํํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์๋ํฉ๋๋ค.
๋ฐ์ธ๋ฉ๋ ๋ณ์๋ก ์คํ์ ์์ํ๋ฉด, ์ฆ "?" ๋๋ ์์ฒญ์ ๋ํด "$1"์ ์ ๋ ฅํ๋ฉด ๊ฒฐ๊ตญ ๋ฌด์์ ๋ฐ๊ฒ ๋ฉ๋๊น?
์ฒซ ๋ฒ์งธ ์คํ์ ์์๋๋ก์ ๋๋ค. ๋ ๋ฒ์งธ๋ ์กฐ๊ธ ๋ ๋น ๋ฆ ๋๋ค. ๋ญ๊ฐ๊ฐ ์บ์๋์์ต๋๋ค. ์ ์งธ, ๋ท์งธ, ๋ค์ฏ์งธ. ๊ทธ๋ผ ์พ -๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฐ ๊ฒ. ๊ทธ๋ฆฌ๊ณ ์ต์ ์ ์ํฉ์ ์ฌ์ฏ ๋ฒ์งธ ์คํ์์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ค์ ์คํ ๊ณํ์ด ๋ฌด์์ธ์ง ์ดํดํ๋ ค๋ฉด ์ ํํ XNUMX๋ฒ์ ์คํ์ ์ํํด์ผ ํ๋ค๋ ๊ฒ์ ๋๊ฐ ์์์ต๋๊น?
๋๊ฐ ์ ์ฃ์ ๋๊น? ๋ฌด์จ ์ผ์ด์์? ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์ต์ ํ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ์ต์ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ ์์ ๋ถํฐ ๊ทธ๋ ๋ ์ผ๋ฐ ๊ณํ์ผ๋ก ์ ํํ์ง๋ง ๋ถํํ๋ ๋ค๋ฅธ ๊ฒ์ผ๋ก ํ๋ช ๋ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๊ฐ์ ์๋ ์๊ณ ๋ค๋ฅผ ์๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋์์ ์ ๋ฐํ๋ ์ผ์ข ์ ์๊ณ๊ฐ์ด ์์ต๋๋ค.
์ด์ ๋ํด ๋ฌด์์ ํ ์ ์๋์? ๋ฌผ๋ก ์ฌ๊ธฐ์๋ ์๋ฌด๊ฒ๋ ๊ฐ์ ํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๊ฐ๋จํ ์๋ฃจ์ ์ด ์์ต๋๋ค. ์ด๊ฒ์ +0, OFFSET 0์ ๋๋ค. ํ์คํ ๋น์ ์ ๊ทธ๋ฌํ ํด๊ฒฐ์ฑ ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฅ ์์ฒญ์ "+0"์ ์ถ๊ฐํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์์ ๋๋ค. ๋์ค์ ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ๋ค๋ฅธ ์ต์ ์ด ์์ต๋๋ค. ๊ณํ์ ๋ ์์ธํ ์ดํด๋ณด์ญ์์ค. ๊ฐ๋ฐ์๋ ์์ฒญ์ ์์ฑํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ "๋ถ์ ์ค๋ช "์ 6๋ฒ ๋งํด์ผ ํฉ๋๋ค. 5์ด๋ฉด ์๋ํ์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ธ ๋ฒ์งธ ์ต์ ์ด ์์ต๋๋ค. pgsql-hackers์๊ฒ ํธ์ง๋ฅผ ์ฐ๋ ๊ฒ์ ๋๋ค. ๊ธ์ ์ผ๋๋ฐ ์ด๊ฒ์ด ๋ฒ๊ทธ์ธ์ง ๊ธฐ๋ฅ์ธ์ง๋ ์์ง ํ์คํ์ง ์์ต๋๋ค.
๋ฒ๊ทธ์ธ์ง ๊ธฐ๋ฅ์ธ์ง ๊ณ ๋ฏผํ๋ ๋์ ๊ณ ์น๋๋ก ํ๊ฒ ์ต๋๋ค. ์์ฒญ์ ๋ฐ์ "+0"์ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ์ต๋๋ค. ๋ ๊ฐ์ ๊ธฐํธ๊ฐ ์์ผ๋ฉด ๊ทธ๊ฒ์ด ์ด๋ค ๊ฒ์ธ์ง, ๋ฌด์์ธ์ง ์๊ฐํ ํ์์กฐ์ฐจ ์์ต๋๋ค. ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ด ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ธ์งํ์ต๋๋ค. "+0" ์ด์๋ ์ธ๋ฑ์ค๊ฐ ์๊ณ ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ๋ชจ๋ ๊ฒ์ด ์ ์์ ๋๋ค.
์ด๊ฒ์ด 6์ ๋ฒ์น์ด๋ค. ์ด์ ํ์ฌ ๋ฒ์ ์์๋ ๋ฐ์ธ๋ฉ๋ ๋ณ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ์์ ์ 6๋ฒ ์ํํด์ผ ํฉ๋๋ค. ๋ฐ์ธ๋ฉ๋ ๋ณ์๊ฐ ์์ผ๋ฉด ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ํ๋ ์ผ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ตญ ์คํจํ๋ ๊ฒ์ ๋ฐ๋ก ์ด ์์ฒญ์ ๋๋ค. ๊น๋ค๋ก์ด ์ผ์ด ์๋๋๋ค.
์ผ๋ง๋ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๊น? ์ฌ๊ธฐ ๋ฒ๊ทธ, ์ ๊ธฐ ๋ฒ๊ทธ. ์ฌ์ค ๋ฒ๊ทธ๋ ์ด๋์๋ ์์ต๋๋ค.
์ข ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ ๊ฐ์ ์คํค๋ง๊ฐ ์์ต๋๋ค. ํ ์ด๋ธ S๊ฐ ์๋ ๊ตฌ์ฑํ A์ ํ ์ด๋ธ S๊ฐ ํฌํจ๋ ๋ค์ด์ด๊ทธ๋จ B. ์ฟผ๋ฆฌ โ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ ๋ฌด์์ ๊ฐ๊ฒ ๋ ๊น์? ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์์ ๋ชจ๋ ๊ฒ์ ๊ฐ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ท์น์ - ๋ฒ๊ทธ๋ ์ด๋์๋ ์์ผ๋ฉฐ, ์ฐ๋ฆฌ๋ ์์ ๋ชจ๋ ๊ฒ์ ๊ฐ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด์ ์ง๋ฌธ์ "์?"์ ๋๋ค. ์คํค๋ง๊ฐ ์๋ ๊ฒฝ์ฐ ํ ์ด๋ธ์ ์ฐพ์ ์์น๋ฅผ ์๋ ค์ฃผ๋ "search_path" ๋ณ์๊ฐ ์๋ค๋ ๋ฌธ์๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ณ์๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฌธ์ ๋ ๋ฌด์์ ๋๊น? ๋ฌธ์ ๋ ์๋ฒ์์ ์ค๋น๋ ๋ช ๋ น๋ฌธ์ด ๋๊ตฐ๊ฐ์ ์ํด search_path๊ฐ ๋ณ๊ฒฝ๋ ์ ์๋ค๊ณ ์์ฌํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๋ถ๋ถ์ ์๋ก์ด ์๋ฏธ๋ฅผ ์ป์ง ๋ชปํ ์๋ ์์ต๋๋ค.
๋ฌผ๋ก ์ด๋ ํ ์คํธํ๋ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ํ ์ด๋ธ์ด ์ผ๋ง๋ ์ฌ๊ฐํ๊ฒ ๋ค๋ฅธ์ง์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ฒ์ 9.1์์๋ ๋จ์ํ ์ด์ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค. ์ ๋ฒ์ ์์๋ ๋ฒ๊ทธ๋ฅผ ์ก์์ ๋ฒ๊ทธ๊ฐ ์์์ ์๋ ค์ค ์ ์์ต๋๋ค.
์ด๋ป๊ฒ ์น๋ฃํ๋์? ๊ฐ๋จํ ์กฐ๋ฆฌ๋ฒ์ด ์์ต๋๋ค. ํ์ง ๋ง์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ๋์ search_path๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค. ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ ์ ์ฐ๊ฒฐ์ ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ ๋ก (์: ์ด๊ธฐ, ํ ๋ก , ์ถ๊ฐ)ํ ์ ์์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ๋ค์๊ณผ ๊ฐ์ด ์๋ ค์ผ ํ๋ค๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ๋ฐ์์๊ฒ ์ค๋ํ ์ ์์ ๊ฒ์ ๋๋ค. โ๋ณด์ธ์. ์ฌ๊ธฐ์์ ๊ทํ์ ๊ฐ์ด ์ ๋ฐ์ดํธ๋์์ต๋๋ค. ์ด์ฉ๋ฉด ๋ฌธ์ ์ฌ์ค์ ํ๊ณ ๋ค์ ๋ง๋ค์ด์ผ ํ ๊น์?โ ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋น๋ฐ๋ฆฌ์ ์๋ํ๋ฉฐ ๋ด๋ถ ์ด๋๊ฐ์์ ๋ช ๋ น๋ฌธ์ด ๋ณ๊ฒฝ๋์์์ ์ด๋ค ์์ผ๋ก๋ ๋ณด๊ณ ํ์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ํ ๋ฒ ๊ฐ์กฐํ๊ฒ ์ต๋๋ค. ์ด๋ Java์์๋ ์ผ๋ฐ์ ์ด์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ PL/pgSQL์์๋ ๋์ผํ ๋ด์ฉ์ ์ผ๋์ผ๋ก ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๊ฑฐ๊ธฐ์์ ์ฌํ๋ ๊ฒ์ ๋๋ค.
์ข ๋ ๋ง์ ๋ฐ์ดํฐ ์ ํ์ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ ํํ๊ณ ์ ํํฉ๋๋ค. ๋ฐฑ๋ง ๊ฐ์ ํ์ด ์๋ ํ ์ด๋ธ์ด ์์ต๋๋ค. ๊ฐ ์ค์ 128ํฌ๋ก๋ฐ์ดํธ์ ๋๋ค. ์ฝ XNUMXGB์ ๋ฐ์ดํฐ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ Java ์์คํ ์๋ XNUMXMB์ ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ชจ๋ ์ฑ ์์ ๊ถ์ฅํ๋ ๋๋ก ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฆ, resultSet์ ์ด๊ณ ๊ฑฐ๊ธฐ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐ๊ธ์ฉ ์ฝ์ด์ต๋๋ค. ์๋ํ ๊น์? ๊ธฐ์ต์์ ์ฌ๋ผ์ง๊น? ์ข ์ฝ์ด์ค๋? ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฏฟ์ผ์ธ์. Postgres๋ฅผ ๋ฏฟ์ผ์ธ์. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ฏฟ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ OFMemory์์ ๋จ์ด์ง๊น์? OutOfMemory๋ฅผ ๊ฒฝํํ ์ฌ๋์ ๋๊ตฌ์ ๋๊น? ๊ทธ ํ์๋ ๋๊ฐ ๊ณ ์ณค๋์? ๋๊ตฐ๊ฐ๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
๋ฐฑ๋ง ๊ฐ์ ํ์ด ์๋ค๋ฉด ๊ทธ๋ฅ ๊ณจ๋ผ์ ์ ํํ ์๋ ์์ต๋๋ค. OFFSET/LIMIT๊ฐ ํ์ํฉ๋๋ค. ์ด ์ต์ ์ ์ ํํ๋ ์ฌ๋์ ๋๊ตฌ์ ๋๊น? ๊ทธ๋ฆฌ๊ณ autoCommit์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํ๋ ์ฌ๋์ ๋๊ตฌ์ ๋๊น?
ํ์์ ๊ฐ์ด ์ฌ๊ธฐ์๋ ๊ฐ์ฅ ์์์น ๋ชปํ ์ต์ ์ด ์ฌ๋ฐ๋ฅธ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์๊ธฐ autoCommit์ ๋๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ ๊ทธ๋ฐ ๊ฒ๋๊น? ๊ณผํ์ ์ด๊ฒ์ ๋ํด ๋ชจ๋ฆ ๋๋ค.
๊ทธ๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Postgres ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ์ด์ ๊ด๋ จํ์ฌ PgJDBC๋ ์์ธ๋ ์๋๋ฉฐ ๋ชจ๋ ํ์ ์ ํํฉ๋๋ค.
FetchSize ํ ๋ง์๋ ๋ณํ์ด ์์ต๋๋ค. ์ฆ, ๋ณ๋์ ๋ช ๋ น๋ฌธ ์์ค์์ ์ฌ๊ธฐ์์ ๋ฐ์ดํฐ๋ฅผ 10, 50์ผ๋ก ์ ํํ๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ autoCommit์ ๋ ๋๊น์ง ์๋ํ์ง ์์ต๋๋ค. autoCommit์ ๋๋ฉด ์๋์ด ์์๋ฉ๋๋ค.
ํ์ง๋ง ์ฝ๋๋ฅผ ์ดํด๋ณด๊ณ ์ด๋์๋ setFetchSize๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋ถํธํฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฒด ์ฐ๊ฒฐ์ ๋ํ ๊ธฐ๋ณธ๊ฐ์ ๋ํ๋ด๋ ์ค์ ์ ๋ง๋ค์์ต๋๋ค.
๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๋งํ ๊ฒ์ ๋๋ค. ๋งค๊ฐ๋ณ์๊ฐ ๊ตฌ์ฑ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๋ฌด์์ ์ป์์ต๋๊น? ์๋ฅผ ๋ค์ด ํ ๋ฒ์ 10๊ฐ์ ํ์ ์ ํํ๋ ๋ฑ ์๋์ ์ ํํ๋ฉด ๊ฐ์ ๋น๊ฐ ๋งค์ฐ ์ปค์ง๋๋ค. ๋ฐ๋ผ์ ์ด ๊ฐ์ ์ฝ XNUMX์ผ๋ก ์ค์ ๋์ด์ผ ํฉ๋๋ค.
๋ฌผ๋ก ์ด์์ ์ผ๋ก๋ ๋ฐ์ดํธ ๋จ์๋ก ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์์ผ ํ์ง๋ง ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. defaultRowFetchSize๋ฅผ XNUMX ์ด์์ผ๋ก ์ค์ ํ๊ณ ๋ง์กฑํ์ธ์.
๋ฐ์ดํฐ ์ฝ์ ์ผ๋ก ๋์ด ๊ฐ์๋ค. ์ฝ์ ์ด ๋ ์ฝ๊ณ ๋ค์ํ ์ต์ ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด INSERT, VALUES์ ๋๋ค. ์ด๊ฒ์ ์ข์ ์ ํ์ ๋๋ค. "INSERT SELECT"๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ์ค์ ๋ก๋ ๋๊ฐ์ต๋๋ค. ์ฑ๋ฅ์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
์ฑ ์์๋ Batch ๋ฌธ์ ์คํํด์ผ ํ๋ค๊ณ ๋งํ๊ณ , ์ฑ ์์๋ ์ฌ๋ฌ ๊ฐ์ ๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ณต์กํ ๋ช ๋ น์ ์คํํ ์ ์๋ค๊ณ ๋งํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Postgres์๋ ๋๋ผ์ด ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ฆ, COPY๋ฅผ ๋ ๋น ๋ฅด๊ฒ ์ํํ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ธก์ ํ๋ฉด ๋ค์ ํฅ๋ฏธ๋ก์ด ๋ฐ๊ฒฌ์ ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๊ธฐ๋ฅผ ์ํฉ๋๊น? ์ฐ๋ฆฌ๋ ๋ถํ์ํ ๋ช ๋ น์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ฑฐ๋ ์คํํ์ง ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์ค์ ๋ก TCP๋ ์ด๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ ์ค์ด๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์๋ต์ ๋ณด๋ด๋ ค๊ณ ์๋ํ ๋ ์์ฒญ์ ์ฝ์ง ์์ต๋๋ค. ์ต์ข ๊ฒฐ๊ณผ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ฒญ์ ์ฝ์ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ต์ ์ฝ์ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ๋ ์ฃผ๊ธฐ์ ์ผ๋ก ๋๊ธฐํ ํจํท์ ๋ณด๋ด์ผ ํฉ๋๋ค. ์ถ๊ฐ ๋คํธ์ํฌ ์ํธ ์์ฉ, ์ถ๊ฐ ์๊ฐ ๋ญ๋น.
๊ทธ๋ฆฌ๊ณ ๋ ๋ง์ด ์ถ๊ฐํ ์๋ก ์ํฉ์ ๋์ฑ ์ ํ๋ฉ๋๋ค. ๋๋ผ์ด๋ฒ๋ ๋งค์ฐ ๋น๊ด์ ์ด๋ฉฐ ๋ผ์ธ ํฌ๊ธฐ ๋ฑ์ ๋ฐ๋ผ ์ฝ 200๋ผ์ธ๋ง๋ค ํ ๋ฒ์ฉ ์ถ๊ฐํฉ๋๋ค.
ํ ์ค๋ง ์์ ํ๋ฉด ๋ชจ๋ ์์ ์๋๊ฐ 10๋ฐฐ ๋นจ๋ผ์ง๋๋ค. ๊ทธ๋ฐ ์ผ์ด ์ผ์ด๋๋ค. ์? ๋ ๊ทธ๋ ๋ฏ์ด ์ด์ ๊ฐ์ ์์๋ ์ด๋ฏธ ์ด๋๊ฐ์์ ์ฌ์ฉ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ "128"์ ์ผ๊ด ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ์๋ฏธ์ ๋๋ค.
์ ์ ๋ฒ์ ์๋ ํฌํจ๋์ง ์์ ๊ฒ์ด ๋คํ์ ๋๋ค. ์ถ์๊ฐ ์์๋๊ธฐ ์ ์ ๋ฐ๊ฒฌ๋์์ต๋๋ค. ๋ด๊ฐ ์ ๊ณตํ๋ ๋ชจ๋ ์๋ฏธ๋ ํ๋ ๋ฒ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
ํ๋ฒ ์ ์ด๋ณด์. InsertBatch๋ฅผ ๊ฐ๋จํ๊ฒ ์ธก์ ํฉ๋๋ค. InsertBatch๋ฅผ ์ฌ๋ฌ ๋ฒ ์ธก์ ํฉ๋๋ค. ์ฆ, ๋์ผํ ๊ฒ์ด์ง๋ง ๊ฐ์ด ๋ง์ต๋๋ค. ๊น๋ค๋ก์ด ์์ง์. ๋ชจ๋ ์ฌ๋์ด ์ด๊ฒ์ ํ ์ ์๋ ๊ฒ์ ์๋์ง๋ง ๋งค์ฐ ๊ฐ๋จํ ๋์์ด๊ณ COPY๋ณด๋ค ํจ์ฌ ์ฝ์ต๋๋ค.
COPY๋ฅผ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ตฌ์กฐ๋ฌผ์์๋ ์ด ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ๊ธฐ๋ณธ ์ ํ์ ์ ์ธํ๊ณ ๋ฐฐ์ด๊ณผ INSERT๋ฅผ ํ ์ด๋ธ์ ์ง์ ์ ๋ฌํฉ๋๋ค.
pgjdbc/ubenchmsrk/InsertBatch.java ๋งํฌ๋ฅผ ์ด๋ฉด ์ด ์ฝ๋๋ GitHub์ ์์ต๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ์์ฒญ์ด ์์ฑ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ค์ํ์ง ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ถ์ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ๋จผ์ ๊นจ๋ฌ์ ๊ฒ์ ๋ฐฐ์น๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ ์ผ๊ด ์ฒ๋ฆฌ ์ต์ ์ XNUMX์ ๋๋ค. ์ฆ, ์ผํ์ฑ ์คํ์ ๋นํด ์คํ ์๊ฐ์ด ์ฌ์ค์ XNUMX์ ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํฉ๋๋ค. ์์ฃผ ๊ฐ๋จํ ํ์ ๋๋ค. ์ธ ๊ฐ์ ์ด์ ๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ๋ฌด์์ ๋ณผ ์ ์์ต๋๊น? ์ฐ๋ฆฌ๋ ์ด ์ธ ๊ฐ์ง ์ต์ ์ด ๋ชจ๋ ๋๋ต ๋น์ทํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ฌผ๋ก COPY๊ฐ ๋ ์ข์ต๋๋ค.
์ด๋ ์กฐ๊ฐ์ ์ฝ์ ํฉ๋๋ค. VALUES ๊ฐ 10๊ฐ, VALUES ๊ฐ 1๊ฐ, VALUES ๊ฐ 2๊ฐ๋ฅผ ๋งํ๊ฑฐ๋ ๊ทธ ์ค 4๊ฐ๋ฅผ ์ผํ๋ก ๊ตฌ๋ถํ์ฌ ํ์ํ์ต๋๋ค. ์ด์ ์ํ์ด ๋์์ต๋๋ค. 128, XNUMX, XNUMX, XNUMX. ํ๋์์ผ๋ก ๊ทธ๋ ค์ง Batch Insert๋ฅผ ๋ณด๋ฉด ๊ธฐ๋ถ์ด ํจ์ฌ ์ข์์ง๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ฆ, ํ ๋ฒ์ ํ๋์ฉ ์ฝ์ ํ๊ฑฐ๋ ํ ๋ฒ์ XNUMX๊ฐ๋ฅผ ์ฝ์ ํด๋ VALUES์ ์กฐ๊ธ ๋ ๋ฃ์๊ธฐ ๋๋ฌธ์ ๋ ๋ฐฐ๋ก ์ข์์ง๋ ๊ฒ์ ๋๋ค. EXECUTE ์์ ์ด ์ ์ต๋๋ค.
์๊ท๋ชจ ๋ณผ๋ฅจ์์ COPY๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ์ ๋งํฉ๋๋ค. ์ฒ์ ๋ ๊ฐ๋ ๊ทธ๋ฆฌ์ง๋ ์์์ด์. ๊ทธ๋ค์ ์ฒ๊ตญ์ ๊ฐ๋๋ค. ์ฆ, COPY๋ฅผ ์ํ ๋ น์ ์ซ์์ ๋๋ค.
COPY๋ ๋ฐ์ดํฐ ํ์ด XNUMX๊ฐ ์ด์์ผ ๋ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด ์ฐ๊ฒฐ์ ์ฌ๋ ์ค๋ฒํค๋๊ฐ ํฝ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์งํ ๋งํด์ ์ ๋ ์ด ๋ฐฉํฅ์ผ๋ก ํ๊ณ ๋ค์ง ์์์ต๋๋ค. Batch๋ฅผ ์ต์ ํํ์ง๋ง COPY๋ ์ต์ ํํ์ง ์์์ต๋๋ค.
๋ค์์๋ ๋ฌด์์ ํด์ผ ํ ๊น์? ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์๋ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ์๋ฏธ๋ฅผ ๊ฒฐํฉํ ๊ตฌ์กฐ๋ ์๋ฆฌํ ๋ฐํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค.
์ค๋ ๋ณด๊ณ ์์์ ๋ฌด์์ ๋นผ๋ด์ผ ํ ๊น์?
- ReadyStatement๋ ์ฐ๋ฆฌ์ ์ ๋ถ์ ๋๋ค. ์ด๋ ์์ฐ์ฑ์ ๋ง์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ์ฐ๊ณ ์ ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์๊น๋๋ค.
- ๊ทธ๋ฆฌ๊ณ EXPLAIN ANALYZE๋ฅผ 6๋ฒ ํด์ผ ํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ๊ฐ ์๋ ์ฟผ๋ฆฌ์ ๋๋จธ์ง ๋น์จ์ ์์ ํ๋ ค๋ฉด OFFSET 0๊ณผ +0๊ณผ ๊ฐ์ ํธ๋ฆญ์ ํฌ์ํด์ผ ํฉ๋๋ค.
์ถ์ฒ : habr.com