我有大数据,我一次只选择一小段数据,这样选择总是按顺序排列的。我正在尝试在 MySQL 中实现像 Partial index 这样的 PostgreSQL,这是针对此类目的。我不确定部分唯一约束是否与我想要的相同。
PostgreSQL 9.4 中的代码
CREATE UNIQUE INDEX dir_events
ON events (measurement_id)
USING btree
(eventBody)
WHERE is_active;
Run Code Online (Sandbox Code Playgroud)
CREATE UNIQUE INDEX dir_events
[index_type] -- TODO what here?
ON events (measurement_id, is_active)
[index_type] -- TODO what here?
Run Code Online (Sandbox Code Playgroud)
如何在 MySQL 5.5 或类似版本中创建类似 PostgreSQL 的部分索引?
我想从 ARGV[] 转换到 PostgreSQL 中的 int 数组,我在代码中用TODO标记了伪代码。x86_64-unknown-linux-gnu 上 PostgreSQL 9.4.3 中的代码,由 gcc (Debian 4.9.2-10) 4.9.2 编译,64 位:
CREATE TABLE measurements (
measurement_id SERIAL PRIMARY KEY NOT NULL,
measurement_size_in_bytes INTEGER NOT NULL
);
CREATE TABLE events (
event_id SERIAL PRIMARY KEY NOT NULL,
measurement_id INTEGER NOT NULL,
event_index_start INTEGER NOT NULL,
event_index_end INTEGER NOT NULL
);
CREATE OR REPLACE FUNCTION insaft_function()
RETURNS TRIGGER AS
$func$
BEGIN
-- TODO Loop until TG_ARGV[0] empty
INSERT INTO events (measurement_id, event_index_start, event_index_end)
SELECT …Run Code Online (Sandbox Code Playgroud) 这个答案促使我再次思考我的下表,但我仍然不确定如何存储来自数据分析的变量/结果以便在后处理中快速选择。如果存储,我认为它使用部分索引(B 树)做得很好,因为在我这里描述的应用程序中只需要一个数据子集。假设您有三个标准正交表:measurement、events和headers,其中都有一些静态(以字节为单位的事件大小等)列,但想知道从数据分析中存储一些数字是否有益。
没有名称的表模式测量示例:
SERIAL | NOT NULL
INTEGER | NOT NULL
INTEGER | NOT NULL
TIMESTAMP WITH TIME ZONE | DEFAULT CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)
由于我需要统计数据,我担心通过 INTEGER 字段增加架构大小。我不想将很少使用的变量存储在主表中。我不希望我的索引没有像PostgreSQL Up & Running和这篇文章中描述的那样被使用,为什么我的索引没有被索引?
可能的来源
什么时候应该将静态/动态统计信息存储在表中?PostgreSQL 的部分索引中如何高效地存储静态/动态统计信息?
我在 x86_64-unknown-linux-gnu 上的 PostgreSQL 9.4.3 中的表和触发器,由 gcc (Debian 4.9.2-10) 4.9.2,64 位编译:
CREATE TABLE measurements (
measurement_id SERIAL PRIMARY KEY NOT NULL,
measurement_size_in_bytes INTEGER NOT NULL
);
CREATE TABLE file_headers (
header_id SERIAL PRIMARY KEY NOT NULL,
measurement_id INTEGER NOT NULL,
file_header_index_start INTEGER,
file_header_index_end INTEGER
);
CREATE TRIGGER measurement_ids AFTER INSERT
ON measurements FOR EACH ROW
EXECUTE PROCEDURE ins_function('SELECT measurement_id FROM measurements
ORDER BY measurement_id desc limit 1;', 1, 666 );
Run Code Online (Sandbox Code Playgroud)
在那里我假设 SELECT 的数据类型自 SERIAL 以来是 INTEGER 但它显然是错误的,因为我从这个启动触发器的命令中收到错误消息:
INSERT INTO measurements …Run Code Online (Sandbox Code Playgroud) 这个答案向我提出了如何在这样的函数之间VALUES和SELECT中进行选择的问题。在 x86_64-unknown-linux-gnu 上使用PostgreSQL 9.4.3,由 gcc (Debian 4.9.2-10) 4.9.2, 64-bit 编译:
CREATE OR REPLACE FUNCTION insaft_function()
RETURNS TRIGGER AS
$func$
BEGIN
INSERT INTO file_headers (measurement_id, file_header_index_start
, file_header_index_end)
VALUES (NEW.measurement_id, TG_ARGV[0]::int, TG_ARGV[1]::int);
RETURN NULL; -- result ignored since this is an AFTER trigger
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
VALUES处理多行,但SELECT你可以做更多的事情。这里唯一的要求是对INSERT表格执行上述操作。您可以假设INSERT在系统的持续质量保证中每个周期完成100k 次这样的操作。
我注意到这些差异与我的数据不同,这里选择了三个中值:
VALUES
real user sys
-------------------------------
0m0.353s 0m0.256s 0m0.028s
0m0.327s 0m0.252s 0m0.036s
0m0.358s …Run Code Online (Sandbox Code Playgroud) postgresql trigger performance select postgresql-performance
您可以按照此处所述计算缓存未命中。
但是,我对如何最小化 PostgreSQL 9.4.3 在 x86_64-unknown-linux-gnu 上的现象很感兴趣,它由 gcc (Debian 4.9.2-10) 4.9.2, 64-bit 编译。我有一些基于哈希表的算法,它们通过随机访问导致很多缓存未命中。我对如何最大限度地减少 PostgreSQL 中的缓存未命中感兴趣。
如何通过设计最大限度地减少 PostgreSQL 中的缓存未命中?
postgresql performance cache configuration postgresql-9.4 postgresql-performance
我有一个触发器错误,导致在 x86_64-unknown-linux-gnu 上的 PostgreSQL 9.4.3 中出现错误,由 gcc (Debian 4.9.2-10) 4.9.2, 64 位编译。每次出错期间,SERIAL 的主键都会增加。修复错误后,表格测量结果为
measurement_id | measurement_size_in_bytes | time
----------------+---------------------------+-------------------------------
1 | 77777 | 2015-07-14 18:29:56.858703+03
2 | 888 | 2015-07-14 18:29:56.882552+03
3 | 888 | 2015-07-14 18:30:15.505957+03
4 | 888 | 2015-07-14 18:41:01.878106+03
39 | 77777 | 2015-07-15 12:11:21.21391+03
40 | 77777 | 2015-07-15 12:11:59.551973+03
41 | 77777 | 2015-07-15 12:12:05.48982+03
42 | 77777 | 2015-07-15 12:13:02.402053+03
43 | 77777 | 2015-07-15 12:13:02.419412+03
44 | 888 | 2015-07-15 …Run Code Online (Sandbox Code Playgroud) 我想估计使用 B-tree 方法需要多少次读取 PostgreSQL 的部分索引,因为我无法直接更改块大小。PostgreSQL 手册关于这里的索引和这里关于块大小的信息,对于 aux 来说是 100,所以有 3 次读取。
块大小占用的默认内存为 8 KB,即通常为 1 个块,但我不确定这是否可行,因为它log_1(2)是无穷大。我的想法是动态计算的读取次数也可能在PostgreSQL的这里考虑的B树块尺寸决定读取次数。我想知道块大小log_b n中b有多少:块大小在哪里n,事件数在哪里。我认为它在数学上不可能是一个。我认为 Postgres B-tree 是按照 Wiki 页面中描述的标准方式实现的,也由 Cormen 等人描述。
基于此答案,B 树索引仅包含 PostgreSQL 中的键。然后数据再次位于作为逻辑堆的表中。索引的重点是存储密钥。数据位于表中,表是基于here 的逻辑堆。我对 PostgresSQL 如何创建名为 B-tree 的实体感兴趣。基于此处,B 树索引和表的物理存储使用相同的数据页,并且页面布局几乎相同。但是,我对这个实体如何协同工作很感兴趣。索引和数据的功能大概可以这样描述:
B 树从根生长,而不是从叶子生长。
但更准确地说,来自 Sumathi 关于关系数据库管理系统的基础知识(计算智能研究):
在 B 树中,非叶节点比叶节点大。指向数据记录的指针存在于树的所有级别。
在 B+tree 中,指针只存在于叶子上。你如何评估 B 树的指针系统?您如何描述 PostgreSQL B 树占用的大 O 空间?Postgres 是如何制作 B 树索引的?
postgresql ×7
performance ×3
index ×2
plpgsql ×2
trigger ×2
array ×1
cache ×1
cast ×1
datatypes ×1
errors ×1
index-tuning ×1
insert ×1
mysql ×1
select ×1
size ×1
statistics ×1