๋ฉ€ํ‹ฐ ๋ฌธ ํŠธ๋žœ์žญ์…˜

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์€ ํŠธ๋žœ์žญ์…˜ ๋‚ด์˜ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€์†ํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์‹œ์Šคํ…œ ํ”„๋Ÿฌ์‹œ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.