Колонизация для «не родных» типов данных, загружаемых в столбец VARIANT - PullRequest
1 голос
/ 30 января 2020

В документации есть раздел по полуструктурированным соображениям , который предупреждает об определенных ситуациях, в которых значения для данного пути в столбце VARIANT не будут материализованы; например, если значения не все имеют одинаковый тип данных. То есть, если присутствуют и {"foo":1}, и {"foo":"1"}, значение для "foo", очевидно, не может быть извлечено как его столбец.

Но в случае, когда все значения имеют один и тот же тип, оно все еще не Совершенно ясно, как обрабатываются так называемые несобственные типы .

Документация описывает, например, даты и временные метки как несобственные в контексте данных VARIANT type (имеется в виду, что такие значения «хранятся как строки»), мой вопрос: распространяется ли это на числовые типы, такие как FLOAT8. Документация предполагает, что собственные типы могут быть поняты в контексте JSON (который имеет собственный тип чисел, который является довольно гибридным по своей природе).

  • Является FLOAT8 собственным типом в данных VARIANT или оно хранится в виде строки?
  • Будет ли такое значение (сохранено в виде строки) извлечено в свой собственный столбец или отображено как "разобранная полуструктурированная структура" вместе с теми оставшимися значениями, которые не были извлечены в другие столбцы?

Документация предполагает, что можно проводить тесты производительности, «чтобы увидеть, какая структура обеспечивает лучшую производительность», но это будет намного проще с точным пониманием логики извлечения c .

1 Ответ

0 голосов
/ 31 января 2020

Следующий тест показывает, что да, FLOAT8 не сохраняется в виде строки, поэтому я ожидаю, что он будет сохранен таким образом, чтобы его можно было извлечь (/ pruned et c) независимо от других данных в JSON во время выполнения запроса.

create table foo (col variant) as (select object_construct('x', FLOOR(random()*1000000)::float8) col from table(generator(rowcount => 100000000)));
create table foo2 (col variant) as (select object_construct('x', col:x::string) col from foo);
TABLE_NAME  BYTES
FOO         800071680
FOO2        1480282112
...