Я работаю над проектом, в котором нам нужно отобразить результаты BigQuery в виде таблицы в веб-приложении.
Мы создали эту функцию, разбивая на страницы, сортируя и выполняя поиск непосредственно в BigQuery, но производительность это не то, что вы ожидаете от современного веб-приложения. Требуется несколько секунд, чтобы применить критерий поиска или изменить страницу.
Я не могу поделиться большим количеством кода, но это общий вопрос, который применяет любой большой набор результатов, сгенерированный в BigQuery.
Для немного контекста. Мы создаем представление в BigQuery, присоединяя каталог товаров к заказам.
WITH Catalog AS
(
SELECT
productId,
FROM `CatalogTable`
),
Orders AS (
SELECT
p.productId,
SUM(p.qty) AS qty
FROM `OrdersView` as o, o.products AS p
GROUP BY p.productId
)
SELECT
c.productId,
IF(o.qty IS NULL, 0, o.qty) AS qty,
ROW_NUMBER() OVER(ORDER BY qty DESC) as salesRank
FROM Catalog AS c
LEFT JOIN
Orders AS o
ON CONCAT(c.name, c.sku) = CONCAT(o.name, o.sku)
И представление запрашивается следующим образом:
SELECT ...
FROM `catalog` c
LEFT JOIN `catalogView` cv
WHERE c.name LIKE '%searchTerm%'
LIMIT 10
OFFSET 0
Какие существуют варианты для создания этого вида сетки? работать, как если бы он был построен на традиционной SQL базе данных (или близко к производительности)?
Я рассмотрел кластеризацию, но я не верю, что это вариант, так как я не делю таблицу:
https://medium.com/google-cloud/bigquery-optimized-cluster-your-tables-65e2f684594b
ПРИМЕЧАНИЯ:
Допустимо, чтобы результаты немного задерживались, если возможна потоковая передача результатов в другую базу данных.
Запрос вызывается через конечную точку WebApi и отображается в виде сетки Angular.
Новые заказы импортируются каждые 15 минут, поэтому результаты этого запроса не будут полностью сохранены. c, они могут периодически меняться.
Сетка данных должна поддерживать разбиение на страницы, сортировку и поиск, и сетка может содержать более 10 000 результатов.