- 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/
SQL、PL-SQL 和 T-SQL 之间有什么区别? 谁能解释一下这三者之间的区别,并提供每一个的相关使用场景? 最佳答案 SQL 是一种对集合进行操作的查询语言。 它或多或少是标准化的,几乎所有关
这个问题已经有答案了: What is the difference between SQL, PL-SQL and T-SQL? (6 个回答) 已关闭 9 年前。 我对 SQL 的了解足以完成我的
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列有一个默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任
我有一个可能属于以下类型的字符串 string expected result 15-th-rp 15 15/12-rp 12 15-12-th
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我有一个存储过程(称为 sprocGetArticles),它从文章表中返回文章列表。这个存储过程没有任何参数。 用户可以对每篇文章发表评论,我将这些评论存储在由文章 ID 链接的评论表中。 有什么方
我目前正在做一个 *cough*Oracle*cough* 数据库主题。讲师介绍embedded SQL作为让其他语言(例如 C、C++)与(Oracle)数据库交互的方式。 我自己做了一些数据库工作
SQL Server 中 SQL 语句的最大长度是多少?这个长度是否取决于 SQL Server 的版本? 例如,在 DECLARE @SQLStatement NVARCHAR(MAX) = N'S
这个问题已经有答案了: Simple way to transpose columns and rows in SQL? (9 个回答) 已关闭 8 年前。 CallType
预先感谢您对此提供的任何帮助。 假设我有一个查询,可以比较跨年的数据,从某个任意年份开始,永无止境(进入 future ),每年同一时期直到最后一个完整的月份(其特点是一月数据永远不会显示至 2 月
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列的默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任何数
下面是我试图用来检查存储过程是否不存在然后创建过程的 sql。它会抛出一个错误:Incorrect syntax near the keyword 'PROCEDURE' IF NOT EXISTS
我有一个同事声称动态 SQL 在许多情况下比静态 SQL 执行得更快,所以我经常看到 DSQL 到处都是。除了明显的缺点,比如在运行之前无法检测到错误并且更难阅读,这是否准确?当我问他为什么一直使用
来自 lobodava 的动态 SQL 查询是: declare @sql nvarchar(4000) = N';with cteColumnts (ORDINAL_POSITION, CO
使用 SQL Server 中的存储过程执行动态 SQL 命令的现实优点和缺点是什么 EXEC (@SQL) 对比 EXEC SP_EXECUTESQL @SQL ? 最佳答案 sp_executes
我有这个有效的 SQL 查询: select sum(dbos.Points) as Points, dboseasons.Year from dbo.StatLines dbos i
我正在调试一些构建成功运行的 SQL 命令的代码。 然而,在查询结束时,查询结果似乎被写入了一个文本文件。 完整的查询如下 echo SELECT DATE,DATETABLE,DATE,APPDAT
我有一些创建表的 .sql 文件(MS SQL 数据库): 表_1.sql: IF OBJECT_ID (N'my_schema.table1', N'U') IS NOT NULL DROP TAB
我写了下面的 SQL 存储过程,它一直给我错误@pid = SELECT MAX(... 整个过程是: Alter PROCEDURE insert_partyco @pname varchar(20
我在 SQL Server 2005 中有包含两列 Fruit 和 Color 的表,如下所示 Fruit Colour Apple Red Orange
我是一名优秀的程序员,十分优秀!