我的系统中有一个非常重要的查询,由于表上的数据量很大,执行时间太长。我是一名初级 DBA,我需要为此进行最佳优化。每个表大约有 8000 万行。
表是:
tb_pd:
Column | Type | Modifiers | Storage | Stats target | Description
---------------------+---------+-----------+---------+--------------+-------------
pd_id | integer | not null | plain | |
st_id | integer | | plain | |
status_id | integer | | plain | |
next_execution_date | bigint | | plain | |
priority | integer | | plain | |
is_active | integer | | plain | |
Indexes:
"pk_pd" PRIMARY KEY, btree (pd_id)
"idx_pd_order" btree (priority, next_execution_date) …Run Code Online (Sandbox Code Playgroud) postgres=#和 和有postgres-#什么区别?我尝试使用谷歌搜索并查看官方网站,但无法找到符号。
我需要从 3 个表中提取数据,并以特定方式打印它。
http://sqlfiddle.com/#!15/59481/8
请参阅此问题以了解查询是如何生成的。小提琴中的版本部分工作,但我需要修改查询以产生不同的输出。
我有一个project_report存储数据的表keyword:
1. If a keyword has data for a particular day it will store it in `project_report`
2. A keyword might have no data to store for a particular day.
3. A keyword might store multiple rows of data for a particular day (the data is uniq)
4. A keyword might not have data for a particular day, but it might have for a different day.
Run Code Online (Sandbox Code Playgroud)
我相信要解决我的问题,DB 函数将是最好的方法,因为我希望能够指定一个日期并从project_reports …
目前我创建了一个视图,请在答案中查看。如何根据该crosstab()查询创建函数,以便传递日期并获取特定日期的数据?
多次调用该函数并传递不同的日期来填充图表(例如)也是一种好习惯吗?
我正在尝试使更新视图的触发器起作用。如果我正在做并插入它就可以了!但是当我尝试进行 UPDATE 时,它只是不运行。
CREATE OR REPLACE FUNCTION test_trigger_function()
RETURNS trigger AS
$$
BEGIN
RAISE NOTICE 'hi';
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER test_trigger
INSTEAD OF INSERT OR UPDATE
ON specific_view
FOR EACH ROW
EXECUTE PROCEDURE test_trigger_function();
Run Code Online (Sandbox Code Playgroud)
然后在另一个地方我执行它:
RAISE NOTICE 'before';
UPDATE specific_view SET gender='randomstuff';
RAISE NOTICE 'after';
Run Code Online (Sandbox Code Playgroud)
结果:
psql:test_function.pgsql:134: NOTICE: before
psql:test_function.pgsql:134: NOTICE: after
Run Code Online (Sandbox Code Playgroud)
插入时:
RAISE NOTICE 'before';
INSERT INTO specific_view (gender)
VALUES ('randomstuff');
RAISE NOTICE 'after';
Run Code Online (Sandbox Code Playgroud)
返回:
psql:test_function.pgsql:134: NOTICE: before
psql:test_function.pgsql:134: NOTICE: hi
CONTEXT: SQL statement "INSERT …Run Code Online (Sandbox Code Playgroud) 考虑到一个指定的表bananas
和一个timestamp without time zone名为列end_time
和 一些 psql客户有set timezone to 'UTC'
和 其他 psql客户端有set timezone to 'US/Eastern'
和服务器配置有timezone = 'UTC'中postgresql.conf
如何编写支票约束bananas.end_time以确保end_time始终是一天的结束,定义为“美国/东部”一天的第 23 小时 59 分 59 秒?
我试过:
alter table bananas
add constraint ck_end_time_is_end_of_day
check (
23 = date_part('hour', end_time at time zone 'UTC' at time zone 'US/Eastern')
and 59 = date_part('minute', end_time at time zone 'UTC' at time zone …Run Code Online (Sandbox Code Playgroud) Postgres 9.3 Debian 7.0
我为特定用户创建了特定模式,并在此模式中为该用户创建了一个视图,因此这是他知道存在的唯一表。问题是这个用户需要使用这个表的主键的序列,但它说“错误:序列的权限被拒绝”
原始表及其序列属于模式 A。此用户的模式 B 具有此表 T 的可插入视图。我不能为该用户授予模式 A 的使用权,否则他将能够看到所有的名称和定义我的桌子。
问题是:有没有办法为这个序列创建某种视图,以便他可以调用 nextval() 和 currval()?目标是使该序列可用于该受限用户,而无需让他访问该序列实际所属的主模式。
日志消息是否可以跨越多行?我期待:
RAISE WARNING 'Line 1\nLine 2';
导致以下日志:
Line 1
Line 2
Run Code Online (Sandbox Code Playgroud)
但相反,我得到:
Line 1\nLine 2
有任何想法吗?
以下似乎可能是一种相当普遍的情况,但我还没有看到任何解决方案。
我有一个 PostgreSQL 数据库,其中包含特定于 的视图,$user以便根据某些特定于数据库的 ACL 逻辑来限制数据。数据库通常通过 JDBC 访问,特别是在 Web 界面的 JSP 中。用户通过 LDAP 密码认证登录网站。
我想要的是利用从 JDBC 连接到数据库的视图。但通常这个中间层连接是使用通用用户创建的,而不是特定于登录网站的人。我相信在 Oracle 中“正确”的方法是Proxy Authentication,但 AFAIAA 没有与 PostgreSQL 等效的方法。那么该怎么做呢?
想到了一些想法:
还有其他(希望更好)的建议吗?
我使用的是较旧版本的 Postgres (8.4.20)。我知道 autovacuum 进程经常执行以释放删除或更新表中数据的查询的磁盘空间。我有一个不经常删除或更新的数据库。
在这样的数据库上处理 autovacuum 需要更少的时间和内存,还是仅取决于数据库中对象的大小和数量?
postgresql ×10
autovacuum ×1
connections ×1
constraint ×1
datatypes ×1
functions ×1
index-tuning ×1
jdbc ×1
optimization ×1
performance ×1
permissions ×1
pivot ×1
plpgsql ×1
psql ×1
schema ×1
sequence ×1
timestamp ×1
timezone ×1
trigger ×1
vacuum ×1
view ×1