Цель:
Я ищу стабильный и дешевый способ поиска определенных c строк в больших внешних таблицах, особенно для использования Snowflake, где внешние файлы можно только читать, но не изменять. (поставляется как есть):
Практический пример:
Большой XML архив, используемый для хранения исторических журналов c. XML очень изменчивы и обычно больше, чем размер LOB. Решением для этого является использование внешних таблиц, которые допускают большее содержимое полей.
Но это налагает другую проблему.
Как можно эффективно найти весь контент обратно, чтобы сделать дополнительное xml анализ определенных c записей без повторного полного анализа всех внешних файлов?
- Для скопированных таблиц можно использовать как метаданные, так и имя файла, а также метаданные и номер_ строки.
- Для внешних таблиц доступны только метаданные и имя файла.
В SQL терминах я стремлюсь объединить материализованные представления с внешней таблицей для дополнительной обработки.
Я посмотрел последовательности для внешней таблицы, но они выглядят нестабильными. Альтернативой является повторный анализ файлов и объединение идентификаторов, которые они содержат, но это похоже на дорогой обходной путь.
Код:
CREATE OR REPLACE sequence raw_messages_external_seq;
CREATE OR REPLACE EXTERNAL TABLE raw_messages_external
WITH LOCATION = @messagestore
PATTERN = '100M Gzip/.*.gz'
FILE_FORMAT = (TYPE=XML STRIP_OUTER_ELEMENT=TRUE);
CREATE OR REPLACE VIEW MESSAGES_VIEW
AS
SELECT
-- find original UUID
value:"@" as message_type,
get(split(message_type,':'), 0) as type,
regexp_substr(type, '\\D+') as type_group,
case when type = 'rsm'
then get(XMLGET(XMLGET(value, concat(type,':HeaderDocument'), 0), concat(type,':Identification'), 0 ),'$')
else get(XMLGET(XMLGET(value, concat(type,':HeaderMessage'), 0), concat(type,':MessageId'), 0 ),'$')
end as XML_ID,
-- Lookup
metadata$filename as filename,
--metadata$file_row_number as row_id,
--raw_messages_external_seq.nextval,
row_number() over (partition by filenumber order by value) as file_row_number,
value as XML_content
FROM raw_messages_external
CREATE OR REPLACE MATERIALIZED VIEW MESSAGES_VIEW_STABLE
AS
SELECT
-- find original UUID
value:"@" as message_type,
get(split(message_type,':'), 0) as type,
regexp_substr(type, '\\D+') as type_group,
case when type = 'rsm'
then get(XMLGET(XMLGET(value, concat(type,':HeaderDocument'), 0), concat(type,':Identification'), 0 ),'$')
else get(XMLGET(XMLGET(value, concat(type,':HeaderMessage'), 0), concat(type,':MessageId'), 0 ),'$')
end as XML_ID,
-- for lookup
metadata$filename as filename,
--metadata$file_row_number as row_id,
--raw_messages_external_seq.nextval,
row_number() over (partition by filenumber order by value) as file_row_number
FROM raw_messages_external