小编Erw*_*ter的帖子

带有 LIMIT 的慢 ORDER BY

我有这个查询:

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 performance index full-text-search

11
推荐指数
1
解决办法
4518
查看次数

在 PostgreSQL 8.4 中执行触发器函数需要什么权限?

在 PostgreSQL 8.4 中执行触发器函数需要什么权限?

似乎为角色设置的权限与执行触发器功能无关。我想我有一天看到执行触发器函数所需的特权是 EXECUTE 特权,但对于表的所有者,而不是执行触发调用触发器函数的触发器的操作的实际角色。

我找不到解释这一点的文档部分,有什么帮助吗?

postgresql trigger stored-procedures permissions postgresql-8.4

11
推荐指数
1
解决办法
1万
查看次数

按距离排序

如果我有一个关于返回附近咖啡馆的查询:

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)

postgresql postgis postgresql-9.2 gist-index

11
推荐指数
1
解决办法
5921
查看次数

优化 Postgres 中的并发更新

我正在运行这样的并发 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)索引可能会起作用,这是一种值得追求的方法吗?

postgresql deadlock locking update

11
推荐指数
1
解决办法
1万
查看次数

如何在 PL/pgSQL 中获取手动引发的异常的异常上下文?

在 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)

postgresql error-handling exception plpgsql postgresql-9.3

11
推荐指数
2
解决办法
2万
查看次数

VACUUM FULL 是否需要 ANALYZE

如果您能深入了解VACUUMPostgreSQL 9.3 中的功能,我将不胜感激。我通读了文档并进行了一些搜索,但找不到明确的答案。

我正在为 9.3 服务器设置每周一次的数据库维护工作。

其中一部分将是一个VACUUM FULL. 这是一个很小的数据库,我有一个不错的周末维护窗口,所以我可以FULL毫无问题地运行它。

ANALYZE在命令中添加选项有什么意义吗?

根据 9.3 文档:

VACUUM FULL 将表的全部内容重写到一个没有额外空间的新磁盘文件中,允许将未使用的空间返回给操作系统。

如果表已完全重新创建,那么我是否需要特别要求ANALYZE发生或在将行写入表的新版本时自动更新统计信息?

postgresql statistics vacuum postgresql-9.3

11
推荐指数
1
解决办法
4915
查看次数

带有类型修饰符的数据类型的惊人结果

在讨论这个问题的递归 CTE 解决方案时:

@ypercube偶然发现了一个令人惊讶的异常,这导致我们调查类型修饰符的处理。我们发现了令人惊讶的行为。

1. 类型转换在某些上下文中保留了类型修饰符

即使被指示不要这样做。最基本的例子:

SELECT 'vc8'::varchar(8)::varchar
Run Code Online (Sandbox Code Playgroud)

人们可能会期望varchar(没有修饰符),至少我会。但结果是varchar(8)(带修饰符)。下面的小提琴中有许多相关的案例。

2. 数组连接在某些情况下失去了类型修饰符

不需要,所以这在相反的一面出错:

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 不会丢失数据,并且当分配给列时,该值无论如何都会被强制转换为正确的类型。然而,相反方向的错误最终会导致一个令人惊讶的异常:

3. 递归 CTE 要求数据类型完全匹配

鉴于此简化表:

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,但对 …

postgresql datatypes cte debugging cast

11
推荐指数
1
解决办法
1825
查看次数

如何避免 3 个表之间的循环依赖(循环引用)?

我有3张桌子:

  • 人们
  • 邮政
  • 喜欢

当我设计 ER 模型时,它具有循环依赖关系:

         1:N
人 --------< 帖子

         1:N
发帖 ----------< 点赞

         1:N
人们 --------< 喜欢

逻辑是:

  • 1个人可以有很多帖子。

  • 1个帖子有很多赞。

  • 1个人可以点赞多个帖子(创建的人不能点赞自己的帖子)。

我怎样才能消除这种循环设计?还是我的数据库设计错了?

mysql postgresql database-design design-pattern

11
推荐指数
2
解决办法
9330
查看次数

当我们在一个有大量数据的现有表中添加索引时会发生什么?

我有一个包含大约 1500 万条记录的表。现在我需要向表中添加一个索引。

添加索引需要一些时间来更新表中的每个条目。

我很困惑添加索引是否会导致停机。

如果是,那么我怎样才能克服停机时间?

postgresql index concurrency locking

11
推荐指数
1
解决办法
2375
查看次数

如何在 PostgreSQL 中获取用户的密码?

我以超级用户身份登录到我的数据库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 password

11
推荐指数
1
解决办法
5万
查看次数