Получение OLTP-подобной производительности из результатов BigQuery - PullRequest
1 голос
/ 13 января 2020

Я работаю над проектом, в котором нам нужно отобразить результаты 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 результатов.

1 Ответ

1 голос
/ 15 января 2020

BigQuery не следует использовать, если вы ожидаете поведение или производительность OLTP. В вашем случае, если вы хотите, чтобы ваш проект был на GCP, а также чтобы ваша модель данных была максимально похожа на модель, которая у вас уже есть, я бы посоветовал вам взглянуть на Cloud SQL* 1004. * и Облачный гаечный ключ .

Обе являются полностью управляемыми реляционными базами данных. Основное отличие состоит в том, что Cloud Spanner масштабируется по горизонтали, тогда как Cloud SQL нет, т. Е. Если вам нужен только один узел, используйте Cloud SQL. Если вам нужно расширить кластер, используйте Cloud Spanner.

Кроме того, у них обоих есть соответствующие веб-API. Справочную информацию по веб-API Cloud Spanner можно найти здесь . Для Облака SQL ссылка зависит от того, какую СУБД вы выберете: SQLServer , MySQL или PostgreSQL.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...