google大查询sql中的性能增强
在下面的google大查询中,我连接了Id、StartTime和StopTime上的两个表Data和Location 因为数据是按日期分区的,所以我在WHERE cluase中使用了基于分区时间的条件 查询运行了很长时间~20分钟,只是想知道我是否缺少一些性能技术来提高查询效率 任何帮助都将不胜感激。谢谢google大查询sql中的性能增强,sql,google-bigquery,Sql,Google Bigquery,在下面的google大查询中,我连接了Id、StartTime和StopTime上的两个表Data和Location 因为数据是按日期分区的,所以我在WHERE cluase中使用了基于分区时间的条件 查询运行了很长时间~20分钟,只是想知道我是否缺少一些性能技术来提高查询效率 任何帮助都将不胜感激。谢谢 SELECT * FROM ( SELECT A.Id AS Id, A.Id1 AS Id1, StartTime, StopTime, La
SELECT
*
FROM (
SELECT
A.Id AS Id, A.Id1 AS Id1, StartTime, StopTime, Latitude, Longitude, DateTime
FROM
`Data` AS A
JOIN
(SELECT * FROM `Location` WHERE _TABLE_SUFFIX IN ("01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18",
"19","20","21", "22", "23","24", "26", "27", "28","29","30","31" )) AS B
ON
A.StartTime < B.DateTime
AND A.StopTime >= B.DateTime
AND A.Id = B.Id
WHERE
(A._PARTITIONTIME BETWEEN TIMESTAMP('2016-11-01')
AND TIMESTAMP('2016-11-30'))
ORDER BY
B.Id,
A.Id1,
B.DateTime )
ORDER BY
Id,
Id1,
DateTime
有几点想法:
不需要内部ORDER BY,因为只有顶级ORDER BY对查询结果有影响。
如果要查询除25之外的所有后缀,可以使用介于01和31之间的_TABLE_后缀和_TABLE_后缀!=25
根据联接的类型,可能不会按下分区时间上的筛选器以避免自动读取额外数据,例如,如果您实际使用的是正确的联接。如果是这种情况,请使用子查询,如SELECT*FROM YourTable,其中_partitionTimebefore。。。作为一个正确的连接。。。相反
如果你想让BigQuery工程师更详细地了解时间流逝的情况,你可以在问题中加入一个示例作业ID,也许有人可以提供帮助。我还想通过删除外部顺序,因为我认为它是影响查询性能的主要因素。
移动分区时间到各自的表是另一个要考虑的项目。
在子选择中使用SELECT*不会影响性能和成本,因为这是最终的外部选择,它定义了除了WHERE和其他子句中使用的列之外,还使用了哪些列,但作为一种良好的实践,我认为最好列出显式需要的列/字段
标准SQL
选择
A.Id作为Id,A.Id1作为Id1,开始时间,停止时间,纬度,经度,日期时间
从…起
选择Id、Id1、开始时间、停止时间
来自“数据”
其中_时间戳'2016-11-01'和时间戳'2016-11-30'之间的间隔时间
作为一个
参加
选择纬度、经度、日期时间
从'Location'开始
其中_TABLE_后缀在01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18中,
19,20,21, 22, 23,24, 26, 27, 28,29,30,31
作为B
在A.StartTime你也可以考虑按埃利奥特的建议压缩下面的语句,
其中_TABLE_后缀在01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18中, 19,20,21, 22, 23,24, 26, 27, 28,29,30,31 但要小心,因为若数据集中有不需要的表,那个么这可能会使不需要的表卷入其中。例如那些后缀为“011”或“046”等还有一种选择是——在数据分区和位置后缀之间可能存在某种逻辑关系。如果是的话,你可以使用它来缩小连接,从而使它更具性能, @ USS34 7653——如果我的答案帮助了你并且你接受了它,请也考虑投票:O这样做,你一直激励着我和那些在你问他们的时候准备好回答你的问题的人。谢谢你考虑