优化具有 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
。)
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
。)