๋ฉํฐ ๋ฌธ ํธ๋์ญ์
BigQuery๋ ๋จ์ผ ์ฟผ๋ฆฌ ๋ด์์ ๋๋ ์ธ์ ์ฌ์ฉ ์ ์ฌ๋ฌ ์ฟผ๋ฆฌ ๊ฐ์ ๋ฉํฐ ๋ฌธ ํธ๋์ญ์ ์ ์ง์ํฉ๋๋ค. ๋ฉํฐ ๋ฌธ ํธ๋์ญ์ ์ ์ฌ์ฉํ๋ฉด ํ๋ ์ด์์ ํ ์ด๋ธ์์ ํ ์ฝ์ ๋๋ ์ญ์ ์ ๊ฐ์ ๋ณํ ์์ ์ ์ํํ๊ณ ๋ณ๊ฒฝ์ฌํญ์ ์์์ ์ผ๋ก ์ปค๋ฐ ๋๋ ๋กค๋ฐฑํ ์ ์์ต๋๋ค.
๋ฉํฐ ๋ฌธ ํธ๋์ญ์ ์ ์ฉ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฌ๋ฌ ํ ์ด๋ธ์์ ๋จ์ผ ํธ๋์ญ์ ์ผ๋ก DML ๋ณํ์ ์ํํฉ๋๋ค. ํ ์ด๋ธ์ ์ฌ๋ฌ ๋ฐ์ดํฐ ์ธํธ ๋๋ ํ๋ก์ ํธ์ ํ์ฅ๋ ์ ์์ต๋๋ค.
- ์ค๊ฐ ๊ณ์ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ ๋จ๊ณ๋ก ๋จ์ผ ํ ์ด๋ธ์ ๋ณํ์ ์ํํฉ๋๋ค.
ํธ๋์ญ์ ์ ACID ์์ฑ์ ๋ณด์ฅํ๊ณ ์ค๋ ์ท ๊ฒฉ๋ฆฌ๋ฅผ ์ง์ํฉ๋๋ค. ํธ๋์ญ์ ์ค์ ๋ชจ๋ ์ฝ๊ธฐ๋ ํธ๋์ญ์ ์์ ์ฐธ์กฐ๋๋ ํ ์ด๋ธ์ ์ผ๊ด๋ ์ค๋ ์ท์ ๋ฐํํฉ๋๋ค. ํธ๋์ญ์ ์ ๋ฌธ์ด ํ ์ด๋ธ์ ์์ ํ๋ ๊ฒฝ์ฐ ๋ณ๊ฒฝ์ฌํญ์ ๋์ผํ ํธ๋์ญ์ ๋ด์ ํ์ ๋ฌธ์ ํ์๋ฉ๋๋ค.
ํธ๋์ญ์ ๋ฒ์
ํธ๋์ญ์
์ด Session mode
์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋จ์ผ SQL ์ฟผ๋ฆฌ์ ํฌํจ๋์ด์ผ ํฉ๋๋ค. ์ฟผ๋ฆฌ์๋ ์ฌ๋ฌ ํธ๋์ญ์
์ด ํฌํจ๋ ์ ์์ง๋ง ์ค์ฒฉ๋ ์ ์์ต๋๋ค. ์ธ์
์ ์ฌ๋ฌ ์ฟผ๋ฆฌ์์ ๋ฉํฐ ๋ฌธ ํธ๋์ ์
์ ์คํํ ์ ์์ต๋๋ค.
ํธ๋์ญ์
์ ์์ํ๋ ค๋ฉด BEGIN TRANSACTION
๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. ๋ค์ ์ํฉ์ด ํ๋๋ผ๋ ๋ฐ์ํ๋ฉด ํธ๋์ญ์
์ด ์ข
๋ฃ๋ฉ๋๋ค.
- ์ด ์ฟผ๋ฆฌ๋
COMMIT TRANSACTION
๋ฌธ์ ์คํํฉ๋๋ค. ์ด ๋ฌธ์ ํธ๋์ญ์ ๋ด์์ ์ํ๋ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ ์์์ ์ผ๋ก ์ปค๋ฐํฉ๋๋ค. - ์ด ์ฟผ๋ฆฌ๋
ROLLBACK TRANSACTION
๋ฌธ์ ์คํํฉ๋๋ค. ์ด ๋ฌธ์ ํธ๋์ญ์ ๋ด๋ถ์ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ ๋ฌด์ํฉ๋๋ค. - ์ฟผ๋ฆฌ๊ฐ ์์ ๋ ๋ฌธ ์ค ํ๋์ ๋๋ฌํ๊ธฐ ์ ์ ์ข ๋ฃ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ BigQuery๋ ์๋์ผ๋ก ํธ๋์ญ์ ์ ๋กค๋ฐฑํฉ๋๋ค.
์ฟผ๋ฆฌ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์คํฌ๋ฆฝํธ์ ์์ธ ํธ๋ค๋ฌ๊ฐ ์์ผ๋ฉด BigQuery๋ ์ ์ด๋ฅผ ์์ธ ํธ๋ค๋ฌ๋ก ์ ์กํฉ๋๋ค. ์์ธ ๋ธ๋ก ๋ด์์ ํธ๋์ญ์ ์ ์ปค๋ฐํ ์ง ๋๋ ๋กค๋ฐฑํ ์ง ์ ํํ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์์ธ ํธ๋ค๋ฌ๊ฐ ์์ผ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์คํจํ๊ณ BigQuery๋ ์๋์ผ๋ก ํธ๋์ญ์ ์ ๋กค๋ฐฑํฉ๋๋ค.
๋ค์ ์์์์๋ ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๋ ์์ธ ํธ๋ค๋ฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
BEGIN BEGIN TRANSACTION; INSERT INTO mydataset.NewArrivals VALUES ('top load washer', 100, 'warehouse #1'); -- Trigger an error. SELECT 1/0; COMMIT TRANSACTION; EXCEPTION WHEN ERROR THEN -- Roll back the transaction inside the exception handler. SELECT @@error.message; ROLLBACK TRANSACTION; END;
ํธ๋์ญ์ ์์ ์ง์๋๋ ๋ฌธ
ํธ๋์ญ์ ์์ ์ง์๋๋ ๋ฌธ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฟผ๋ฆฌ ๋ฌธ:
SELECT
- DML ๋ฌธ:
INSERT
,UPDATE
,DELETE
,MERGE
,TRUNCATE TABLE
์์ ํญ๋ชฉ์ DDL ๋ฌธ:
CREATE TEMP TABLE
CREATE TEMP FUNCTION
- ์์ ํ
์ด๋ธ์ ๋ํ
DROP TABLE
- ์์ ํจ์์ ๋ํ
DROP FUNCTION
๋ฐ์ดํฐ ์ธํธ, ํ ์ด๋ธ, ํจ์์ ๊ฐ์ ์๊ตฌ ํญ๋ชฉ์ ๋ง๋ค๊ฑฐ๋ ์ญ์ ํ๋ DDL ๋ฌธ์ ํธ๋์ญ์ ๋ด์์ ์ง์๋์ง ์์ต๋๋ค.
ํธ๋์ญ์ ์ ๋ ์ง/์๊ฐ ํจ์
ํธ๋์ญ์ ๋ด์์ ๋ค์ ๋ ์ง/์๊ฐ ํจ์๋ ํน์ํ ๋์์ ์ํํฉ๋๋ค.
CURRENT_TIMESTAMP
,CURRENT_DATE
,CURRENT_TIME
ํจ์๋ ํธ๋์ญ์ ์ด ์์๋์์ ๋ ํ์์คํฌํ๋ฅผ ๋ฐํํฉ๋๋ค.ํธ๋์ญ์ ์ด ์์๋์์ ๋
FOR SYSTEM_TIME AS OF
์ ์ ์ฌ์ฉํ์ฌ ํ์์คํฌํ ๋ฒ์๋ฅผ ๋์ด์๋ ํ ์ด๋ธ์ ์ฝ์ ์๋ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐํ๋ฉ๋๋ค.
ํธ๋์ญ์ ์์
์ด ์์์์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋ Inventory
๋ฐ NewArrivals
์ ๋ ํ
์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
CREATE OR REPLACE TABLE mydataset.Inventory ( product string, quantity int64, supply_constrained bool ); CREATE OR REPLACE TABLE mydataset.NewArrivals ( product string, quantity int64, warehouse string ); INSERT mydataset.Inventory (product, quantity) VALUES('top load washer', 10), ('front load washer', 20), ('dryer', 30), ('refrigerator', 10), ('microwave', 20), ('dishwasher', 30); INSERT mydataset.NewArrivals (product, quantity, warehouse) VALUES('top load washer', 100, 'warehouse #1'), ('dryer', 200, 'warehouse #2'), ('oven', 300, 'warehouse #1');
Inventory
ํ
์ด๋ธ์๋ ํ์ฌ ์ธ๋ฒคํ ๋ฆฌ์ ๋ํ ์ ๋ณด๊ฐ ์๊ณ NewArrivals
์๋ ์๋ก ๋์ฐฉํ ํญ๋ชฉ์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
๋ค์ ํธ๋์ญ์
์ Inventory
๋ฅผ ์๋ก ๋์ฐฉํ ํญ๋ชฉ์ผ๋ก ์
๋ฐ์ดํธํ๊ณ ํด๋น ๋ ์ฝ๋๋ฅผ NewArrivals
์์ ์ญ์ ํฉ๋๋ค. ๋ชจ๋ ๋ฌธ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ ํ
์ด๋ธ์ ๋ณ๊ฒฝ์ฌํญ์ ๋จ์ผ ํธ๋์ญ์
์ผ๋ก ์์์ ์ผ๋ก ์ปค๋ฐ๋ฉ๋๋ค.
BEGIN TRANSACTION; -- Create a temporary table that holds new arrivals from 'warehouse #1'. CREATE TEMP TABLE tmp AS SELECT * FROM mydataset.NewArrivals WHERE warehouse = 'warehouse #1'; -- Delete the matching records from the NewArravals table. DELETE mydataset.NewArrivals WHERE warehouse = 'warehouse #1'; -- Merge the records from the temporary table into the Inventory table. MERGE mydataset.Inventory AS I USING tmp AS T ON I.product = T.product WHEN NOT MATCHED THEN INSERT(product, quantity, supply_constrained) VALUES(product, quantity, false) WHEN MATCHED THEN UPDATE SET quantity = I.quantity + T.quantity; -- Drop the temporary table and commit the transaction. DROP TABLE tmp; COMMIT TRANSACTION;
ํธ๋์ญ์ ๋์ ์คํ
ํธ๋์ญ์ ์ด ํ ์ด๋ธ์ ํ์ ๋ณํ(์ ๋ฐ์ดํธ ๋๋ ์ญ์ )ํ๋ฉด ๋์ผํ ํ ์ด๋ธ์ ํ์ ๋ณํํ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ด๋ DML ๋ฌธ์ด ๋์์ ์คํ๋ ์ ์์ต๋๋ค. ์ถฉ๋ํ๋ ํธ๋์ญ์ ์ ์ทจ์๋ฉ๋๋ค. ํธ๋์ญ์ ์ธ๋ถ์์ ์คํ๋๋ ์ถฉ๋ DML ๋ฌธ์ ํ ์ถ๊ฐ ํ๋์ ๋ฐ๋ผ ๋์ค์ ์คํ๋๋๋ก ํ์ ์ถ๊ฐ๋ฉ๋๋ค.
์ ํ์ ์ฝ๊ฑฐ๋ ์ถ๊ฐํ๋ ์์ ์ ํธ๋์ญ์ ๊ณผ ๋์์ ์คํ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํธ๋์ญ์ ์ด ๋์ผํ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ๋์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ํ ์ด๋ธ์์ ๋์์ ์ํ๋ ์ ์์ต๋๋ค.
SELECT
๋ฌธ- BigQuery Storage Read API ์ฝ๊ธฐ ์์
- BigQuery BI Engine์ ์ฟผ๋ฆฌ
INSERT
๋ฌธWRITE_APPEND
์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ถ๊ฐํ๋ ์์ ๋ก๋- ์คํธ๋ฆฌ๋ฐ ์ฐ๊ธฐ
ํธ๋์ญ์ ์ด ํ ์ด๋ธ๋ง ์ฝ๊ฑฐ๋ ํ ์ด๋ธ์ ์ ํ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ ํด๋น ํ ์ด๋ธ์์ ๋ชจ๋ ์์ ์ ๋์์ ์ํํ ์ ์์ต๋๋ค.
ํธ๋์ญ์ ์ ๋ณด ๋ณด๊ธฐ
BigQuery๋ ๊ฐ ๋ฉํฐ ๋ฌธ ํธ๋์ญ์
์ ํธ๋์ญ์
ID๋ฅผ ํ ๋นํฉ๋๋ค. ํธ๋์ญ์
ID๋ ํธ๋์ญ์
๋ด์์ ์คํ๋๋ ๊ฐ ์ฟผ๋ฆฌ์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ์์
์ ํธ๋์ญ์
ID๋ฅผ ๋ณด๋ ค๋ฉด transaction_id
์ด์ INFORMATION_SCHEMA.JOBS*
๋ทฐ๋ฅผ ์ฟผ๋ฆฌํฉ๋๋ค.
๋ค์ค ๋ฌธ ํธ๋์ญ์
์ด ์คํ๋๋ฉด BigQuery๋ ํธ๋์ญ์
์ ๊ฐ ๋ฌธ์ ๋ํด ํ์ ์์
์ ๋ง๋ญ๋๋ค. ํน์ ํธ๋์ญ์
์ ๊ฒฝ์ฐ ํด๋น ํธ๋์ญ์
๊ณผ ์ฐ๊ฒฐ๋ ๋ชจ๋ ํ์ ์์
์ ๋์ผํ transaction_id
๊ฐ์ ๊ฐ์ง๋๋ค.
๋ค์ ์์๋ ํธ๋์ญ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
์ปค๋ฐ๋ ๋๋ ๋กค๋ฐฑ๋ ๋ชจ๋ ํธ๋์ญ์ ์ฐพ๊ธฐ
๋ค์ ์ฟผ๋ฆฌ๋ ์ฑ๊ณต์ ์ผ๋ก ์ปค๋ฐ๋ ๋ชจ๋ ํธ๋์ญ์ ์ ๋ฐํํฉ๋๋ค.
SELECT transaction_id, parent_job_id, query FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE statement_type = "COMMIT_TRANSACTION" AND error_result IS NULL;
๋ค์ ์ฟผ๋ฆฌ๋ ์ฑ๊ณต์ ์ผ๋ก ๋กค๋ฐฑ๋ ๋ชจ๋ ํธ๋์ญ์ ์ ๋ฐํํฉ๋๋ค.
SELECT transaction_id, parent_job_id, query FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE statement_type = "ROLLBACK_TRANSACTION" AND error_result IS NULL;
ํธ๋์ญ์ ์์ ๋ฐ ์ข ๋ฃ ์๊ฐ ์ฐพ๊ธฐ
๋ค์ ์ฟผ๋ฆฌ๋ ์ง์ ๋ ํธ๋์ญ์ ID์ ์์ ์๊ฐ๊ณผ ์ข ๋ฃ ์๊ฐ์ ๋ฐํํฉ๋๋ค.
SELECT transaction_id, start_time, end_time, statement_type FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_USER WHERE transaction_id = "TRANSACTION_ID" AND statement_type IN ("BEGIN_TRANSACTION", "COMMIT_TRANSACTION", "ROLLBACK_TRANSACTION") ORDER BY start_time;
์์ ์ด ์คํ ์ค์ธ ํธ๋์ญ์ ์ฐพ๊ธฐ
๋ค์ ์ฟผ๋ฆฌ๋ ์ง์ ๋ ์์
ID์ ์ฐ๊ฒฐ๋ ํธ๋์ญ์
์ ๊ฐ์ ธ์ต๋๋ค. ์์
์ด ๋ฉํฐ ๋ฌธ ํธ๋์ญ์
๋ด์์ ์คํ๋๊ณ ์์ง ์์ผ๋ฉด NULL
์ ๋ฐํํฉ๋๋ค.
SELECT transaction_id FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE job_id = 'JOB_ID';
ํธ๋์ญ์ ๋ด์์ ์คํ ์ค์ธ ํ์ฌ ์์ ์ฐพ๊ธฐ
๋ค์ ์ฟผ๋ฆฌ๋ ์ง์ ๋ ํธ๋์ญ์ ๋ด์์ ํ์ฌ ์คํ ์ค์ธ ์์ ์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐํํฉ๋๋ค(์๋ ๊ฒฝ์ฐ).
SELECT job_id, query, start_time, total_slot_ms FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE transaction_id = 'TRANSACTION_ID' AND state = RUNNING;
ํ ์ด๋ธ์ ์ํฅ์ ์ฃผ๋ ํ์ฑ ํธ๋์ญ์ ์ฐพ๊ธฐ
๋ค์ ์ฟผ๋ฆฌ๋ ์ง์ ๋ ํ ์ด๋ธ์ ์ํฅ์ ์ฃผ๋ ํ์ฑ ํธ๋์ญ์ ์ ๋ฐํํฉ๋๋ค. ๊ฐ ํ์ฑ ํธ๋์ญ์ ์ ๋ํด ํธ๋์ญ์ ์ด ์ ์ฅ ํ๋ก์์ ๋ด์ ๊ฐ์ ๋ฉํฐ ๋ฌธ ์ฟผ๋ฆฌ์ ์ผ๋ถ๋ก ์คํ๋๋ ๊ฒฝ์ฐ ์์ ์์ ID๋ ๋ฐํํฉ๋๋ค. ํธ๋์ญ์ ์ด ์ธ์ ๋ด์์ ์คํ ์ค์ธ ๊ฒฝ์ฐ ์ธ์ ์ ๋ณด๋ ๋ฐํํฉ๋๋ค.
WITH running_transactions AS ( SELECT DISTINCT transaction_id FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT EXCEPT DISTINCT SELECT transaction_id FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE statement_type = 'COMMIT_TRANSACTION' OR statement_type = 'ROLLBACK_TRANSACTION' ) SELECT jobs.transaction_id, parent_job_id, session_info, query FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT AS jobs, running_transactions WHERE destination_table = ("PROJECT_NAME", "DATASET_NAME", "TABLE_NAME") AND jobs.transaction_id = running_transactions.transaction_id;
๋ฉํฐ ๋ฌธ ํธ๋์ญ์ ์์ ์คํ ์ค์ธ ํ์ฑ ํธ๋์ญ์ ์ฐพ๊ธฐ
๋ค์ ์ฟผ๋ฆฌ๋ ๋ค์ค ๋ฌธ ํธ๋์ญ์ ์ ์คํํ๋ ์์ ์ ID๋ก ์ง์ ๋ ํน์ ์์ ์ ํ์ฑ ํธ๋์ญ์ ์ ๋ฐํํฉ๋๋ค.
SELECT DISTINCT transaction_id FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE parent_job_id = "JOB_ID" EXCEPT DISTINCT SELECT transaction_id FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE parent_job_id = "JOB_ID" AND (statement_type = 'COMMIT_TRANSACTION' OR statement_type = 'ROLLBACK_TRANSACTION');
์ ํ์ฌํญ
- ํธ๋์ญ์ ์ ์๊ตฌ ํญ๋ชฉ์ ์ํฅ์ ๋ฏธ์น๋ DDL ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํธ๋์ญ์ ๋ด์์ ๊ตฌ์ฒดํ๋ ๋ทฐ๋ ๋ ผ๋ฆฌ์ ๋ทฐ๋ก ํด์๋ฉ๋๋ค. ํธ๋์ญ์ ๋ด์์ ๊ตฌ์ฒดํ๋ ๋ทฐ๋ฅผ ๊ณ์ ์ฟผ๋ฆฌํ ์ ์์ง๋ง ๋๋ฑํ ๋ ผ๋ฆฌ ๋ทฐ์ ๋น๊ตํ์ฌ ์ฑ๋ฅ ๊ฐ์ ๋๋ ๋น์ฉ ์ ๊ฐ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
์คํจํ ๋ฉํฐ ๋ฌธ ํธ๋์ญ์ ์ ๋กค๋ฐฑ ์์ ์ ํธ๋ฆฌ๊ฑฐํ๊ณ , ๋๊ธฐ ์ค์ธ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ ์คํ์ทจ์ํ๊ณ , ์ฌ์๋๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
ํธ๋์ญ์ ์ ์ต๋ 100๊ฐ์ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๊ณ ์ต๋ 100,000๊ฐ์ ํํฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
BI Engine์ ํธ๋์ญ์ ๋ด์ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ํํ์ง ์์ต๋๋ค.
์์คํ ํ๋ฌ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ๋ด์์ ์ธ๋ถ ๋ฐ์ดํฐ ์์ค์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์๋ก๊ณ ์นจํ ์ ์์ต๋๋ค.