我在 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) 我们有一个网络应用程序,可以检测数据库是否不存在并创建它。用户喜欢它,但我的想法是这样的用户拥有太多的权限。
我最好建议更改应用程序的数据库创建屏幕以提供 2 组凭据 - 一组将用于最初创建数据库而不是永久存储(例如“postgres”角色),另一组将被网络使用app 并存储在配置文件中(例如“webapp”)。此外,'webapp' 将需要能够 1) 添加新的和 2) 修改现有的表、过程和函数(Web 应用程序根据需要自动更新架构)
所以我的一些问题是:
这个答案向我提出了如何在这样的函数之间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
在 SQL 中,如果我想要查询的所有内容(在 where 条件中)是字段不为空时,是否所有关于索引的常见考虑都适用?
我可以应用索引的特殊配置来涵盖这种特定情况吗?
例如:
select id
from Accesses
where token is not null;
Run Code Online (Sandbox Code Playgroud)
token如果我必须搜索特定的令牌值,是否值得尽可能多地添加索引?
我的数据库是 Postgres。
我不确定这是否适合这个地方,所以请随时告诉我它是否偏离主题或有更好的发帖地方。
我正在做一个基于幻想体育的项目,桌子的数量越来越多。我有诸如nba_players,nfl_players等和nba_players_to_teams,nfl_players_to_teams等表(NBA 和 NFL 分别是篮球和美式橄榄球联盟)。这些都共享相同的表模式和代码库,但在不同的表上有它们的外键。
我的问题是,在这种情况下使用表继承有意义吗?“基”表将是空的,仅用于强制执行模式。对“基”表的更改会传播到从它继承的表吗?在这一点上,模式非常稳定,所以这不是一个大问题。
有没有我没有解决的想法或疑虑?我仍在阅读有关表继承及其优缺点的文章,但您拥有的任何资源都将不胜感激。
我有一个 PostgreSQL 数据库(9.3.6 版),其中包含大量orders. 随着订单被处理、scan_events触发和存储,每个订单有多个事件。扫描事件有一个布尔值,指示在该事件之后是否可以将订单标记为已完成,但complete可以发生多次扫描。然而,一般来说,我真正关心的唯一扫描是第一次扫描和第一次completed扫描。
我想知道在创建后x天内收到第一次扫描的给定创建日期的订单百分比的平均值和标准差。
CREATE TABLE orders (
id character varying(40) NOT NULL,
date_created timestamp with time zone NOT NULL
);
ALTER TABLE ONLY orders
ADD CONSTRAINT orders_pkey PRIMARY KEY (id);
CREATE TABLE scan_events (
id character varying(100) NOT NULL,
order_id character varying(40) NOT NULL,
"time" timestamp with time zone NOT NULL
);
CREATE INDEX scan_events_order_id_idx ON scan_events USING btree (order_id);
Run Code Online (Sandbox Code Playgroud)
对于days_elapsed1 到 14 …
我有一个带有主表和 2 个子表的 PostgreSQL 9.0.12 数据库。我的表:
CREATE TABLE test2 (
id serial PRIMARY KEY,
coll character varying(15),
ts timestamp without time zone
);
CREATE INDEX ON test2(ts);
CREATE TABLE test2_20150812 (
CHECK ( ts >= timestamp '2015-08-12' AND ts < timestamp '2015-08-13' )
) INHERITS (test2);
CREATE TABLE test2_20150811 (
CHECK ( ts >= timestamp '2015-08-11' AND ts < timestamp '2015-08-12' )
) INHERITS (test2);
CREATE INDEX ON test2_20150812(ts);
CREATE INDEX ON test2_20150811(ts);
VACUUM FULL ANALYZE;
Run Code Online (Sandbox Code Playgroud)
我的选择查询的解释结果(数据库中没有任何行):
EXPLAIN (ANALYZE, BUFFERS) …Run Code Online (Sandbox Code Playgroud) 我的 PostgreSQL 9.4.1 服务器出现性能问题。我已经使用通常的最佳实践(pgtune + google)调整了服务器。这是相关的配置:
# <snip> the default config above
default_statistics_target = 50
maintenance_work_mem = 960MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 11GB
work_mem = 96MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 4GB
max_connections = 200
autovacuum = on
log_autovacuum_min_duration = 10000
autovacuum_max_workers = 5
autovacuum_naptime = 1min
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 25
autovacuum_vacuum_scale_factor = 0.2
autovacuum_analyze_scale_factor = 0.1
#autovacuum_freeze_max_age = 200000000
autovacuum_vacuum_cost_delay = 20ms
autovacuum_vacuum_cost_limit = -1
#log_statement='mod'
#log_statement='all'
logging_collector = on …Run Code Online (Sandbox Code Playgroud) postgresql performance database-tuning postgresql-9.4 performance-tuning
我想向 PG 添加一些审计触发器,以记录对表的所有更改。我找到了一个示例触发器(wiki.postgresql.com - 9.1+ 审计触发器),它让我开始了。
我想要做的是自动传递一些附加数据,例如 theuser-id或 other 键,以便触发器可以将更改链接回进行更改的应用程序用户。基本流程如下:
set conn_context = {userid};)使用 MS SQL 时,我能够通过执行SET CONTEXT_INFO ...data.... 我希望有一种方法可以为 PG 做到这一点;我还没有找到,但这可能是糟糕的 google-fu。
是否可以FOREACH在 PL/pgSQL 中循环多个数组?就我而言,3 个具有相同维度的数组。我如何传递元素,如:
for(int i = 0 ; i < array1.length ; i++){
my_method(array1[i], array2[i], array3[i]);
}
Run Code Online (Sandbox Code Playgroud)
这是我的尝试:
select dugong.session_hugeInsert( 3, '5,2,3,1', '4,3,3,2');
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)NOTICE: The transaction is in an uncommitable state.Transaction was rolled back. NOTICE: query "SELECT Question_ID, UserResponseID_List, UserResponseList" returned 3 columns 42601 ERROR: cannot begin/end transactions in PL/pgSQL HINT: Use a BEGIN block with an EXCEPTION clause instead. CONTEXT: PL/pgSQL function dugong.session_hugeinsert(integer,text,text) line 61 at SQL statement
我的功能:
CREATE OR REPLACE FUNCTION Dugong.Session_hugeInsert(
Quiz_ID_ int, …Run Code Online (Sandbox Code Playgroud) postgresql ×10
performance ×4
trigger ×3
inheritance ×2
plpgsql ×2
array ×1
datatypes ×1
index ×1
partitioning ×1
security ×1
select ×1
users ×1