С помощью Google Bigquery я запрашиваю кластеризованную таблицу, применяя фильтр к полю кластеризации projectId
, например:
WITH userProjects AS (
SELECT
projectsArray
FROM
projectsPerUser
WHERE
userId = "eben@somewhere.com"
)
SELECT
userProperty
FROM
`mydata.mydataset.mytable`
WHERE
--projectId IN UNNEST((SELECT projectsArray FROM userProjects))
projectId IN ("mydata", "anotherproject")
AND _PARTITIONTIME >= "2019-03-20"
Кластеризация применяется правильно в приведенном выше фрагменте кода, но когда яиспользуйте закомментированную строку --projectId IN UNNEST((SELECT projectsArray FROM userProjects))
, кластеризация не применяется.
Я также пытался обернуть его в UDF, что также не работает:
CREATE TEMP FUNCTION storedValue(item ARRAY<STRING>) AS (
item
);
...
WHERE projectId IN UNNEST(storedValue((SELECT projectsListArray FROM projectsList)))
Как я понимаю из этого, путь выполнения для запросов на выборочный выборотличается от простой фильтрации по скаляру или массиву напрямую.
Я ожидаю, что будет существовать решение, в котором я могу программно предоставить массив для фильтрации, который все же позволит мне сэкономить на затратах, которые дает кластеризованная таблица.
В итоге:
WHERE projectId IN ("mydata", "anotherproject")
[OK] WHERE projectId IN UNNEST((SELECT projectsArray FROM userProjects))
[Not OK] WHERE projectId IN UNNEST(storedValue((SELECT projectsListArray FROM projectsList)))
[Not OK]
Есть идеи?