๊ตฌ๊ธ ํด๋ผ์ฐ๋ ๋น ์ฟผ๋ฆฌ(BigQuery)๋ 1998๋ ๊ตฌ๊ธ ์ค๋ฆฝ ์ดํ๋ก ๊ตฌ๊ธ ๋ด๋ถ์์ ์ฐ๊ตฌ๊ฐ๋ฐ๋ ๋ชจ๋ ๊ธฐ์ ์ด ์ง์ฝ๋์ด ์๋ ๋งค์ฐ ๊ณ ๋ํ๋ ํ๋ก๋ํธ๋ผ๊ณ ๋งํ ์๊ฐ ์์ต๋๋ค. ๋น ์ฟผ๋ฆฌ๋ ์๋์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์คํ ๋ฆฌ์ง์ ์ปดํจํ ๋ ธ๋๋ฅผ ์์ ํ ๋ถ๋ฆฌํ๊ณ , ๊ฐ๊ฐ์ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅํ ์ ์ํคํ ์ฒ๋ฅผ ๊ฐ๊ณ ์๋ ํํ๋ฐ์ดํธ ์ค์ผ์ผ ์๋ฒ๋ฆฌ์ค ๋ฐ์ดํฐ์จ์ดํ์ฐ์ค(Petabyte Scale Serverless Data Warehouse) ์ ๋๋ค.
-
Dremel(๋ถ์ฐ SQL ์คํ ์์ง): SQL ์ฟผ๋ฆฌ๋ฅผ ์คํ ํธ๋ฆฌ๋ก ๋ณํํ์ฌ ์๋ง๋์ ์ปดํจํ ๋ ธ๋์์ ๋ถ์ฐ์ฒ๋ฆฌ
-
Colossus(๋ถ์ฐ ์คํ ๋ฆฌ์ง ์์คํ ): ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ๋ณต์ ๋ฐ ๊ด๋ฆฌ ๊ฐ๋ฅํ ํํ๋ฐ์ดํธ๊ธ ์คํ ๋ฆฌ์ง, ๋น ์ฟผ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ Colossus ํ๊ฒฝ์ ์ปฌ๋ผ ๊ธฐ๋ฐํํ๋ก ์ ์ฅ(Columnar Storage)ํ์ฌ ํจ์จ์ฑ๊ณผ ์ค์บ ์ฑ๋ฅ์ ๊ทน๋ํ
-
Borg(ํด๋ฌ์คํฐ ๊ด๋ฆฌ ์์คํ ): ์ฟ ๋ฒ๋คํฐ์ค(k8s)์ ๋ชจํ(ๆฏ่)๋ก ์๋ง๋์ ํด๋ฌ์คํฐ ์ปดํจํ ์์์ ํ ๋นํ๊ณ ๊ด๋ฆฌํ๋ ์์คํ , ์ฟผ๋ฆฌ ์คํ์ ํ์ํ ์์(CPU, ๋ฉ๋ชจ๋ฆฌ ๋ฑ)์ ํ์ํ ์๊ฐ์ ํ์ํ ๋งํผ ํ ๋น
-
Jupiter(์ด๊ณ ์ ์ํํธ์จ์ด ์ ์ ๋คํธ์ํน): 13.1ํํ๋นํธ/์ด(Petabit/sec)์ ๋์ญํญ์ ์ ๊ณตํ๋ ๊ธฐ์ ๋ก์จ, Dremel ์์ง์ ๊ฐ๋ ธ๋(slots)๊ฐ ๋ฐ์ดํฐ ์ ํ๋ง(shuffling)๊ณผ ๊ฐ์ ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋คํธ์ํฌ ๋ณ๋ชฉํ์ ์ต์ํ
์ด๋ฒ์ ์๊ฐํ Advanced Runtime์ ๋น ์ฟผ๋ฆฌ์ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์ ํฅ์์ํค๋ ๊ธฐ๋ฅ์ ์งํฉ์ฒด์ ๋๋ค. ํนํ ์ฌ์ฉ์๊ฐ ๊ธฐ์กด ๋ฐ์ดํฐ์ ๋ํ ์คํค๋ง๋ ์ฟผ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์ ํ ์์ผ๋ฉฐ, ๋น ์ฟผ๋ฆฌ๊ฐ ์๋์ผ๋ก ์ ๊ฒฉํ ์ฟผ๋ฆฌ์ ์ ์ฉํ์ฌ์ ์ฑ๋ฅ์ ๊ฐ์ํ ํ ์๊ฐ ์์ต๋๋ค. ํด๋น ๊ธฐ๋ฅ์ ํฌ๊ฒ Enhanced Vectorization, Short Query Optimization ์ผ๋ก ๋๋์ด ์ง๋๋ค.
- Enhanced Vectorization : ๋ฒกํฐํ๋ ๋ฐํ์์ ํตํ์ฌ ์กฐ์ธ(Join)๊ณผ ์ด๊ทธ๋ฆฌ๊ฒ์ด์ (Aggregation) ์ต์ ํ
- Short Query Optimization: ์ ํ ๋ฐ ๋ถ์ฐ ์ฒ๋ฆฌ์ ๋ํ ์ค๋ฒํค๋๋ฅผ ์ค์ฌ์ ์์ฟผ๋ฆฌ(Short Query) ์ต์ ํ
๋ฒกํฐํ(Vectorization)๋ ๊ณผ๊ฑฐ์ CPU๊ฐ ํ๋ฒ์ ํ๋์ ๋ฐ์ดํฐ๋ง ์ฒ๋ฆฌํ๋ ์ค์นผ๋ผ(Scalar) ๋ฐฉ์์ด ์๋, SIMD(Single Instruction Multiple Data) ๊ธฐ์ ์ ํตํ์ฌ ํ๋ฒ์ ๋ช ๋ น์ด๋ก ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ์์ ๋งํฉ๋๋ค.
์ค์นผ๋ผ ๋ฐฉ์์ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ๋ ํ๋จ์(row-by-row
)๋ฐฉ์์ผ๋ก ์ฟผ๋ฆฌ ์์ง์ด ํ๋์ ํ(row
)์ ์ฝ๊ณ , ํด๋น ํ(row
)์ ์ฐ์ฐ์ ๋ง์นํ ๋ค์ ํ(row)์ผ๋ก ๋์ด๊ฐ๋ ๊ตฌ์กฐ๋ก์, ๋ฐ์ดํฐ์ ์์ด ๋ง์์ง์๋ก ํจ์จ์ด ๋งค์ฐ ๋จ์ด์ง๋๋ค.
๋ฐ๋ฉด, ๋ฒกํฐํ๋ ์ฌ๋ฌ ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ด์ ๋ฒกํฐ(Vector)ํํ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋๋ค. ํ๋ฒ์ ๋ฌถ์ธ ๋ฒกํฐ ๋ฐ์ดํฐ์ ๋ํ์ฌ ์ฟผ๋ฆฌ ์์ง์์ ์ฐ์ฐ์ ์ํํ๋ฏ๋ก, ๋น ์ฟผ๋ฆฌ์ ๋ฒกํฐํ๋ ์ฟผ๋ฆฌ ์คํ(Vectorized a query execution)์ CPU ์บ์ ํฌ๊ธฐ์ ๋ธ๋ก ๋จ์๋ก ์ปฌ๋ผํ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์ฒ๋ฆฌ(SIMD(Single Instruction Multiple Data)ํ์ฌ ํจ์จ์ ๋์ด๋ ๋ฐฉ์์ ๋๋ค.
์ฌ๊ธฐ์ ์ถ๊ฐ๋ก, ๋ฐ์ดํฐ ์ธ์ฝ๋ฉ ์ต์ ํ(Data-encoding-enabled optimizations), ํํ์ ํด๋ฉ(Expression Folding), ๊ณตํต ํ์ ํํ์ ์ ๊ฑฐ(Common Subexpression Elimination), ๋ณ๋ ฌํ ๊ฐ๋ฅํ ์กฐ์ธ ๋ฐ ์ง๊ณ ์๊ณ ๋ฆฌ์ฆ(Parallelizable join and aggregation algorithms) ๋ฑ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ถ๊ฐํ์ฌ ์ฟผ๋ฆฌ์ฒ๋ฆฌ์ ๋ฒกํฐํ(Vectorization)๋ฅผ ์ ์ฉํ์์ต๋๋ค.
- ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ์ ๋ํ ์ง์ ์ฒ๋ฆฌ: ๋ฐฑ๋ง๊ฐ์ ํ์ ๋จ 3๊ฐ์ ๊ณ ์ ๊ฐ(
sedan, wagon, suv
)๋ง ์กด์ฌํ๋ ์ปฌ๋ผ์ด ์๋ค๋ฉด, ๋์ ๋๋ฆฌ ์ธ์ฝ๋ฉ์ ํตํ์ฌ 3๊ฐ๊ฐ๋ง ์ ์ฅํ๊ณ , ๊ฐ ํ์๋ ์์ ์ ์ ID(0, 1, 2)๋ง ํ ๋นํ์ฌ ๋ฐ์ดํฐ ์ ์ฅ ์ฉ๋ ์ ๊ฐ ํจ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ํ, ํฅ์๋ ๋ฒกํฐํ(Enhanced Vectorization)๋ ํด๋น ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ง(๋์ฝ๋ฉ) ์๊ณ ์ง์ ์ฒ๋ฆฌํ์ฌ ์ค๋ณต ๊ณ์ฐ์ ์์ฒ์ ์ผ๋ก ์ ๊ฑฐํ๊ณ , ์ฟผ๋ฆฌ ์ฒ๋ฆฌ์ ํ์ํ ๋ฐ์ดํฐ ์ฉ๋์ด ์ค๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๊ทน์ ์ผ๋ก ํฅ์ ์ํฌ์๊ฐ ์์ต๋๋ค.
-
ํํ์ ํด๋ฉ(Expression Folding): ํํ์ ํด๋ฉ์ ์ฟผ๋ฆฌ ์คํ ์์ ์ ๊ณ์ฐํ ํ์ ์์ด, ๊ณํ(plan) ๋จ๊ณ์์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํ ์ ์๋ ํํ์์ ์์๊ฐ์ผ๋ก ๋์ฒดํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ๋น ์ฟผ๋ฆฌ๋ ๊ณํ๋จ๊ณ์์ ์ฟผ๋ฆฌ๋ฅผ ๋ถ์ํ์ฌ ๊ฒฐ๊ณผ๊ฐ ํญ์ ๋์ผํ ํํ์์ ์ฐพ์๋ด๊ณ ์ด๋ฅผ ์์๊ฐ์ผ๋ก ์ ์ด์(fold) ์ฟผ๋ฆฌ ์์ฒด๋ฅผ ๋จ์ํ ํฉ๋๋ค. ์๋ ์ฟผ๋ฆฌ์์
sales_price
์1.1
์ ๊ณฑํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ์ ๋ค์1.05
๋ฅผ ๊ณฑํ๋ ๋๋ฒ์ ์ฐ์ฐ์ด ์๋ค๋ฉด, ํํ์ ํด๋ฉ์ ์ ์ฉํ์ฌ1.1 * 1.05
๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํ์ฌ1.155
๋ผ๋ ์์๋ฅผ ๋ฏธ๋ฆฌ ์ป์ด์, ํฅํsales_price * 1.55
๋จ์ผ ์ฐ์ฐ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค. ์ด์ฒ๋ผ ํํ์ ํด๋ฉ์ ์ฟผ๋ฆฌ ๊ณํ ๋จ๊ณ์์ ์์๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํ์ฌ ์คํ ์์ ์ ํ์ํ ์ฐ์ฐ์ ์์ ์ค์ฌ ์ฟผ๋ฆฌ์ ์คํ ์๋๋ฅผ ํฅ์์ํค๊ณ , ๋น ์ฟผ๋ฆฌ ์ฌ๋กฏ ์์์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ ํ๊ฒ ๋ฉ๋๋ค.## Expression Folding example SELECT (sale_price * 1.1) * 1.05 AS final_price FROM `sales_data`;
-
๊ณตํต ํ์ ํํ์ ์ ๊ฑฐ(Common Subexpression Elimination): ๊ณตํต ํ์ ํํ์ ์ ๊ฑฐ๋ ์ฟผ๋ฆฌ ์คํ์ ์ฌ๋ฌ๊ณณ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋์ผํ ํํ์(Common Subexpression)์ ํ๋ฒ๋ง ๊ณ์ฐํ๋๋ก ํ๋ ์ต์ ํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ์๋ ์ฟผ๋ฆฌ์์
sale_price + tax_amount
๋ผ๋ ํํ์์ดsubtotal
๊ณผdiscounted_subtotal
๋๊ณณ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ๊ณตํต ํ์ ํํ์ ์ ๊ฑฐ๋ฅผ ์ ์ฉํ๋ฉดsales_price + tax_amount
๋ฅผ ํ๋ฒ๋ง ๊ณ์ฐํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์์ ๋ณ์๋ ๋ ์ง์คํฐ์ ์ ์ฅํ๊ณ , ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผsubtotal
๊ณผdiscounted_subtotal
๊ณ์ฐ์ ์ฌ์ฌ์ฉ(์ํ์ โ์นํโ์ ์๊ฐํ์๋ฉด ํธํฉ๋๋ค =p)ํฉ๋๋ค. ํด๋น ๊ธฐ์ ์ ๋ณต์กํ ํจ์ ํธ์ถ์ด๋ ์ฐ์ฐ์ด ๋ง์ ์ฟผ๋ฆฌ์์ ๋น์ ๋ฐํฉ๋๋ค. ๋์ผํ ๊ณ์ฐ์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ์ฟผ๋ฆฌ ์คํ ์๊ฐ์ ๋จ์ถ์ํค๊ณ , ๋ถํ์ํ ์ฐ์ฐ ๋ญ๋น๋ฅผ ์์ ์ค๋๋ค.## Common Subexpression Elimination example SELECT (sale_price + tax_amount) AS subtotal, (sale_price + tax_amount) * discount_rate AS discounted_subtotal FROM `sales_data`;
-
๋ณ๋ ฌํ ๊ฐ๋ฅํ ์กฐ์ธ ๋ฐ ์ง๊ณ ์๊ณ ๋ฆฌ์ฆ(Parallelizable join and aggregation algorithms): ์กฐ์ธ์ ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ์ ํน์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๊ฒฐํฉํ๋ ์ฐ์ฐ์ ๋๋ค. ํด์ ์กฐ์ธ(Hash Join)์ ๊ฒฝ์ฐ์๋ ๋น๋ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ํด์ ํ ์ด๋ธ๋ก ๋ง๋ค๊ณ , ํ๋ก๋ธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ฉฐ ํด์ ํ ์ด๋ธ์ ๊ฒ์ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ๋ณ๋ ฌํ ๊ฐ๋ฅํ ์กฐ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฌํ ๊ณผ์ ์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ํํ๋๋ก ๋ง๋ญ๋๋ค. ์ง๊ณ๋
SUM, COUNT, AVG
์ ๊ฐ์ด ์ฌ๋ฌ ํ์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃน๋ณ๋ก ์์ฝํ๋ ์ฐ์ฐ์ด๋ฉฐ, ๋ณ๋ ฌํ ๊ฐ๋ฅํ ์ง๊ณ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฌํ ์ง๊ณ ๊ณผ์ ์ ๋ก์ปฌ ์ง๊ณ(Local Aggregation)์์ ํ ์ด๋ธ์ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋ ์ ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋์์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ณ์ฐ(๋ณ๋ ฌ ์ฒ๋ฆฌ)ํ๊ณ , ์ดํ ์ ์ญ ์ง๊ณ(Global Aggregation)์์ ๋ก์ปฌ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ฐํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ญ๋๋ค. ์ด๋ฐฉ์์ ํตํด์ ๊ฐ ์ค๋ ๋๊ฐ ์์ ์ด ๋งก์ ๋ก์ปฌ ์ง๊ณ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๋ง์ง๋ง์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ์ ์ ์ฒด๋ฅผ ์ง๊ณ ํ๋ฏ๋ก ์ฐ์ฐ ์๋๊ฐ ๋งค์ฐ ๋นจ๋ผ์ง๋๋ค.๊ฒฐ๋ก ์ ์ผ๋ก, Dremel ์์ง์ ๋ฆฌํ ๋ ธ๋(Leaf Nodes)์์ ๋ค์ค ์ค๋ ๋(Multi Threads)๋ฅผ ํ์ฉํ์ฌ, ์กฐ์ธ ํด์ ํ ์ด๋ธ ๋น๋ ๋ฐ ํ๋ก๋ธ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๊ณ , ์ง๊ณ ์์๋ ๋ก์ปฌ ๋ฐ ์ ์ญ ์ง๊ณ๋ฅผ ๋ณ๋ ฌ๋ก ์ํํ์ฌ, ์ฟผ๋ฆฌ ์คํ ์๋๊ฐ ํฌ๊ฒ ํฅ์ ๋๋ฉฐ, ๋์ฉ๋ ๋ฐ์ดํฐ ๋ถ์ ์์ ์ ํจ์จ์ฑ์ ๊ทน๋ํํ ์๊ฐ ์์ต๋๋ค.
์งง์ ์ฟผ๋ฆฌ ์ต์ ํ(Short Query Optimization)๋ ๋์๋ณด๋์ ๊ฐ์ BI(Business Intelligence) ๋๊ตฌ์์ ์์ฑ๋๋ ์งง๊ณ ๋น๋ฒํ๊ฒ ์คํ๋๋ ์ฟผ๋ฆฌ๋ค์ ๊ทน์ ์ผ๋ก ๊ฐ์ํํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋น
์ฟผ๋ฆฌ๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ๋จ๊ณ(stage
)๋ก ๋๋์ด ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ ํฉ๋๋ค. ํ์ง๋ง, ์งง๊ณ ๋น๋ฒํ๊ฒ ์คํ๋๋ ์ฟผ๋ฆฌ๋ ์ด๋ฌํ ๋ค๋จ๊ณ ๋ถ์ฐ ์ฒ๋ฆฌ ๋ฐฉ์์ ๊ฑด๋ ๋ฐ๊ณ , ๋จ์ผ์ ํจ์จ์ ์ธ ๋จ๊ณ(single stage
)๋ก ํตํฉํ์ฌ ์คํํฉ๋๋ค. ์ด๋ฅผ ํตํ์ฌ, ๋ฐ์ดํฐ ์
ํ๋ง ๋ฐ ๋ถ์ฐ์ฒ๋ฆฌ ์ค๋ฒํค๋๋ฅผ ์ค์ฌ ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์ ํฌ๊ฒ ๋์ผ ์ ์์ต๋๋ค. ๋ค๋ง, ์งง์ ์ฟผ๋ฆฌ ์ต์ ํ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ ์
ํ(shuffle)์ด ์์ ์ผ์ด๋์ง ์๋ ๊ฒ์ ์๋๋๋ค. ์
ํ์ ์ฌ์ ํ ํ์ํ ์ ์์ง๋ง, ์ต์ ํ๋ฅผ ํตํด ๊ทธ ์๊ณผ ํ์๊ฐ ํฌ๊ฒ ๊ฐ์ํ์ฌ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ด ํฅ์ ๋๋ ๊ฒ์
๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ์งง์ ์ฟผ๋ฆฌ ์ต์ ํ ๊ธฐ๋ฅ์ ๋น ์ฟผ๋ฆฌ์์ ๋ค๋จ๊ณ๋ก ๋ถ์ฐ ์ฒ๋ฆฌ๋๋ ๊ธฐ์กด ๋ฐฉ์์ ์ค๋ฒํค๋๋ฅผ ์ค์ฌ ์งง์ ์ฟผ๋ฆฌ์ ์๋ต ์๊ฐ์ ํ๊ธฐ์ ์ผ๋ก ๊ฐ์ ํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ํ์ง๋ง ์ด๋ ์ ํ์ ์์ ํ ์ ๊ฑฐํ๋ ๊ฒ์ด ์๋๋ผ, ํ์ํ ์ ํ ์์ ์ ํจ์จ์ ์ผ๋ก ์ต์ํํ์ฌ ์ ๋ฐ์ ์ธ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ๋ชฉ์ ์ด ์์ต๋๋ค.
๋น ์ฟผ๋ฆฌ๋ฅผ ์๋์ ์์๋ค์ ์ข ํฉ์ ์ผ๋ก ๊ณ ๋ คํ์ฌ, Short Query Optimization ์ ์ ์ฉํ ์ง์ ๋ํ์ฌ ์๋์ผ๋ก ๊ฒฐ์ ํฉ๋๋ค.
- ์์ ๋ฐ์ดํฐ ์ค์บ์ฉ๋(The estimated amount of data to be read)
- ํํฐ์ ๋ฐ์ดํฐ ๊ฐ์ ํจ์จ์ฑ(How effectively the filters are reducing the data size)
- ๋ฐ์ดํฐ์ ๋ฌผ๋ฆฌ์ ์ ์ฅ ๋ฐฉ์ ๋ฐ ์ ํ(The type and physical arrangement of the data in storage)
- ์ ์ฒด์ ์ธ ์ฟผ๋ฆฌ ๊ตฌ์กฐ(The overall query structure)
- ๊ณผ๊ฑฐ ์ฟผ๋ฆฌ ์คํ ํต๊ณ(The runtime statistics of pas query executions)
ํธ์ฆ์จ ํํ ๋ฆฌ์ผ์ ํตํ์ฌ ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ํ๋ก์ ํธ ๋ ๋ฒจ์์ Advanced Runtime ๊ธฐ๋ฅ์ enable
์ํค๊ณ , ์ํ ์ฟผ๋ฆฌ๋ฌธ์ ํตํ์ฌ ์ค์ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ด ์ผ๋ง๋ ํฅ์ ๋์๋์ง, ๊ทธ๋ฆฌ๊ณ ๋น
์ฟผ๋ฆฌ์ ์ฌ๋กฏ(slot
)์ฌ์ฉ๋์ด ์ผ๋ง๋ ์ค์๋์ง์ ๋ํ์ฌ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. ํ
์คํธ ์ํ์์๋ ๊ฒฐ๊ณผ ๋น๊ต๋ฅผ ์ํ์ฌ ๋ฐ๋์ Query Settings
์์ โUse cached resultsโ๋ฅผ ์ฒดํฌ ํด์ ํ์ฌ ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
-
BigQuery Advanced Runtime ๊ธฐ๋ฅ ํ์ฑํ(2025๋ 9์ 3์ผ ๊ธฐ์ค์ผ๋ก, ํด๋น ๊ธฐ๋ฅ์ Public Preview ์ํ์ด๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก disable ๋์ด ์์ต๋๋ค)
## ์ํํ๋ ค๋ ์ฟผ๋ฆฌ์ ๋์ ๋ฐ์ดํฐ์ ์ ๋ฆฌ์ ์ผ๋ก ๋ณ๊ฒฝ: `[dataset-region].query_runtime` ## ํํ ๋ฆฌ์ผ์์๋ ๋น ์ฟผ๋ฆฌ ๊ณต๊ฐ ๋ฐ์ดํฐ์ ์ผ๋ก ์งํ `region-us` ALTER PROJECT `[your-project-id]` SET OPTIONS ( `region-us.query_runtime` = 'advanced' );
-
BigQuery Advanced Runtime ๊ธฐ๋ฅ ํ์ฑํ ์ํ ํ์ธ
- ์ธํฌ๋ฉ์ด์ ์คํค๋ง๋ฅผ ํตํ์ฌ ํ์ฑํ ์ํ ํ์ธ ๊ฐ๋ฅ(์ํ ๋ณ๊ฒฝํ ์ธํฌ๋ฉ์ด์ ์คํค๋ง ๋ฐ์๊น์ง๋ ์ต๋ 15์ด ์์)
SELECT option_name, option_value FROM `region-us`.INFORMATION_SCHEMA.PROJECT_OPTIONS;
- ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ(results)์์ option_name(query_runtime), option_value(ADVANCED) ๋ก ๋์ค๋ฉด ํ์ฑํ(enable)๋ ์ํ
- ๋น
์ฟผ๋ฆฌ ๊ณต๊ฐ ๋ฐ์ดํฐ์
์ ์กด์ฌํ๋ ์ํ ํ
์ด๋ธ์์ ํ
์คํธ ์ฟผ๋ฆฌ ์ํ
- ํํ ๋ฆฌ์ผ์์ ์ฌ์ฉํ ๋ฐ๋ชจ ์ฟผ๋ฆฌ๋ ์ ์์๊ฑฐ๋(e-commerce) ๋ฐ์ดํฐ๋ฅผ ํตํ์ฌ ์ด๋ค ์ํ์นดํ
๊ณ ๋ฆฌ๊ฐ ์ด๋ ๋ฌผ๋ฅ์ผํฐ์์, ์ด๋ ๊ตญ๊ฐ์ ์ฌ์ฉ์์๊ฒ ๊ฐ์ฅ ๋ง์ด ํ๋ ธ๋์ง๋ฅผ ๋ถ์ํ๋ ์ฟผ๋ฆฌ์
๋๋ค. ํด๋น ์ฟผ๋ฆฌ๋
orders(์ฃผ๋ฌธ), products(์ํ)
๋ฑ์ ์ด 6๊ฐ์ ํ ์ด๋ธ์ ์กฐ์ธํ์ฌ,WHERE
์ ์์ ๋ช ์ํ ์นผ๋ผ(order_id, product_id ๋ฑ)
๊ธฐ์ค์ผ๋ก,GROUP BY
๊ตฌ๋ฌธ์ ํตํ์ฌ ๊ทธ๋ฃนํ์ฌ ํด๋น ์ปฌ๋ผ์ ๊ฐ์ ์ง๊ณ(COUNT, AVG, SUM)
ํ๊ณ ๊ฒฐ๊ณผ๋ฅผtotal_sales_amount
๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์(DESC)์ผ๋ก ๋ณด์ฌ์ฃผ๋ ์ฟผ๋ฆฌ์ ๋๋ค. ํด๋น ์ฟผ๋ฆฌ ์ํ์ ํตํ์ฌ ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ(๊ฒฝ๊ณผ ์๊ฐ, ์ฌ์ฉ๋ ์ฌ๋กฏ ์๊ฐ, ์ ํ๋ ๋ฐ์ดํธ ์ฉ๋)์ ๋ํด์ ์ดํด ๋ณด๊ฒ ์ต๋๋ค. - ํ
์คํธ ์ํ์์๋ ๊ฒฐ๊ณผ ๋น๊ต๋ฅผ ์ํ์ฌ ๋ฐ๋์
Query Settings
์์ Use cached results๋ฅผ ์ฒดํฌ ํด์ ํ์ฌ ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
- ํํ ๋ฆฌ์ผ์์ ์ฌ์ฉํ ๋ฐ๋ชจ ์ฟผ๋ฆฌ๋ ์ ์์๊ฑฐ๋(e-commerce) ๋ฐ์ดํฐ๋ฅผ ํตํ์ฌ ์ด๋ค ์ํ์นดํ
๊ณ ๋ฆฌ๊ฐ ์ด๋ ๋ฌผ๋ฅ์ผํฐ์์, ์ด๋ ๊ตญ๊ฐ์ ์ฌ์ฉ์์๊ฒ ๊ฐ์ฅ ๋ง์ด ํ๋ ธ๋์ง๋ฅผ ๋ถ์ํ๋ ์ฟผ๋ฆฌ์
๋๋ค. ํด๋น ์ฟผ๋ฆฌ๋
SELECT
p.category,
dc.name AS distribution_center_name,
u.country AS user_country,
SUM(oi.sale_price) AS total_sales_amount,
COUNT(DISTINCT o.order_id) AS total_unique_orders,
COUNT(DISTINCT o.user_id) AS total_unique_customers_who_ordered,
AVG(oi.sale_price) AS average_item_sale_price,
SUM(CASE WHEN oi.status = 'Complete' THEN 1 ELSE 0 END) AS completed_order_items_count,
COUNT(DISTINCT p.id) AS total_unique_products_sold,
COUNT(DISTINCT ii.id) AS total_unique_inventory_items_sold
FROM
`bigquery-public-data.thelook_ecommerce.orders` AS o,
`bigquery-public-data.thelook_ecommerce.order_items` AS oi,
`bigquery-public-data.thelook_ecommerce.products` AS p,
`bigquery-public-data.thelook_ecommerce.inventory_items` AS ii,
`bigquery-public-data.thelook_ecommerce.distribution_centers` AS dc,
`bigquery-public-data.thelook_ecommerce.users` AS u
WHERE
o.order_id = oi.order_id AND oi.product_id = p.id AND ii.product_distribution_center_id = dc.id AND oi.inventory_item_id = ii.id AND o.user_id = u.id
GROUP BY
p.category,
dc.name,
u.country
ORDER BY
total_sales_amount DESC
LIMIT 1000;
- Advanced Runtime ํ์ฑํ(enable) ์ํ์์์ ์ฟผ๋ฆฌ ์ํ ๊ฒฐ๊ณผ
-
BigQuery Advanced Runtime ๊ธฐ๋ฅ ๋นํ์ฑํ
## ์ํํ๋ ค๋ ์ฟผ๋ฆฌ์ ๋์ ๋ฐ์ดํฐ์ ์ ๋ฆฌ์ ์ผ๋ก ๋ณ๊ฒฝ: `[dataset-region].query_runtime` ## ํํ ๋ฆฌ์ผ์์๋ ๋น ์ฟผ๋ฆฌ ๊ณต๊ฐ ๋ฐ์ดํฐ์ ์ผ๋ก ์งํ `region-us` ALTER PROJECT `[your-project-id]` SET OPTIONS ( `region-us.query_runtime` = null );
-
BigQuery Advanced Runtime ๊ธฐ๋ฅ ๋นํ์ฑํ ์ํ ํ์ธ
- ์ธํฌ๋ฉ์ด์ ์คํค๋ง๋ฅผ ํตํ์ฌ ํ์ฑํ ์ํ ํ์ธ ๊ฐ๋ฅ, ์ํ ๋ณ๊ฒฝํ ์ธํฌ๋ฉ์ด์ ์คํค๋ง ๋ฐ์๊น์ง๋ ์ต๋ 15์ด ์์
SELECT option_name, option_value FROM `region-us`.INFORMATION_SCHEMA.PROJECT_OPTIONS;
- ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ(Results)๋ด์ญ์
There is no data to display.
๋ก ๋์ค๋ฉด ๋นํ์ฑํ(disable) ์ํ
- Advanced Runtime ๋นํ์ฑํ(disable) ์ํ์์์ ์ฟผ๋ฆฌ ์ํ ๊ฒฐ๊ณผ
- ๋นํ์ฑํ ์ํ์์ ํ
์คํธ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ํ๋ฒ ์ํํ์ฌ ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ํ
์คํธ ์ฟผ๋ฆฌ ์ํ์์๋ ๋ฐ๋์
Query Settings
์์ Use cached results๋ฅผ ์ฒดํฌ ํด์ ํ์ฌ ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
- ๋นํ์ฑํ ์ํ์์ ํ
์คํธ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ํ๋ฒ ์ํํ์ฌ ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ํ
์คํธ ์ฟผ๋ฆฌ ์ํ์์๋ ๋ฐ๋์
- Advance Runtime ํ์ฑํ ์ฌ๋ถ(enable/disable)์ ๋ฐ๋ฅธ ์ฑ๋ฅ ๋น๊ต ๊ฒฐ๊ณผ
๋น ์ฟผ๋ฆฌ์ Advanced Runtime ๊ธฐ๋ฅ์ ๋นํ์ฑํํ ์ํ(์ข์ธก)์์๋ ์ฟผ๋ฆฌ ์คํ์๊ฐ์ด 1์ด ์ด์์ด๋ฉฐ, ์ฝ20์ฌ๋กฏ/์ด๊ฐ ์๋ชจ ๋์์ต๋๋ค. ์คํ ๊ทธ๋ํ(Execution Graph) ๋ฅผ ์ดํด๋ณด๋ฉด, ์กฐ์ธ(Join) ๋จ๊ณ์ ์ง๊ณ(Aggregation) ๋จ๊ณ์์ ๋ง์ ์๊ฐ์ด ์์ ๋์์ต๋๋ค. ๋ค๋ง, ๊ธฐ๋ฅ์ ํ์ฑํํ ์ํ(์ฐ์ธก)์์๋ 50๋ฐฐ ์ด์ ์ ์ ์ฌ๋กฏ์ ์๋ชจํ๋ฉด์, ์ฟผ๋ฆฌ์ํ์๊ฐ์ 0.5์ด๋ง์ ์๋ฃ๊ฐ ๋์์ต๋๋ค. Advanced Runtime ๊ธฐ๋ฅ ํ์ฑํ๋ฅผ ํตํ์ฌ ๋น ์ฟผ๋ฆฌ ์ฌ์ฉ์๋ ๋์ฑ ๋น ๋ฅธ ์ฟผ๋ฆฌ ์๋ต์๊ฐ์ ๊ธฐ๋ํ ์๊ฐ ์์ผ๋ฉฐ, ์ถ๊ฐ๋ก ์ฌ๋กฏ ์๋ชจ๋์ด ์ค์ด ๋ค์ด ์ฌ๋กฏ ์๊ธ์ ๋ํ ์ ๊ฐ์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
๋น ์ฟผ๋ฆฌ์ ์ฅ์ ์ ์๋ฒ๋ฆฌ์ค(Serveless), ์ปดํจํ ๊ณผ ์คํ ๋ฆฌ์ง ๋ ธ๋์ ๋ํ ๋ถ๋ฆฌ(Storage and Compute Separation ), ํํ ๋ฐ์ดํธ ์ค์ผ์ผ(Petabyte Scale), BQML(๋น ์ฟผ๋ฆฌ ๋จธ์ ๋ฌ๋) , Data Security and Governance(๋ฐ์ดํฐ ๋ณด์ ๋ฐ ๊ฑฐ๋ฒ๋์ค) ๋ฑ๊ณผ ๊ฐ์ด ๋ง์ด ์์ง๋ง, ๊ฐ์ฅ ํฐ ์ฅ์ ์ค์ ํ๋๋ ๋ฐ๋ก ๋น ์ฟผ๋ฆฌ ์ค์ค๋ก๊ฐ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ์ ์ฌ์ฉ์์ ๊ฐ์ (SQL์ฟผ๋ฆฌ๋ ๋ฐ์ดํฐ ์คํค๋ง์ ๋ํ ๋ณ๊ฒฝ) ์์ด ์๋์ผ๋ก ์ฟผ๋ฆฌ ํผํฌ๋จผ์ค ํฅ์์ ์ํ ์งํ(Self Performance Tuning)๋ฅผ ํ๋ค๋ ๊ฒ์ด ์๋๊น ๊ฐ์ธ์ ์ผ๋ก ์๊ฐ์ด ๋ฉ๋๋ค. ๋๊น์ง ์ฝ์ด ์ฃผ์ ์ ๋๋จํ ๊ฐ์ฌํฉ๋๋ค. by Joon Park
- BigQuery under the hood: Enhanced vectorization in the advanced runtime
- BigQuery under the hood: Short query optimizations in the advanced runtime
- Enable the advanced runtime
- Dremel: Interactive Analysis of Web-Scale Datasets
- Colossus under the hood: a peek into Googleโs scalable storage system
- Large-scale cluster management at Google with Borg
- BigQuery explained: An overview of BigQuery's architecture
- Overview of BigQuery Storage
- Speed, scale and reliability: 25 years of Google data-center networking evolution
- In-memory query execution in Google BigQuery
- Jupiter Evolving: Transforming Google's Datacenter Network via Optical Circuit Switches and Software-Defined Networking
- Single instruction, multiple data