如何在table / data-to-insights:ecommerce.web_analytics上查找PK和索引?

时间:2019-06-04 13:47:17

标签: google-bigquery

我无法在表上运行有效的查询。我不知道如何找出表上定义的主键,其他键和索引。如何查找在data-to-insights.ecommerce.web_analytics表上定义的索引?

我正在尝试如下查询,该查询应该仅获得一条记录,以查找一些具体的示例数据以供使用,并且同时高效。总是说将最大字节数增加到至少30MB左右。但是根据以前的查询结果(我增加到30MB),结果应该是一行。一行可以这么大吗?是否要扫描整个表?如何找出索引?

我执行了这个

SELECT
  COUNT(*),
  wa.date,
  fullVisitorId
FROM
  `data-to-insights.ecommerce.web_analytics` AS wa
WHERE
  wa.date='20161128'
GROUP BY
  wa.date,
  fullVisitorId
LIMIT
  100

我得到一个结果表,其中有两对日期+ visitorId,每对计数(*)= 1。然后我执行这个:

SELECT
  COUNT(*),
  wa.date,
  fullVisitorId
FROM
  `data-to-insights.ecommerce.web_analytics` AS wa
WHERE
  wa.date='20161128'
  AND wa.fullVisitorId='5244450947123722944'
GROUP BY
  wa.date,
  fullVisitorId
LIMIT
  100

据我了解,这应该仅从表中获得一行,并且(我不确定)应该通过诸如PK之类的索引直接到达该表。这种推理/假设可能不正确,因为添加WHERE标准时,它扫描或检索的数据应该减少而不增加。

它表示需要消耗30MB的内存,这对于我认为是连续的还是很少的来说似乎是很大的。确实,当我允许使用30MB时,我看到对于date和fullVisitorId的特定组合,count(*)为1。但是,当我按特定日期和visitorId过滤时,它又说我需要让他花费30MB。为什么会这样呢?这不止一排吗?一行这么大吗?为什么在添加条件(where子句)时此MB数量没有减少,但是有时即使应该检索较少的数据却增加了。

This query will process 28.6 MB when run.

1 个答案:

答案 0 :(得分:0)

请注意,BigQuery不是传统的关系数据库,它是一个高度分布式的存储和数据分析解决方案,与基于列的存储更相似。因此,BigQuery中不存在主键,外键,索引等概念。

BigQuery衡量处理的数据总量(因为这是pricing的相关指标),而不是结果的大小。当您将最大字节数设置为30 MB时,您并不是在告诉BigQuery返回最多30 MB,而是要最多处理30 MB。

解决您的问题:

  • 一行可以这么大吗?

是的,有可能。但是如上所述,您要对所有已处理的行而不是结果行施加30 MB的限制。

  • 是否要扫描整个表格?

否,它将扫描所有行,但是,由于BigQuery具有基于列的存储结构,因此它将仅扫描您在查询中使用的列。例如,对于您的第一个查询,它将扫描“ wa”和“ fullVisitorId”中的所有行。因此,不建议使用“选择*”查询。

  • 如何找出索引?

BigQuery中没有索引,但是您可以使用clustered tables

  • 为什么会这样?

由于上述BigQuery体系结构。

  • 这是不止一排吗?一行这么大吗?

没有,不太可能

  • 为什么在添加条件(where子句)时此MB数量没有减少,但是即使它应该检索较少的数据,有时却甚至增加了。

由于您可能在查询中引用了更多列,因此,需要扫描其他列。

我建议您查看BigQuery best practices for controlling costs,因为这些内容说明了如何使查询处理较少的数据。