【问题标题】:Optomizing a simple query with 70mil rows to fit into Tableau优化包含 7000 万行的简单查询以适应 Tableau
【发布时间】:2021-11-23 02:57:07
【问题描述】:

SQL 新手。我在这里有一个简单的查询,即 7000 万行,当我将其导入 Tableau 时,我的工作笔记本电脑将无法处理该容量。通常 2000 万行和更少的行似乎可以正常工作。这是我的问题。

表名:Table1

字段:UniqueID、State、Date、claim_type

查询:

SELECT uniqueID, states, claim_type, date

FROM table1

WHERE date >= '11-09-2021'

这给了我想要的,但是,如果我计算在 3 个或更多不同状态下使用的 uniqueID 的数量,我可以显着限制查询。我使用这个查询来做到这一点。

SELECT unique_id, count(distinct states), claim_type, date

FROM table1

WHERE date >= '11-09-2021'

GROUP BY Unique_id, claim_type, date

HAVING COUNT(DISTINCT states) > 3

唯一的问题是,当我将此查询放入 Tableau 时,它只显示出现 unique_id 的第一个状态,以及它出现的第一个日期。 unique_id 在多个日期以多个状态显示,因此当我使用此计数聚合时,它只会给我第一个结果,而不是整个图片。

这里有什么想法吗?我完全迷失了,花了整整一个工作日来解决这个问题

预期的输出会是这样的

唯一ID |状态 |索赔类型 |日期

123 俄亥俄州 C 01-01-2021

123 内布拉斯加州 I 02-08-2021

123 乔治亚州 D 03-08-2021

【问题讨论】:

  • 不应该也在选择列表之前?

标签: mysql sql bigdata tableau-api distinct


【解决方案1】:

从长远来看,使用DATE 数据类型是明智的。这要求日期看起来像 '2021-09-11,而不是“09-11-2021”。这将让> 正确比较两个不同年份的日期。

如果您的数据来自某个将其格式化为'11-09-2021' 的来源,请使用STR_TO_DATE() 在输入时进行转换;您可以通过DATE_FORMAT() 在输出上重建该格式。

完成后,我们可以讨论优化

SELECT  unique_id, count(distinct states), claim_type, date
    FROM  table1
    WHERE  date >= '2021-09-11'
    GROUP BY  Unique_id, claim_type, date
    HAVING  COUNT(DISTINCT states) > 3

我暂时推荐这个复合索引加快查询速度:

INDEX(Unique_id, claim_type, date, states)

这也将有助于您的其他查询。

(我假设模棱两可的'11-09-2021'DD-MM-YYYY。)

【讨论】:

    【解决方案2】:

    如果您的表仅包含这四列,并且您的查询是基于日期范围的,那么您的索引必须存在以帮助优化它。如果存在 7000 万条记录,那可以追溯到多远……年?如果您自 2021 年 9 月 11 日以来的数据只是说...... 30k 条记录,那么您应该为您的结果而吹嘘。

    我会确保您拥有基于(并按此顺序)的索引 (日期、唯一 ID、声明类型、状态)。此外,您提到您希望计数为 3 或更多,您的查询 > 3 将导致 4 或更多,除非您更改为 count(*) >= 3。

    然后,要获得您关心的条目,您需要

    SELECT date, uniqueID, claim_type
       FROM table1
       WHERE date >= '2021-09-11'
       group by date, uniqueID, claim_type
       having count( distinct states ) >= 3
    

    这将只给出包含它们的日期/id/声明的 3 部分限定符。然后您将使用此结果集通过

    获取其他条目
    select distinct
          date, uniqueID, claim_type, states
       from
          ( SELECT date, uniqueID, claim_type
               FROM table1
               WHERE date >= '2021-09-11'
               group by date, uniqueID, claim_type
               having count( distinct states ) >= 3 ) PQ
             JOIN Table1 t1
                on PQ.date = t1.date
               and PQ.UniqueID = t1.UniqueID
               and PQ.Claim_Type = t1.Claim_Type
    

    “PQ”(预查询)获取合格的记录。然后它连接回原始表并从唯一的 date/id/claim_type 中获取所有符合条件的记录并返回所有状态。

    【讨论】:

      【解决方案3】:

      是的,您正在对行进行分组,因此您“松散”了分组结果的信息。 分组查询不会获得 70m 条记录。

      为什么不将您的导入分成更小的块?就像将行限制为大块,比如 15m:

      第一个:

      SELECT uniqueID, states, claim_type, date FROM table1 WHERE date >= '11-09-2021' LIMIT 15000000;
      

      第二个:

      SELECT uniqueID, states, claim_type, date FROM table1 WHERE date >= '11-09-2021' LIMIT 15000000 OFFSET 15000000;
      

      第三:

      SELECT uniqueID, states, claim_type, date FROM table1 WHERE date >= '11-09-2021' LIMIT 15000000 OFFSET 30000000;
      

      等等..

      我知道它不是一个完美或非常方便的解决方案,但也许它可以让您达到预期的结果。

      有关 LIMIT 和 OFFSET 的信息,请参阅此链接 https://www.bitdegree.org/learn/mysql-limit-offset

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        相关资源
        最近更新 更多