- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在新硬件上将 Postgres 从 8.3.8 升级到 9.4.1。一组有代表性的查询表明,新系统的性能范围提高了 1 倍到 3 倍。但是,我们的高负载区域之一总是较慢。
EXPLAIN
输出8.3.8:
Nested Loop (cost=25.78..709859.61 rows=1 width=4) (actual time=14.972..190.591 rows=32 loops=1)
-> Bitmap Heap Scan on prime p (cost=25.78..1626.92 rows=1066 width=4) (actual time=1.567..9.597 rows=10742 loops=1)
Recheck Cond: ((pid = ANY ('{28226,53915,83421,82118397,95513866}'::integer[])) AND (tid = ANY ('{1,2,3}'::integer[])))
Filter: (NOT deleted)
-> Bitmap Index Scan on FOO_IDX1 (cost=0.00..25.73 rows=1066 width=0) (actual time=1.144..1.144 rows=10742 loops=1)
Index Cond: ((pid = ANY ('{28226,53915,83421,82118397,95513866}'::integer[])) AND (deleted = false) AND (tid = ANY ('{1,2,3}'::integer[])))
-> Index Scan using FOO_IDX2 on data d (cost=0.00..663.88 rows=1 width=4) (actual time=0.017..0.017 rows=0 loops=10742)
Index Cond: (d.pid = p.pid)
Filter: (lower("substring"(d.value, 1, 1000)) ~~ '%something%'::text)
Total runtime: 190.639 ms
9.4.1:
Nested Loop (cost=1.15..335959.94 rows=1 width=4) (actual time=24.712..365.057 rows=32 loops=1)
-> Index Scan using FOO_IDX1 on prime p (cost=0.57..953.17 rows=1033 width=4) (actual time=0.048..13.884 rows=10741 loops=1)
Index Cond: ((pid = ANY ('{28226,53915,83421,82118397,95513866}'::integer[])) AND (deleted = false) AND (tid = ANY ('{1,2,3}'::integer[])))
Filter: (NOT deleted)
-> Index Scan using FOO_IDX2 on data d (cost=0.57..324.29 rows=1 width=4) (actual time=0.032..0.032 rows=0 loops=10741)
Index Cond: (pid = p.pid)
Filter: (lower("substring"(value, 1, 1000)) ~~ '%something%'::text)
Rows Removed by Filter: 11
Planning time: 0.940 ms
Execution time: 365.156 ms
…btree (pid);
…btree (lower("substring"(value, 1, 1000)) text_pattern_ops, fid);
…btree (lower("substring"(value, 1, 1000)), fid);
改变以下范围并没有改善这种情况……
checkpoint_completion_target = 0.5
checkpoint_segments = 32
checkpoint_timeout = 30min
cpu_index_tuple_cost = 0.005
cpu_operator_cost = 0.0025
cpu_tuple_cost = 0.01
default_statistics_target = 500 (evaluated 100 to 10000 analyse after each)
effective_cache_size = 288GB
enable_seqscan = off
from_collapse_limit = 8
geqo = off
join_collapse_limit = 8
random_page_cost = 1.0
seq_page_cost = 1.0
shared_buffers = 96GB
work_mem = 64MB
我们也看到了 something%
的类似结果。
在我们将其投入几年之前,我想知道我是否可以做更多的事情来优化这些重要案例。
SELECT p.pid
FROM prime p
INNER JOIN data d ON p.pid = d.pid
WHERE LOWER(substring(d.value,1,1000)) LIKE '%something%'
AND p.tid IN (1,2,3)
AND p.deleted = FALSE
AND p.ppid IN (28226, 53915, 83421, 82118397, 95513866)
简化和净化。
\d prime
Column | Type | Modifiers
---------------+-----------------------------+-------------------------------------------------
pid | integer | not null default nextval('prime_seq'::regclass)
deleted | boolean |
ppid | integer |
tid | integer |
\d data
Column | Type | Modifiers
----------------+---------+------------------------------------------------------
pdid | integer | not null default nextval('data_seq'::regclass)
pid | integer |
value | text |
我尝试了一系列 default_statistics_target。
default_statistics_target = 100 @ 381 ms
default_statistics_target = 500 @ 387 ms
default_statistics_target = 1000 @ 384 ms
default_statistics_target = 5000 @ 369 ms
(在测试周期之间进行分析和预热)
这个值可以对我们应用程序的其他领域产生重大影响。 500 似乎是理想的,5000+ 导致其他区域减速 3 到 10 倍。
我们的工具包的设计使得整个数据库应该始终在内存中。
random_page_cost = 1.0 @ 372 ms
random_page_cost = 1.1 @ 372 ms
random_page_cost = 4.0 @ 370 ms
random_page_cost = 10.0 @ 369 ms
使用 enable_bitmapscan = off @ 362 ms(结果与预期的计划相同)
早些时候我也尝试过 enable_indexscan = off @ 491 ms(当然触发了不同的计划)
是的,pg 8.3 的计划使用索引和位图索引扫描——我认为这是这个问题的“核心”。
感谢您提供指向相关文章的链接。
关于列顺序的建议非常有趣。
在我们的规模和不断增长的情况下,以下模式的最佳字段顺序是什么?
重组加载表上的列顺序以实现 yield 的最有效方法是什么?
主要有:
integer
text
boolean
boolean
integer
integer
smallint
integer
timestamp without time zone
timestamp without time zone
timestamp without time zone
text
数据有:
integer
integer
integer
text
SELECT pid
FROM data d
JOIN prime p USING (pid)
WHERE LOWER(substring(d.value,1,1000)) LIKE '%something%'
AND p.ppid IN (28226, 53915, 83421, 82118397, 95513866)
AND p.tid IN (1, 2, 3)
AND p.deleted = FALSE;
lower(substring(d.value,1,1000)) = 355 ms
lower(left(d.value,1000)) = 343 ms (~3% faster over multiple tests, I'll take that!)
为了处理 unanchored 情况,我们有第二个索引,使用运算符类“text_pattern_ops”。
我们之前评估过多列 GIN 索引,但没有实现预期的好处。复杂,因为 A) 在 acl、状态等方面满足多个标准,B) 需要命中“精确短语”,这需要重新检查结果短语。我对长期使用全文方法持乐观态度,到目前为止我们尝试过的方法并不比老派的 BTREE 方法;还没有。
Gin 试验 1
CREATE EXTENSION btree_gin
CREATE INDEX FOO_IDX3 ON data USING GIN (to_tsvector('simple', lower(left(value, 1000))), pid)
ANALYSE data
SELECT p.pid
FROM prime p
INNER JOIN data d ON p.pid = d.pid
WHERE to_tsvector('simple', lower(left(d.value, 1000))) @@ to_tsquery('simple', 'something')
AND p.tid IN (1,2,3)
AND p.deleted = FALSE
AND p.ppid IN (28226, 53915, 83421, 82118397, 95513866)
Execution time: 1034.866 ms (without phrase recheck)
Gin 试验 2
CREATE EXTENSION pg_trgm
CREATE INDEX FOO_IDX4 ON data USING gin (left(value,1000) gin_trgm_ops, pid);
ANALYSE data
SELECT p.pid
FROM prime p
INNER JOIN data d ON p.pid = d.pid
WHERE left(d.value,1000) LIKE '%Something%'
AND p.tid IN (1,2,3)
AND p.deleted = FALSE
AND p.ppid IN (28226, 53915, 83421, 82118397, 95513866)
Hash Join (cost=2870.42..29050.89 rows=1 width=4) (actual time=668.333..2262.101 rows=32 loops=1)
Hash Cond: (d.pid = p.pid)
-> Bitmap Heap Scan on data d (cost=230.30..26250.04 rows=25716 width=4) (actual time=653.130..2234.736 rows=38659 loops=1)
Recheck Cond: ("left"(value, 1000) ~~ '%Something%'::text)
Rows Removed by Index Recheck: 146677
Heap Blocks: exact=161810
-> Bitmap Index Scan on FOO_IDX4 (cost=0.00..223.87 rows=25716 width=0) (actual time=575.442..575.442 rows=185336 loops=1)
Index Cond: ("left"(value, 1000) ~~ '%Something%'::text)
-> Hash (cost=2604.33..2604.33 rows=2863 width=4) (actual time=15.158..15.158 rows=10741 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 378kB
-> Index Scan using FOO_IDX4 on prime p (cost=0.57..2604.33 rows=2863 width=4) (actual time=0.064..11.737 rows=10741 loops=1)
Index Cond: ((ppid = ANY ('{28226,53915,83421,82118397,95513866}'::integer[])) AND (deleted = false) AND (tid = ANY ('{1,2,3}'::integer[])))
Filter: (NOT deleted)
Planning time: 1.861 ms
Execution time: 2262.210 ms
我们已经有一个关于 prime 的索引 w/“ppid、deleted、tid”,抱歉,这最初并不清楚。
最佳答案
糟糕的查询计划最常见的原因是统计数据或成本设置不能很好地代表现实:
random_page_cost = 1.0
的设置只有在随机访问实际上与顺序访问一样快的情况下才有意义,这只有在您的数据库完全驻留在 RAM 中时才成立。具有 80M 和 750M 行表的数据库可能太大了。如果我的假设是正确的,稍微提高成本设置可能会解决问题。 至少 1.1
尝试,可能更多。运行测试以找到设置中的最佳点。
通常我会先运行:
SET enable_bitmapscan = off;
在 pg 9.4 的当前 session 中,然后再次测试。棘手的部分是您的查询可能需要:索引扫描和位图索引扫描。我需要查看查询。
random_page_cost
的极低设置有利于索引扫描而不是位图索引扫描。如果该成本设置具有误导性,您将获得劣质查询计划。
dba.SE 上这个相关问题的答案有更多解释:
您的表设计已简化,但通常最好不要在整数列之间放置 bool 列*,因为这样会浪费磁盘空间来填充。更好:
pid | integer | not null default nextval('prime_seq'::regclass)
tid | integer |
deleted | boolean |
这只是一个小改进,但没有任何缺点。
可以通过多种方式改进:
SELECT pid
FROM data d
JOIN prime p USING (pid)
WHERE left(d.value,1000) LIKE '%something%'
AND p.pid IN (28226, 53915, 83421, 82118397, 95513866)
AND p.tid IN (1, 2, 3)
AND p.deleted = FALSE;
left(d.value,1000)
比 substring(d.value,1,1000)
更短更快(需要 pg 9.1+)。
text_pattern_ops
索引仅对使用 LIKE
的左锚定模式匹配有用。你的表情没有固定下来。 (我看到你也在使用锚定模式。)为此,使用附加模块 pg_trgm
提供的三元组 GIN 索引。这对于大表来说非常更快,尤其是在 pg 9.4 中(改进的 GIN 索引)。
要在下面的 GIN 索引中包含 integer
列 pid
,首先安装附加模块 btree_gin
,它提供了必要的 GIN 运算符类。 每个数据库运行一次:
CREATE EXTENSION btree_gin;
做出一些假设,这将非常适合您的查询。 data
上的多列 trigram GIN 索引:
CREATE INDEX data_value_gin_trgm_idx ON data
USING gin (left(value,1000) gin_trgm_ops, pid);
prime
上的部分多列索引:
CREATE INDEX prime_pid_tip_idx ON prime (pid, tip)
WHERE deleted = FALSE;
在这里谈论数量级。
关于performance - Postgres 8.3 中的位图扫描比索引扫描 Postgres 9.4 快 2 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29137610/
我想填充 3D 等高线图 (contour3(X,Y,Z)),就像 2D 等高线填充图 (contourf(X,Y,Z))。但我无法弄清楚如何实现这一目标。 contour3 和 surf 的组合不是
我有一个 c3.js 折线图,表示 2 个值的演变。我需要折线图的工具提示是饼图(工具提示 = 另一个 c3.js 图形)。 这是我成功的: http://jsfiddle.net/owhxgaqm/
我有具有结构的 Pandas 数据框: A B 0 1 1 1 2 1 2 3 4 3 3 7 4 6 8 如何生成 Seaborn Violin 图,每列作为其自己的单独
我正在使用 D3DXSPRITE 方法将我的 map 图 block 绘制到屏幕上,我刚刚添加了一个缩放功能,当您按住向上箭头时会放大,但注意到您现在可以看到图 block 之间的间隙,这是一些屏幕截
1、系统环境如下图: 2、为该系统添加一块新的虚拟硬盘,添加后需重启虚拟机,否则系统不识别;如下图,/dev/sdc 是新添加的硬盘; 3、fdisk /dev/sdc为新硬盘创建分区:
1、nagios简介 nagios是一款开源的电脑系统和网络监视工具,能有效监控windows、linux和unix的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发
越来越多人开始习惯用手机上网,浏览网页、查看邮件···移动化已经成为互联网发展必然趋势,包括facebook在内的很多互联网公司都将移动广告作为下一个淘金地
1.图片处理 1.圆角图片 复制代码 代码如下: /** * 转换成圆角 * &n
Microsoft SQL Server Management Studio是SQL SERVER的客户端工具,相信大家都知道。我不知道大伙使用导入数据的情况怎么样,反正我最近是遇到过。主要是因为没
debian6系统: 首先先安装mysql吧: 打开终端(root)用户登入 apt-get purge mysql-server-5.5 安装完成后: 默认情况下Mysql只允许本地登录
fedora16英文环境下支持中文输入法的方法 fedora16英文环境下支持FCITX的中文输入法: $ im-chooser 就会出现选择界面,选择第二个就行了。
Net预编译命令 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -? 显示说明 我们需要选择的命令为&n
有的时候电脑出现一些故障有的时候通过将其修改bios设置的方法来解决故障,那么在bios上设置能不能将电脑恢复出厂设置呢?其实也是可以的。方法也很简单的,只要会进入电脑的bios懂的上面英文的意思就
笔者曾介绍过Deepin 将对龙芯进行全面支持,打造最优美龙芯电脑桌面。现在Deepin团队移植工作取得了突破性的成果,Deepin桌面已经在龙芯3A和龙芯3B电脑上成功运行起来了。 以下为龙芯3
在安装一些软件之后,我们的电脑总是会发生一点小变化,不是桌面上多了几个网址图标,就是IE浏览器的默认主页被篡改成乱七八糟的网址。最可气的是,在IE设置中将默认主页改回来后,下次启动Win7后又变了回
“注册表编辑器怎么打开”虽说不是很难的问题,但是对于对电脑常识不是很擅长的网民来说,当电脑出现问题或需要更改设置时,着实还是件头疼的问题。因为需要打开注册表进行操作解决。那么如何打开注册表编辑器呢?
这篇文章重点介绍10个重要的WordPress安全插件和技巧,用来保护WordPress网站或者博客。 1. WP Security 人工帮助你修复被黑客入侵的网站,只要按照他们网站上的联系电话
其实运用object和javascript调用外部文件,也能实现不同栏目调用不同友情链接,即相当于调用不同栏目友情链接文件, {dede:field.typeid/}来获取当前栏目的ID。
我有一个复值矩阵。 如果我发出命令: plot(myMatrix) 然后它在图形设备上显示一种散点图,X 轴标记为 Re(myMatrix),Y 轴标记为 Im(myMatrix)。这显示了我正在寻找
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
我是一名优秀的程序员,十分优秀!