优化具有 7000 万行的简单查询以适应 Tableau

Optomizing a simple query with 70mil rows to fit into Tableau

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

Table 姓名:Table1

字段:UniqueID、州、日期,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

是的,您正在对行进行分组,因此您 'loose' 有关分组结果的信息。 您的分组查询不会获得 7000 万条记录。

为什么不将导入分成更小的块?比如将行限制为 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 的信息,请参阅此 link https://www.bitdegree.org/learn/mysql-limit-offset

如果您的 table 只是这四列中的一个,并且您的查询是基于日期范围的,则您的索引必须存在以帮助优化它。如果存在 7000 万条记录,那要追溯到多远……几年?如果您自 2021 年 9 月 11 日以来的数据只是说... 30k 条记录,那应该是您为结果而努力的全部内容。

我会确保您拥有基于(并按此顺序)的索引 (日期、uniqueId、claim_type、状态)。此外,您提到您想要 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

这将只给出包含它们的 date/id/claim 的 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”(预查询)获取符合条件的记录。然后它连接回原来的 table 并获取符合唯一 date/id/claim_type 和 returns 所有状态的所有记录。

long 运行 使用 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。)