我有这个查询:
SELECT *
FROM location
WHERE to_tsvector('simple',unaccent2("city"))
@@ to_tsquery('simple',unaccent2('wroclaw'))
order by displaycount
Run Code Online (Sandbox Code Playgroud)
我很高兴:
"Sort (cost=3842.56..3847.12 rows=1826 width=123) (actual time=1.915..2.084 rows=1307 loops=1)"
" Sort Key: displaycount"
" Sort Method: quicksort Memory: 206kB"
" -> Bitmap Heap Scan on location (cost=34.40..3743.64 rows=1826 width=123) (actual time=0.788..1.208 rows=1307 loops=1)"
" Recheck Cond: (to_tsvector('simple'::regconfig, unaccent2((city)::text)) @@ '''wroclaw'''::tsquery)"
" -> Bitmap Index Scan on location_lower_idx (cost=0.00..33.95 rows=1826 width=0) (actual time=0.760..0.760 rows=1307 loops=1)"
" Index Cond: (to_tsvector('simple'::regconfig, unaccent2((city)::text)) @@ '''wroclaw'''::tsquery)"
"Total runtime: 2.412 ms"
Run Code Online (Sandbox Code Playgroud)
但是当我添加 LIMIT 时,执行时间超过 …
在 PostgreSQL 8.4 中执行触发器函数需要什么权限?
似乎为角色设置的权限与执行触发器功能无关。我想我有一天看到执行触发器函数所需的特权是 EXECUTE 特权,但对于表的所有者,而不是执行触发调用触发器函数的触发器的操作的实际角色。
我找不到解释这一点的文档部分,有什么帮助吗?
postgresql trigger stored-procedures permissions postgresql-8.4
如果我有一个关于返回附近咖啡馆的查询:
SELECT * FROM cafes c WHERE (
ST_DWithin(
ST_GeographyFromText(
'SRID=4326;POINT(' || c.longitude || ' ' || c.latitude || ')'
),
ST_GeographyFromText('SRID=4326;POINT(-76.000000 39.000000)'),
2000
)
)
Run Code Online (Sandbox Code Playgroud)
如何选择距离以及按距离排序?
有没有比这更有效的方法:
SELECT id,
ST_Distance(ST_GeographyFromText('SRID=4326;POINT(-76.000000 39.000000)'),
ST_GeographyFromText(
'SRID=4326;POINT(' || c.longitude || ' ' || c.latitude || ')')
) as distance
FROM cafes c
WHERE (
ST_DWithin(
ST_GeographyFromText(
'SRID=4326;POINT(' || c.longitude || ' ' || c.latitude || ')'
),
ST_GeographyFromText('SRID=4326;POINT(-76.000000 39.000000)'),
2000
)
) order by distance
Run Code Online (Sandbox Code Playgroud) 我正在运行这样的并发 Postgres 查询:
UPDATE foo SET bar = bar + 1 WHERE baz = 1234
Run Code Online (Sandbox Code Playgroud)
每个查询都会影响固定的 K 行数,我找不到强制执行更新行顺序的方法,最终导致死锁。目前我通过手动执行订单来解决这个问题,但这意味着我必须执行比平时更多的查询,同时还将搜索复杂度从 O(log N + K) 提高到 O(K log N)。
有没有办法提高性能而不会最终容易陷入死锁?我怀疑如果Postgres 以扫描它们的相同顺序更新行,用(baz)索引替换(baz, id)索引可能会起作用,这是一种值得追求的方法吗?
在 Postgres 中,我们使用以下代码获取异常的“堆栈跟踪”:
EXCEPTION WHEN others THEN
GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT;
Run Code Online (Sandbox Code Playgroud)
这适用于“自然”异常,但如果我们使用
RAISE EXCEPTION 'This is an error!';
Run Code Online (Sandbox Code Playgroud)
...然后没有堆栈跟踪。根据邮件列表条目,这可能是故意的,尽管我终生无法弄清楚原因。这让我想找出另一种抛出异常的方法,而不是使用RAISE. 我只是错过了一些明显的东西吗?有没有人有这个技巧?我可以让 Postgres 抛出一个包含我选择的字符串的异常,这样我不仅可以在错误消息中获得我的字符串,还可以获得完整的堆栈跟踪吗?
这是一个完整的例子:
CREATE OR REPLACE FUNCTION error_test() RETURNS json AS $$
DECLARE
v_error_stack text;
BEGIN
-- Comment this out to see how a "normal" exception will give you the stack trace
RAISE EXCEPTION 'This exception will not get a stack trace';
-- This will give a divide by zero error, complete with stack …Run Code Online (Sandbox Code Playgroud) 如果您能深入了解VACUUMPostgreSQL 9.3 中的功能,我将不胜感激。我通读了文档并进行了一些搜索,但找不到明确的答案。
我正在为 9.3 服务器设置每周一次的数据库维护工作。
其中一部分将是一个VACUUM FULL. 这是一个很小的数据库,我有一个不错的周末维护窗口,所以我可以FULL毫无问题地运行它。
ANALYZE在命令中添加选项有什么意义吗?
根据 9.3 文档:
VACUUM FULL将表的全部内容重写到一个没有额外空间的新磁盘文件中,允许将未使用的空间返回给操作系统。
如果表已完全重新创建,那么我是否需要特别要求ANALYZE发生或在将行写入表的新版本时自动更新统计信息?
在讨论这个问题的递归 CTE 解决方案时:
@ypercube偶然发现了一个令人惊讶的异常,这导致我们调查类型修饰符的处理。我们发现了令人惊讶的行为。
即使被指示不要这样做。最基本的例子:
SELECT 'vc8'::varchar(8)::varchar
Run Code Online (Sandbox Code Playgroud)
人们可能会期望varchar(没有修饰符),至少我会。但结果是varchar(8)(带修饰符)。下面的小提琴中有许多相关的案例。
不需要,所以这在相反的一面出错:
SELECT ARRAY['vc8']::varchar(8)[]
, ARRAY['vc8']::varchar(8)[] || 'vc8'::varchar(8)
Run Code Online (Sandbox Code Playgroud)
第一个表达式varchar(8)[]按预期产生。
但是第二个,在连接另一个之后varchar(8)被淡化到只是varchar[](没有修饰符)。来自array_append(),下面小提琴中的示例的类似行为。
在大多数情况下,所有这些都无关紧要。Postgres 不会丢失数据,并且当分配给列时,该值无论如何都会被强制转换为正确的类型。然而,相反方向的错误最终会导致一个令人惊讶的异常:
鉴于此简化表:
CREATE TABLE a (
vc8 varchar(8) -- with modifier
, vc varchar -- without
);
INSERT INTO a VALUES ('a', 'a'), ('bb', 'bb');
Run Code Online (Sandbox Code Playgroud)
虽然此 rCTE 对varchar列有效vc,但对 …
我有3张桌子:
当我设计 ER 模型时,它具有循环依赖关系:
1:N
人 --------< 帖子
1:N
发帖 ----------< 点赞
1:N
人们 --------< 喜欢
逻辑是:
1个人可以有很多帖子。
1个帖子有很多赞。
1个人可以点赞多个帖子(创建的人不能点赞自己的帖子)。
我怎样才能消除这种循环设计?还是我的数据库设计错了?
我有一个包含大约 1500 万条记录的表。现在我需要向表中添加一个索引。
添加索引需要一些时间来更新表中的每个条目。
我很困惑添加索引是否会导致停机。
如果是,那么我怎样才能克服停机时间?
我以超级用户身份登录到我的数据库postgres。
postgres=# SELECT * FROM pg_user;
+----------+----------+-------------+----------+---------+--------------+----------+----------+-----------+
| usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig |
+----------+----------+-------------+----------+---------+--------------+----------+----------+-----------+
| postgres | 10 | t | t | t | t | ******** | (null;) | (null;) |
| test | 24763 | f | f | f | f | ******** | (null;) | (null;) |
+----------+----------+-------------+----------+---------+--------------+----------+----------+-----------+
(2 rows)
Run Code Online (Sandbox Code Playgroud)
我已经列出了数据库中的所有用户。如何获取普通用户的密码test?
postgresql ×10
index ×2
locking ×2
cast ×1
concurrency ×1
cte ×1
datatypes ×1
deadlock ×1
debugging ×1
exception ×1
gist-index ×1
mysql ×1
password ×1
performance ×1
permissions ×1
plpgsql ×1
postgis ×1
statistics ×1
trigger ×1
update ×1
vacuum ×1