Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
google大查询sql中的性能增强_Sql_Google Bigquery - Fatal编程技术网

google大查询sql中的性能增强

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

在下面的google大查询中,我连接了Id、StartTime和StopTime上的两个表Data和Location

因为数据是按日期分区的,所以我在WHERE cluase中使用了基于分区时间的条件

查询运行了很长时间~20分钟,只是想知道我是否缺少一些性能技术来提高查询效率

任何帮助都将不胜感激。谢谢

  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=B.DateTime A.Id=B.Id

你也可以考虑按埃利奥特的建议压缩下面的语句,

其中_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这样做,你一直激励着我和那些在你问他们的时候准备好回答你的问题的人。谢谢你考虑