- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个具有以下结构的 postgres 表:
+---------+-------------+-------------+----------+---------+---------+
| id | timestamp | numvalues | text1 | text2 | text3 |
+---------+-------------+-------------+----------+---------+---------+
|abcd12344| 4124135 |[1,2,53,1241]| apple | banana | papaya |
+---------+-------------+-------------+----------+---------+---------+
id - random alphanumeric value<br>
timestamp - epoch timestamp<br>
numvalues - array of integers<br>
text(n) - text values
该表大约有 1.5 亿行。
我进行内部查询以获取按数组中的一个值排序的数据的第 n 个百分位数。然后,我需要从数组中获取几个值的平均值。数组的长度在 31 左右。
SELECT AVG(COALESCE(numvalues[2], 0))::NUMERIC(10,0), AVG(COALESCE(numvalues[3], 0))::NUMERIC(10,0)...AVG(COALESCE(numvalues[12], 0))::NUMERIC(10,0)
FROM (SELECT timestamp, numvalues, ntile(100)
OVER (ORDER BY numvalues[1]) pval FROM tablename WHERE timestamp >= somevalue and timestamp <= somevalue) innertable
WHERE pval >= x and pval <= y;
这会返回 1.5 亿行中的大约 700 万行,大约占表的 5%。但是,它不使用索引。运行 EXPLAIN ANALYZE 表明它使用的是 Seq Scan,即使 enable_seqscan 设置为 off。
但是,类似的查询:
SELECT text1, count(distinct(id))
FROM (SELECT timestamp, id, text1, numvalues, ntile(100)
OVER (ORDER BY numvalues[1]) pval FROM tablename WHERE timestamp >= somevalue and timestamp <= somevalue) innertable
WHERE pval >= x and pval <= y GROUP BY text1;
确实使用索引。
索引在时间戳列上
EXPLAIN ANALYZE 的结果:
explain analyze select text1, count(distinct(id))
from (select timestamp, text1, numvalues, id, ntile(100) over (order by numvalues[1]) pval from table where timestamp >= 1431100800 and timestamp <= 1431108000 and numvalues[1] NOTNULL) innertable
where pval >= 90 and pval <= 90 group by text1;
QUERY PLAN
--------------------------------------------------------------------------------
GroupAggregate (cost=4554118.06..4554641.66 rows=1 width=28) (actual time=218641.221..219051.984 rows=20 loops=1)
-> Sort (cost=4554118.06..4554292.59 rows=69812 width=28) (actual time=218640.546..218728.294 rows=71441 loops=1)
Sort Key: innertable.text1
Sort Method: quicksort Memory: 8654kB
-> Subquery Scan on innertable (cost=4094722.75..4548501.27 rows=69812 width=28) (actual time=216502.946..218521.666 rows=71441 loops=1)
Filter: ((innertable.pval >= 90) AND (innertable.pval <= 90))
Rows Removed by Filter: 7072674
-> WindowAgg (cost=4094722.75..4339065.03 rows=13962416 width=118) (actual time=202276.333..211374.235 rows=7144115 loops=1)
-> Sort (cost=4094722.75..4129628.79 rows=13962416 width=118) (actual time=164912.487..190272.316 rows=7144115 loops=1)
Sort Key: (table.numvalues[9])
Sort Method: external merge Disk: 1387704kB
-> Index Scan using table_time_idx on table (cost=0.57..1578710.87 rows=13962416 width=118) (actual time=0.124..141014.505 rows=7144115 loops=1)
Index Cond: (("timestamp" >= 1431100800) AND ("timestamp" <= 1431108000))
Filter: (numvalues[1] IS NOT NULL)
Rows Removed by Filter: 7090075
Total runtime: 219340.709 ms
(16 rows)
explain analyze select avg(coalesce(numvalues[9], 0))::NUMERIC(10,0) mean9, avg(coalesce(numvalues[30],0))::NUMERIC(10,0), avg(coalesce(numvalues[8],0))::NUMERIC(10,0) - avg(coalesce(numvalues[30], 0))::NUMERIC(10,0) mean0, avg(coalesce(numvalues[10],0))::NUMERIC(10,0) - avg(coalesce(numvalues[8], 0))::NUMERIC(10,0) mean1, avg(coalesce(numvalues[14],0))::NUMERIC(10,0) - avg(coalesce(numvalues[10], 0))::NUMERIC(10,0) mean2, avg(coalesce(numvalues[13],0))::NUMERIC(10,0) - avg(coalesce(numvalues[14], 0))::NUMERIC(10,0) mean3, avg(coalesce(numvalues[9],0))::NUMERIC(10,0) - avg(coalesce(numvalues[13], 0))::NUMERIC(10,0) mean4
from (select timestamp, id, numvalues, ntile(100) over (order by numvalues[1] ) pval from table where timestamp >= 1431093600.00 and timestamp <= 1431100800.00 and numvalues[9] NOTNULL) innerTable
where pval >= 90.00 and pval <= 90.00 ;
QUERY PLAN
--------------------------------------------------------------------------------
Aggregate (cost=12662077.32..12662077.37 rows=1 width=82) (actual time=650343.769..650343.770 rows=1 loops=1)
-> Subquery Scan on innertable (cost=12634854.54..12661968.84 rows=3615 width=82) (actual time=647745.962..650232.725 rows=71441 loops=1)
Filter: (((innertable.pval)::numeric >= 90.00) AND ((innertable.pval)::numeric <= 90.00))
Rows Removed by Filter: 7072674
-> WindowAgg (cost=12634854.54..12647507.88 rows=723048 width=248) (actual time=632388.293..642338.237 rows=7144115 loops=1)
-> Sort (cost=12634854.54..12636662.16 rows=723048 width=248) (actual time=599893.771..617413.102 rows=7144115 loops=1)
Sort Key: (table.numvalues[9])
Sort Method: external merge Disk: 3214248kB
-> Seq Scan on req_p0swajch2t (cost=0.00..12480460.48 rows=723048 width=248) (actual time=0.041..575423.062 rows=7144115 loops=1)
Filter: ((numvalues[1] IS NOT NULL) AND (("timestamp")::numeric >= 1431100800.00) AND (("timestamp")::numeric <= 1431108000.00))
Rows Removed by Filter: 138191935
Total runtime: 650785.126 ms
(12 rows)
谁能帮我解释为什么 Postgres 会对一个查询使用索引而不对另一个查询使用索引?运行 VACUUM ANALYZE 也无济于事。
有什么办法可以加快查询速度吗?查询整个表大约需要 20 - 30 分钟!分区并没有太大的区别,因为查询跨越多个分区,当跨越的分区数量变大时,它只显示了大约几分钟的改进。我有一个具有以下结构的 postgres 表:
+---------+-------------+-------------+----------+---------+---------+
| id | timestamp | numvalues | text1 | text2 | text3 |
+---------+-------------+-------------+----------+---------+---------+
|abcd12344| 4124135 |[1,2,53,1241]| apple | banana | papaya |
+---------+-------------+-------------+----------+---------+---------+
id - random alphanumeric value<br>
timestamp - epoch timestamp<br>
numvalues - array of integers<br>
text(n) - text values
该表大约有 1.5 亿行。
我进行内部查询以获取按数组中的一个值排序的数据的第 n 个百分位数。然后,我需要从数组中获取几个值的平均值。数组的长度在 31 左右。
SELECT AVG(COALESCE(numvalues[2], 0))::NUMERIC(10,0), AVG(COALESCE(numvalues[3], 0))::NUMERIC(10,0)...AVG(COALESCE(numvalues[12], 0))::NUMERIC(10,0)
FROM (SELECT timestamp, numvalues, ntile(100)
OVER (ORDER BY numvalues[1]) pval FROM tablename WHERE timestamp >= somevalue and timestamp <= somevalue) innertable
WHERE pval >= x and pval <= y;
这会返回 1.5 亿行中的大约 700 万行,大约占表的 5%。但是,它不使用索引。运行 EXPLAIN ANALYZE 表明它使用的是 Seq Scan,即使 enable_seqscan 设置为 off。
但是,类似的查询:
SELECT text1, count(distinct(id))
FROM (SELECT timestamp, id, text1, numvalues, ntile(100)
OVER (ORDER BY numvalues[1]) pval FROM tablename WHERE timestamp >= somevalue and timestamp <= somevalue) innertable
WHERE pval >= x and pval <= y GROUP BY text1;
确实使用索引。
索引在时间戳列上
EXPLAIN ANALYZE 的结果:
explain analyze select text1, count(distinct(id))
from (select timestamp, text1, numvalues, id, ntile(100) over (order by numvalues[1]) pval from table where timestamp >= 1431100800 and timestamp <= 1431108000 and numvalues[1] NOTNULL) innertable
where pval >= 90 and pval <= 90 group by text1;
QUERY PLAN
--------------------------------------------------------------------------------
GroupAggregate (cost=4554118.06..4554641.66 rows=1 width=28) (actual time=218641.221..219051.984 rows=20 loops=1)
-> Sort (cost=4554118.06..4554292.59 rows=69812 width=28) (actual time=218640.546..218728.294 rows=71441 loops=1)
Sort Key: innertable.text1
Sort Method: quicksort Memory: 8654kB
-> Subquery Scan on innertable (cost=4094722.75..4548501.27 rows=69812 width=28) (actual time=216502.946..218521.666 rows=71441 loops=1)
Filter: ((innertable.pval >= 90) AND (innertable.pval <= 90))
Rows Removed by Filter: 7072674
-> WindowAgg (cost=4094722.75..4339065.03 rows=13962416 width=118) (actual time=202276.333..211374.235 rows=7144115 loops=1)
-> Sort (cost=4094722.75..4129628.79 rows=13962416 width=118) (actual time=164912.487..190272.316 rows=7144115 loops=1)
Sort Key: (table.numvalues[9])
Sort Method: external merge Disk: 1387704kB
-> Index Scan using table_time_idx on table (cost=0.57..1578710.87 rows=13962416 width=118) (actual time=0.124..141014.505 rows=7144115 loops=1)
Index Cond: (("timestamp" >= 1431100800) AND ("timestamp" <= 1431108000))
Filter: (numvalues[1] IS NOT NULL)
Rows Removed by Filter: 7090075
Total runtime: 219340.709 ms
(16 rows)
explain analyze select avg(coalesce(numvalues[9], 0))::NUMERIC(10,0) mean9, avg(coalesce(numvalues[30],0))::NUMERIC(10,0), avg(coalesce(numvalues[8],0))::NUMERIC(10,0) - avg(coalesce(numvalues[30], 0))::NUMERIC(10,0) mean0, avg(coalesce(numvalues[10],0))::NUMERIC(10,0) - avg(coalesce(numvalues[8], 0))::NUMERIC(10,0) mean1, avg(coalesce(numvalues[14],0))::NUMERIC(10,0) - avg(coalesce(numvalues[10], 0))::NUMERIC(10,0) mean2, avg(coalesce(numvalues[13],0))::NUMERIC(10,0) - avg(coalesce(numvalues[14], 0))::NUMERIC(10,0) mean3, avg(coalesce(numvalues[9],0))::NUMERIC(10,0) - avg(coalesce(numvalues[13], 0))::NUMERIC(10,0) mean4
from (select timestamp, id, numvalues, ntile(100) over (order by numvalues[1] ) pval from table where timestamp >= 1431093600.00 and timestamp <= 1431100800.00 and numvalues[9] NOTNULL) innerTable
where pval >= 90.00 and pval <= 90.00 ;
QUERY PLAN
--------------------------------------------------------------------------------
Aggregate (cost=12662077.32..12662077.37 rows=1 width=82) (actual time=650343.769..650343.770 rows=1 loops=1)
-> Subquery Scan on innertable (cost=12634854.54..12661968.84 rows=3615 width=82) (actual time=647745.962..650232.725 rows=71441 loops=1)
Filter: (((innertable.pval)::numeric >= 90.00) AND ((innertable.pval)::numeric <= 90.00))
Rows Removed by Filter: 7072674
-> WindowAgg (cost=12634854.54..12647507.88 rows=723048 width=248) (actual time=632388.293..642338.237 rows=7144115 loops=1)
-> Sort (cost=12634854.54..12636662.16 rows=723048 width=248) (actual time=599893.771..617413.102 rows=7144115 loops=1)
Sort Key: (table.numvalues[9])
Sort Method: external merge Disk: 3214248kB
-> Seq Scan on req_p0swajch2t (cost=0.00..12480460.48 rows=723048 width=248) (actual time=0.041..575423.062 rows=7144115 loops=1)
Filter: ((numvalues[1] IS NOT NULL) AND (("timestamp")::numeric >= 1431100800.00) AND (("timestamp")::numeric <= 1431108000.00))
Rows Removed by Filter: 138191935
Total runtime: 650785.126 ms
(12 rows)
谁能帮我解释为什么 Postgres 会对一个查询使用索引而不对另一个查询使用索引?运行 VACUUM ANALYZE 也无济于事。
有什么办法可以加快查询速度吗?查询整个表大约需要 20 - 30 分钟!分区并没有太大的区别,因为查询跨越多个分区,并且当跨越的分区数量变大时,它只显示了大约几分钟的改进。
最佳答案
我猜你不能在评论中回复所以我必须发布一个答案。
Explain analyze
表明,您的时间戳列与数值 timestamp >= 1431093600.00 and timestamp <= 1431100800.00
进行了比较因此,它们被转换为数字:
Filter: ((numvalues[1] IS NOT NULL) AND (("timestamp")::numeric >= 1431100800.00) AND (("timestamp")::numeric <= 1431108000.00))
调查发生这种情况的原因并尝试修复它。
关于sql - Postgres 不使用索引,即使返回的行少于 5%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30706323/
关于我需要什么和我目前拥有什么的简短介绍 我连接到一个数据库并从中获取我的数据,然后我得到 ( Name , LongNumber) 并且基本上我有一个事件( Action )在事件发生时触发(这个
有人可以帮我分解一下吗?为什么不能用两次乘法来完成? 复数的乘法 如果计算所需的乘法次数被视为其难度的衡量标准,并且这些计算是使用复数执行的,那么很自然地会问需要多少次实数乘法才能实现评估复杂产品的实
使用 PHP 的 preg_match() 函数,我将如何匹配 2 到 5 个字符之间的单词?在这种情况下,字母保证是大写的 A-Z,并且每个 $word 变量中只有一个单词。 它必须拒绝一个 6 个
想知道是否可以在 SQL 中选择多于/少于 x 个字符的内容。 例如,我有一个员工表,我想显示姓名中包含超过 4 个字符的所有员工姓名。 这是一个示例表 ID EmpName Dept 1 John
我需要选择相同 order_ID 的所有值,其中第一个日期和最后一个日期之间的差异等于或小于 7,但我不知道我应该怎么做,可以吗给我一些帮助,我应该怎么做? 数据库布局: +-------------
我有“名称”JavaScript 变量。如果变量“名称”包含少于 4 个字符,我想执行行:msg('name','Your name must contain minimum 4 characters
我最大限度地简化了代码以使其可读。我没有对 Bootstrap 文件夹进行任何更改。所以这是“简化的”HTML 页面: 3
我已经为我的网站实现了 PayPal 延迟链接支付,但我只需要延迟 3 天,而不是默认的 90 天。有人可以告诉我是否可以修改 PHP 脚本以指示 3 天,如果可以,请告诉我我在代码中的何处进行了此指
我想在不到 1 毫秒的时间内调用线程休眠。我读到 thread.Sleep 和 Windows 操作系统都不支持它。 解决方案是什么? 对于所有想知道我为什么需要这个的人:我正在进行压力测试,想知道我
我有一个 html 文档,当 URL 长度小于 30 个字符时,我想隐藏其中的一些 id(在本例中为 id="test")。 var test = document.getElementById('t
所以,我创建了一个带有缩略图导航的 slider ,但是当它的幻灯片少于 5 个时,问题就开始出现了。 它不是只显示它应该显示的幻灯片,而是重复幻灯片以填充容器高度,并且垂直缩略图不会在单击时更改幻灯
我希望能够隐藏少于 3 个字符的列表项,我该怎么做?我下面的代码有什么问题? 我是 JavaScript/jQuery 新手。 jQuery().ready(function () { if
常识说,对于足够小的数组,插入排序是最好的。例如,Timsort对最多 64 个元素的数组使用(二进制)插入排序;来自 Wikipedia : Some divide-and-conquer algo
我从 Javascript 对象动态地将数据添加到表中。我有一个代码最终是这样的: 1 1 2 3 1 2 即使 tds 不存在,我也希望每一行都有表格边框。所以基本上对于代码中的示例
vs2005支持::stdext::hash_map::std::map. 然而,在我的测试中,::stdext::hash_map 的插入和删除 OP 似乎比::std::map 慢。(少于 100
我正在尝试使用 ViewPager 组件实现无限轮播。我基于 Antonyt 创建的那个但是使用少于 4 个 View 会出现问题。由于 View 已经到位。必须是一种欺骗 Viewpager 在不同
在这篇关于 falsehoods programmers believe about time 的有趣文章中,其中之一是 Thread.sleep(1000) sleeps for >= 1000 m
我需要编写模拟真实用户交互的加特林场景。它应该偶尔发出一些请求,例如每个用户每小时 10 个(总共 20 个用户)。 根据我在文档中看到的,constantUsersPerSec接受 double ,
我正在尝试使用只有 7 列的网格创建日历。我想让这 7 列均匀分布并适合整行。目前,7 列加起来不等于 12,我得到 12 列,其中 5 列是空的。 Bootstrap 3 中是否有办法让所有 7 个
我有一个 170k 行的 .txt 文件。我正在将 txt 文件导入 Pandas 。 每行都有许多用逗号分隔的值。 我想提取具有 9 个值的行。 我目前正在使用: data = pd.read_cs
我是一名优秀的程序员,十分优秀!