假设我有一个包含字段A和的表B。我在A+上进行常规查询B,所以我在 上创建了一个复合索引(A,B)。A复合索引是否也会对查询进行全面优化?
此外,我在 上创建了一个索引A,但 Postgres 仍然只使用复合索引来查询A。如果前面的答案是肯定的,我想这并不重要,但是为什么它默认选择复合索引,如果单个A索引可用?
我们的系统写入了大量数据(一种大数据系统)。写入性能足以满足我们的需求,但读取性能真的太慢了。
我们所有表的主键(约束)结构都相似:
timestamp(Timestamp) ; index(smallint) ; key(integer).
Run Code Online (Sandbox Code Playgroud)
一个表可以有数百万行,甚至数十亿行,而一个读请求通常是针对特定时间段(时间戳/索引)和标记的。查询返回大约 20 万行是很常见的。目前,我们每秒可以读取大约 15k 行,但我们需要快 10 倍。这是可能的,如果是,如何?
注意: PostgreSQL 是和我们的软件一起打包的,所以不同客户端的硬件是不一样的。
它是一个用于测试的虚拟机。VM 的主机是具有 24.0 GB RAM 的 Windows Server 2008 R2 x64。
Server 2008 R2 x64
2.00 GB of memory
Intel Xeon W3520 @ 2.67GHz (2 cores)
Run Code Online (Sandbox Code Playgroud)
postgresql.conf 优化shared_buffers = 512MB (default: 32MB)
effective_cache_size = 1024MB (default: 128MB)
checkpoint_segment = 32 (default: 3)
checkpoint_completion_target = 0.9 (default: 0.5)
default_statistics_target = 1000 (default: 100)
work_mem = 100MB (default: 1MB)
maintainance_work_mem = 256MB …Run Code Online (Sandbox Code Playgroud) 我正在使用 PostgreSQL (9.4) 数据库在 Ruby on Rails 中开发应用程序。对于我的用例,表中的列将被非常频繁地查找,因为应用程序的重点是在模型上搜索非常具体的属性。
我目前正在决定是对列使用integer类型还是简单地使用典型的字符串类型(例如character varying(255),这是 Rails 中的默认值),因为我不确定索引上的性能差异是什么。
这些列是 enums。对于它们可以拥有的可能值的数量,它们具有固定的大小。大多数枚举长度不超过 5,这意味着索引在应用程序的整个生命周期中或多或少是固定的;因此,整数和字符串索引在节点数上是相同的。
但是,将被索引的字符串可能有大约 20 个字符长,在内存中大约是整数的 5 倍(如果一个整数是 4 个字节,并且字符串是纯 ASCII 每个字符 1 个字节,那么这成立)。我不知道数据库引擎如何进行索引查找,但是如果它需要“扫描”字符串直到它完全匹配,那么本质上这意味着字符串查找将比整数查找慢 5 倍;整数查找匹配之前的“扫描”将是 4 个字节而不是 20 个。这就是我的想象:
查找值为(整数)4:
扫描………………………………………………………………………………………………………………………………………… 正在获取记录... |BYTE_1|BYTE_2|BYTE_3|BYTE_4|BYTE_5|BYTE_6|BYTE_7|BYTE_8|...|
查找值是(字符串)“some_val”(8 个字节):
扫描................................................. …………………………………………………………………………………………………………………………………………………………………… 正在获取记录... |BYTE_1|BYTE_2|BYTE_3|BYTE_4|BYTE_5|BYTE_6|BYTE_7|BYTE_8|...|
我希望这是有道理的。基本上,因为整数占用更少的空间,它可以比它的字符串对应物更快地“匹配”。也许这是一个完全错误的猜测,但我不是专家,所以这就是我问你们的原因!我想我刚刚找到的这个答案似乎支持我的假设,但我想确定一下。
列中可能值的数量在使用任何一个时都不会改变,因此索引本身不会改变(除非我向枚举添加了一个新值)。在这种情况下,使用integeror会有性能差异varchar(255),还是使用整数类型更有意义?
我问的原因是 Rails 的enum类型将整数映射到字符串键,但它们并不是面向用户的列。本质上,您无法验证枚举值是否有效,因为无效值会ArgumentError在运行任何验证之前导致。使用string类型将允许验证,但如果存在性能成本,我宁愿绕过验证问题。
我有一个带有多列索引的表,我怀疑索引的正确排序以获得最大查询性能。
场景:
PostgreSQL 8.4,大约有一百万行的表
c1列中的值可以有大约100 个不同的值。我们可以假设这些值是均匀分布的,因此每个可能的值大约有 10000 行。
列c2可以有1000 个不同的值。对于每个可能的值,我们有 1000 行。
搜索数据时,条件始终包含这两列的值,因此该表具有组合 c1 和 c2 的多列索引。如果您的查询仅使用一列进行过滤,我已经阅读了正确排序多列索引中的列的重要性。在我们的场景中,情况并非如此。
我的问题是这个:
鉴于其中一个过滤器选择的数据集要小得多,如果第一个索引是最具选择性的索引(允许更小的数据集),我是否可以提高性能?在我看到参考文章中的图形之前,我从未考虑过这个问题:

图片取自有关多列索引的参考文章。
查询使用两列中的值进行过滤。我没有仅使用一列进行过滤的查询。他们都是:WHERE c1=@ParameterA AND c2=@ParameterB。还有这样的条件:WHERE c1 = "abc" AND c2 LIKE "ab%"
问这个问题,特别是针对 Postgres,因为它对 R 树/空间索引有很好的支持。
我们有下表,其中包含单词及其频率的树结构(嵌套集模型):
lexikon
-------
_id integer PRIMARY KEY
word text
frequency integer
lset integer UNIQUE KEY
rset integer UNIQUE KEY
Run Code Online (Sandbox Code Playgroud)
和查询:
SELECT word
FROM lexikon
WHERE lset BETWEEN @Low AND @High
ORDER BY frequency DESC
LIMIT @N
Run Code Online (Sandbox Code Playgroud)
我认为覆盖索引(lset, frequency, word)会很有用,但我觉得如果范围内的lset值太多,它可能表现不佳(@High, @Low)。
(frequency DESC)有时,当使用该索引的搜索早期产生@N与范围条件匹配的行时,一个简单的索引也可能就足够了。
但似乎性能在很大程度上取决于参数值。
有没有办法让它快速执行,不管范围(@Low, @High)是宽还是窄,也不管高频词是否幸运地在(窄)选择的范围内?
R-tree/空间索引有帮助吗?
添加索引,重写查询,重新设计表,没有限制。
postgresql performance index database-design query-performance
我正在尝试确定哪些索引用于带有WHERE条件的 SQL 查询,GROUP BY而当前运行速度很慢。
我的查询:
SELECT group_id
FROM counter
WHERE ts between timestamp '2014-03-02 00:00:00.0' and timestamp '2014-03-05 12:00:00.0'
GROUP BY group_id
Run Code Online (Sandbox Code Playgroud)
该表目前有 32.000.000 行。当我增加时间范围时,查询的执行时间会增加很多。
有问题的表如下所示:
CREATE TABLE counter (
id bigserial PRIMARY KEY
, ts timestamp NOT NULL
, group_id bigint NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我目前有以下索引,但性能仍然很慢:
CREATE INDEX ts_index
ON counter
USING btree
(ts);
CREATE INDEX group_id_index
ON counter
USING btree
(group_id);
CREATE INDEX comp_1_index
ON counter
USING btree
(ts, group_id);
CREATE INDEX comp_2_index
ON counter …Run Code Online (Sandbox Code Playgroud) postgresql performance index optimization postgresql-9.3 query-performance
我在 SQL 中对电气原理图建模时遇到了一些麻烦。我想捕获的结构是
part ??????????? pin
? ?
part_inst ?????? pin_inst
Run Code Online (Sandbox Code Playgroud)
其中“inst”是“instance”的缩写。
例如,我可能part将 LM358 运算放大器pin用作 1OUT、1IN-、1IN+、GND、2IN+、2IN-、2OUT 和 V CC。然后我可能会将这部分放在原理图上,创建 apart_inst和 8
pin_insts。
忽略数据字段,我对模式的最初尝试是
create table parts (
part_id bigserial primary key
);
create table pins (
pin_id bigserial primary key,
part_id bigint not null references parts
);
create table part_insts (
part_inst_id bigserial primary key,
part_id bigint not null references parts
);
create table pin_insts (
pin_inst_id bigserial primary key,
part_inst_id bigint …Run Code Online (Sandbox Code Playgroud) postgresql foreign-key database-design referential-integrity polymorphic-associations
我的 DBA 经验只是简单的存储 + CMS 样式数据的检索 - 所以这可能是一个愚蠢的问题,我不知道!
我有一个问题,我需要查找或计算特定组大小和特定时间段内特定天数的假期价格。例如:
1 月任何时候 2 人 4 晚的酒店房间多少钱?
例如,我有 5000 家酒店的定价和可用性数据,如下所示:
Hotel ID | Date | Spaces | Price PP
-----------------------------------
123 | Jan1 | 5 | 100
123 | Jan2 | 7 | 100
123 | Jan3 | 5 | 100
123 | Jan4 | 3 | 100
123 | Jan5 | 5 | 100
123 | Jan6 | 7 | 110
456 | Jan1 | 5 | 120
456 | Jan2 …Run Code Online (Sandbox Code Playgroud) 我有一个tickets表id,我需要将它关联到一个查找表,其中该数据的对应项是另一个id受外部源控制的表。
tickets
- id
- sutff
lookup
- outside_data_id
- ticket_id
Run Code Online (Sandbox Code Playgroud)
我只需要知道关联是否存在(因此是lookup表)并且具有一对多的关系。我知道没有别的有关outside_data_id除了id本身和相关ticket_id。
此外,我不想更改tickets表格,因为这只会影响少量的ticket_id's。
outside_data_id = 1234
Run Code Online (Sandbox Code Playgroud)
可能与:
ticket_id = 321
ticket_id = 322
ticket_id = 900
Run Code Online (Sandbox Code Playgroud)
下面的查找表结构会起作用还是有更好的方法?
CREATE TABLE lookup
(
outside_data_id integer,
ticket_id integer
)
Run Code Online (Sandbox Code Playgroud) postgresql database-design clustered-index referential-integrity index-tuning
一些 RDBMS 似乎允许没有 FROM 子句的查询,例如:
postgres=# SELECT 'foo' bar;
???????
? bar ?
???????
? foo ?
???????
Run Code Online (Sandbox Code Playgroud)
但是对于那些允许它的人,为什么SELECT count(*)不返回 0?
postgres=# SELECT count(*);
?????????
? count ?
?????????
? 1 ?
?????????
Run Code Online (Sandbox Code Playgroud) postgresql ×9
performance ×6
index ×5
index-tuning ×4
optimization ×2
datetime ×1
foreign-key ×1