我无法在表上运行有效的查询。我不知道如何找出表上定义的主键,其他键和索引。如何查找在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.
答案 0 :(得分:0)
请注意,BigQuery不是传统的关系数据库,它是一个高度分布式的存储和数据分析解决方案,与基于列的存储更相似。因此,BigQuery中不存在主键,外键,索引等概念。
BigQuery衡量处理的数据总量(因为这是pricing的相关指标),而不是结果的大小。当您将最大字节数设置为30 MB时,您并不是在告诉BigQuery返回最多30 MB,而是要最多处理30 MB。
解决您的问题:
是的,有可能。但是如上所述,您要对所有已处理的行而不是结果行施加30 MB的限制。
否,它将扫描所有行,但是,由于BigQuery具有基于列的存储结构,因此它将仅扫描您在查询中使用的列。例如,对于您的第一个查询,它将扫描“ wa”和“ fullVisitorId”中的所有行。因此,不建议使用“选择*”查询。
BigQuery中没有索引,但是您可以使用clustered tables。
由于上述BigQuery体系结构。
没有,不太可能
由于您可能在查询中引用了更多列,因此,需要扫描其他列。
我建议您查看BigQuery best practices for controlling costs,因为这些内容说明了如何使查询处理较少的数据。