- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试在 Windows Server 2012 上的 Azure VM 上运行 postgres 9.3。我最初是在 7GB 服务器上运行它……我现在在 14GB Azure VM 上运行它。在尝试解决下面描述的问题时,我加大了尺寸。
顺便说一句,我对 posgresql 很陌生,所以我只是一点一点地了解配置选项。此外,虽然我很想在 Linux 上运行它,但我和我的同事根本不具备在 Linux 出现问题时解决问题的专业知识,因此 Windows 是我们唯一的选择。
问题描述:
我有一个名为 test_table 的表;它目前存储了大约 9000 万行。它将每月增长大约 3-4 百万行。 test_table 中有 2 列:
id (bigserial)
url (charachter varying 300)
我在从几个 CSV 文件导入数据后创建了索引。两列都已编入索引.... id 是主键。 url 上的索引是通过 pgAdmin 使用默认值创建的普通 btree。
当我运行时:
SELECT sum(((relpages*8)/1024)) as MB FROM pg_class WHERE reltype=0;
...总大小为5980MB
这里涉及到的2个索引各自的大小如下,我是通过运行得到的:
# SELECT relname, ((relpages*8)/1024) as MB, reltype FROM pg_class WHERE
reltype=0 ORDER BY relpages DESC LIMIT 10;
relname | mb | reltype
----------------------------------+------+--------
test_url_idx | 3684 | 0
test_pk | 2161 | 0
其他较小的表上还有其他索引,但它们很小(< 5MB)....所以我在这里忽略它们
使用 url 查询 test_table 时,特别是在搜索中使用通配符时,问题在于速度(或缺乏速度)。例如
select * from test_table where url like 'orange%' limit 20;
...运行需要 20-40 秒。
对上面的内容运行 explain analyze 得到以下结果:
# explain analyze select * from test_table where
url like 'orange%' limit 20;
QUERY PLAN
-----------------------------------------------------------------
Limit (cost=0.00..4787.96 rows=20 width=57)
(actual time=0.304..1898.583 rows=20 loops=1)
-> Seq Scan on test_table (cost=0.00..2303247.60 rows=9621 width=57)
(actual time=0.302..1898
.542 rows=20 loops=1)
Filter: ((url)::text ~~ 'orange%'::text)
Rows Removed by Filter: 210286
Total runtime: 1898.650 ms
(5 rows)
再举一个例子……这次是 american 和 .com 之间的通配符……
# explain select * from test_table where url
like 'american%.com' limit 50;
QUERY PLAN
-------------------------------------------------------
Limit (cost=0.00..11969.90 rows=50 width=57)
-> Seq Scan on test_table (cost=0.00..2303247.60 rows=9621 width=57)
Filter: ((url)::text ~~ 'american%.com'::text)
(3 rows)
# explain analyze select * from test_table where url
like 'american%.com' limit 50;
QUERY PLAN
-----------------------------------------------------
Limit (cost=0.00..11969.90 rows=50 width=57)
(actual time=83.470..3035.696 rows=50 loops=1)
-> Seq Scan on test_table (cost=0.00..2303247.60 rows=9621 width=57)
(actual time=83.467..303
5.614 rows=50 loops=1)
Filter: ((url)::text ~~ 'american%.com'::text)
Rows Removed by Filter: 276142
Total runtime: 3035.774 ms
(5 rows)
然后我从 7GB 的服务器升级到 14GB 的服务器。查询速度也好不到哪里去。
服务器上的观察
postgresql.conf 文件与默认值相比只有几处变化。请注意,我从以下博客文章中获取了其中一些建议:http://www.gabrielweinberg.com/blog/2011/05/postgresql.html .
对 conf 的更改:
shared_buffers = 512MB
checkpoint_segments = 10
(我更改了 checkpoint_segments,因为我在加载 CSV 文件时收到很多警告...尽管生产数据库不会非常写入密集型,因此如果需要可以将其改回 3...)
cpu_index_tuple_cost = 0.0005
effective_cache_size = 10GB # recommendation in the blog post was 2GB...
在服务器本身的任务管理器 -> 性能选项卡中,以下可能是可以提供帮助的相关位:
CPU:很少超过 2%(无论运行什么查询......当我导入一个 6GB CSV 文件时它达到 11%)
内存:1.5/14.0GB (11%)
关于内存的更多细节:
问题
感谢阅读。
最佳答案
这些 seq 扫描让您看起来好像在导入数据后没有在表上运行 analyze
。
http://www.postgresql.org/docs/current/static/sql-analyze.html
在正常操作期间,安排运行 vacuum analyze
没有用,因为 autovacuum 会定期启动。但在进行大量写入时(例如导入期间),这很重要。
关于一个稍微相关的说明,请参阅 Pavel 的 PostgreSQL 技巧站点上的反向索引提示,如果您需要在末尾而不是在开头运行锚定查询,例如喜欢'%.com'
http://postgres.cz/wiki/PostgreSQL_SQL_Tricks_I#section_20
关于您的实际问题,请注意您喜欢的帖子中的一些建议充其量是可疑的。更改索引使用的成本经常是可疑的,禁用 seq 扫描是彻头彻尾的愚蠢。 (有时,seq 扫描表比使用索引更便宜。)
话虽这么说:
分析
。为 Postgres 提供足够的内存当然也会增加它在内存中的可能性,但请记住后一点。有关微调的进一步阅读,请参阅手册和:
http://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server
关于您的架构的最后两个注释:
varchar(300)
和没有指定长度(或 text
,例如那件事)是对长度的额外检查约束。如果您实际上并不需要数据来适应该大小并且只是出于习惯而无缘无故地这样做,那么通过摆脱该约束,您的数据库插入和更新将运行得更快。关于sql - Postgresql:如何确保索引在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20975802/
这几天我一直在努力。我一直在自学 CSS,所以对菜鸟好一点。我正在创建一个推荐 slider 。推荐以 3 个 block 显示。我希望前 2 个下降,第 3 个上升。但是当 slider 激活时,无
我最近开始学习 Nodejs,现在我很困惑我的网络应用程序使用什么,html 还是 ejs (Express)。 Ejs 使用 Express 模块,而 .html 使用 HTML 模块。我的第一个问
假设我们有一个 PostgreSQL 表contacts,每条记录都有一堆带标签的电子邮件地址(标签和电子邮件对)——其中一个是“主要”。 存储方式如下: id 主键 电子邮件 文本 email_la
我成功为一种新的tesseract语言编写了traineddata文件,但是当我完成时,我继续收到以下错误: index >= 0 && index = 0 && 索引 < size_used_ :E
这个问题已经有答案了: How to deal with SettingWithCopyWarning in Pandas (21 个回答) 已关闭 4 年前。 假设我有一个像这样的数据框,第一列“密
如果我有一个位置或行/列同时用于 A 和 B 位置,请检查 B 是否与 A 成对角线? 1 2 3 4 5 6 7 8 9 例如,我如何检查 5 是否与 7 成对角线? 此外,如果我检查 4 是
MongoDB:索引 一、 创建索引 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引 > db.user.getIndexes() [ { "v
一、索引介绍 索引是一种用来快速查询数据的数据结构。 B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree 做索引,索引创建在colletions上。 MongoDB不使用索引
我无法决定索引。 就像我有下面的查询需要太多时间来执行: select count(rn.NODE_ID) as Count, rnl.[ISO_COUNTRY_CODE] as Cou
我有这些表: CREATE TABLE `cstat` ( `id_cstat` bigint(20) NOT NULL, `lang_code` varchar(3) NOT NULL,
我正在尝试找到一种方法来提高包含 IP 范围的 mysql 表的性能(在高峰时段每秒最多有 500 个 SELECT 查询(!),所以我有点担心)。 我有一个这种结构的表: id smallint(
jquery index() 似乎无法识别元素之一,总是说“无法读取未定义的属性‘长度’”这是我的代码。mnumber 是导致问题的原因。我需要 number 和 mnumber 才能跟踪使用鼠标,并
我们有一个包含近 4000 万条记录的 MongoDB 集合。该集合的当前大小为 5GB。此集合中存储的数据包含以下字段: _id: "MongoDB id" userid: "user id" (i
文档说:如果你有多个字段的复合索引,你可以用它来查询字段的开始子集。所以如果你有一个索引一个,乙,丙你可以用它查询一种一个,乙a,b,c 我的问题是,如果我有一个像这样的复合索引一个,乙,丙我可以查询
我正在使用 $('#list option').each(function(){ //do stuff }); 循环列表中的选项。我想知道如何获取当前循环的索引? 因为我不想让 var i = 0;循
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL
SQLite 索引(Index) 索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。
我是 RavenDB 的新手。我正在尝试使用多 map 索引功能,但我不确定这是否是解决我的问题的最佳方法。所以我有三个文件:Unit、Car、People。 汽车文件看起来像这样: { Id: "
我有以下数据,我想根据范围在另一个表中建立索引 我想要实现的是,例如,如果三星的销售额为 2500,则折扣为 2%,低于 3000 且高于 1000 我知道它可以通过索引来完成,与多个数组匹配,然后指
我正在检查并删除 SQL 数据库中的重复和冗余索引。 所以如果我有两个相同的索引,我会删除。 例如,如果我删除了重叠的索引... 索引1:品牌、型号 指标二:品牌、型号、价格 我删除索引 1。 相同顺
我是一名优秀的程序员,十分优秀!