Получить список таблиц, участвующих в процессе - PullRequest
1 голос
/ 08 февраля 2020

Я хотел бы выполнить серию запросов (пару сотен операторов ETL) и получить список, из которых выбираются таблицы. Есть ли способ сделать это в снежинке? Мне было интересно, смогу ли я установить соединение с определенной ролью / складом и урезать информацию таким образом или что-то подобное, но я не уверен, какие разумные способы могут быть для получения этой информации.

Спасибо, любезно!

1 Ответ

2 голосов
/ 08 февраля 2020

Чтобы получить операторы SELECT из ваших ETL:

В начале вашего ETL установите QUERY_TAG или сохраните SESSION_ID:

alter session set query_tag='MY_ETL'; -- Tag queries

select current_session(); -- Or save this SESSION_ID

Затем отфильтруйте история по QUERY_TAG:

select * from table(information_schema.query_history());

select query_text from table(result_scan(-1))
where query_type='SELECT' and query_tag='MY_ETL'
order by start_time;

или по SESSION_ID:

select * from table(information_schema.query_history_by_session(session_id=>298348393433));

select query_text from table(result_scan(-1))
where query_type='SELECT' 
order by start_time;
;

Чтобы получить список таблиц и других объектов, вы можете затем выполнить EXPLAIN для каждого оператора SELECT, возвращенного выше, и проверьте столбец OBJECTS. (Здесь есть предостережения - например, он основан на логическом плане, а не на фактическом выполнении.)

Если это слишком тяжело, уловка заключается в том, чтобы вставлять метаданные, такие как имена таблиц, в комментарии:

select /* metadata here */ 1;

Затем извлеките метаданные из QUERY_TEXT:

select * from table(information_schema.query_history());

select regexp_substr(query_text, '/\\*(.*?)\\*/', 1, 1, 'e') metadata, *  
from table(result_scan(-1))
where query_type='SELECT' and query_tag='MY_ETL'
order by start_time desc;

Но при этом будут пропущены таблицы, скрытые в представлениях и функциях.


Надеюсь, это полезно

...