标签: postgresql

优化时,我应该在 join 或 where 子句中放入条件吗?

我试图弄清楚查询 1 还是 2 是否更优化,并且似乎在我的 WHERE 子句中包含我的条件比在我的 JOIN 子句中更优化:

-- 1) "ups" inside where clause
explain analyze select * from item_events LEFT JOIN "carriers" ON "carriers"."item_event_id" = "item_events"."id" WHERE "carriers"."carrier_name" = 'ups' and "item_events"."property_id" = 895;
-- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Gather  (cost=1157.49..41948.17 rows=2721 width=381) (actual time=35.650..1832.871 rows=3933 loops=1)
   Workers Planned: 2
   Workers Launched: 2
   ->  Nested Loop  (cost=157.49..40676.07 rows=1134 width=381) (actual time=34.171..1824.416 rows=1311 loops=3)
         ->  Parallel Bitmap Heap Scan on item_events  (cost=157.05..16828.84 rows=1969 width=286) (actual time=30.920..368.885 rows=1819 loops=3)
               Recheck Cond: …
Run Code Online (Sandbox Code Playgroud)

postgresql

2
推荐指数
1
解决办法
65
查看次数

删除默认的“postgres”角色是否安全?

我试图了解我是否可以删除“postgres”角色,或者至少将其作为超级用户删除。谢谢!

postgresql role

2
推荐指数
1
解决办法
551
查看次数

具有不同格式查找的电话号码

我的数据库中存储了不同的电话格式,例如:

727.170.4799
1-416-958-6390
1.561.374.4268
(813) 929-5892
Run Code Online (Sandbox Code Playgroud)

此表中大约有约 200 万条记录,因此修改需要很长时间。我需要通过执行电话查找来查找记录。

我控制的一件事是输入,我可以保证它将是数字。但是我不知道他们是否要输入带有或不带有国家/地区代码的数字,因此以这个数字为例,1-416-958-6390这两个都用于查找:

14169586390
4169586390
Run Code Online (Sandbox Code Playgroud)

应该返回同一行 ( 1-416-958-6390)

如何尽可能高效地拨打电话号码?

这是我得到的,但它超级慢(正如预期的那样):

select * from patients
WHERE ( REPLACE(phone_number, '-', '') LIKE '%4169586390' )
Run Code Online (Sandbox Code Playgroud)

postgresql

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

PostgreSQL 的“collat​​es”中的“-x-icu”是什么意思?

我有这个查询:

SELECT * FROM table ORDER BY label ASC;
Run Code Online (Sandbox Code Playgroud)

由于标签不是英文的,它们没有按正确的顺序排序(以“ö”开头的标签不在底部/末尾)。

因此,我尝试:

SELECT * FROM table ORDER BY label COLLATE "sv-SE" ASC;
SELECT * FROM table ORDER BY label COLLATE "sv_SE" ASC;
Run Code Online (Sandbox Code Playgroud)

这些给出了关于那些不存在的排序规则的错误,这让我感到困惑。

经过一番搜索,我想出了这样做:

SELECT * FROM pg_collation;
Run Code Online (Sandbox Code Playgroud)

这表明它应该是:

sv-SE-x-icu
Run Code Online (Sandbox Code Playgroud)

当我使用该标识符时它起作用了,但是“-x-icu”的东西有什么用?那是怎么回事?我讨厌他们总是不得不弄乱标准的语言环境标识符,所以你永远不能只依赖标准的“language_location”格式。

postgresql collation unicode international-components-unicode

2
推荐指数
1
解决办法
411
查看次数

PostgreSQL:如何列出序列所属的表?

我知道我可以用这个列出所有序列:

SELECT * FROM information_schema.sequences;
Run Code Online (Sandbox Code Playgroud)

但我需要知道这个序列被哪个表使用。

我想这样做的原因是为了找出哪些PRIMARY KEYs序列不是默认格式的table_name_id_seq

这可能吗?

注意:我的 PostgreSQL 版本是 11.5。

postgresql postgresql-11

2
推荐指数
1
解决办法
3587
查看次数

使用 now()::timestamp 函数存储的时间存储错误值

我将 AWS RDS 用于带有 PGAdmin 的 PostgreSQL 11 数据库。我存储每一行​​的创建日期,now()::timestamp用于存储没有时区的日期和时间。问题是存储的时间永远不是我想要的值 ( UTC+05:30)。

如果我设定的参数timezoneUTC在RDS,然后储存时间的背后是印度时间5:30小时,但如果我设置UTC + 05:30,它存储时间背后要么11小时或1小时以上,这种情况随机随机行。我没有改变任何其他东西,只是这个timezone参数。

我搜索了很多,但没有找到任何类似的答案。

postgresql timezone

2
推荐指数
1
解决办法
1562
查看次数

WITH ... AS 语句未按预期工作

我收到此错误:

WITH...AS 语法错误

当我尝试执行以下查询时出现:

with expensive_service as (
    select s1.*
    from service s1, service s2
    where s1.price > s2.price
)
select * 
from service except expensive_service;
Run Code Online (Sandbox Code Playgroud)

我试图实现WITH ... AS(链接到 PostgreSQL 文档)。

此查询为我提供了所需的输出:

select * 
from service except ( 
    select s1.*
    from service s1, service s2
    where s1.price > s2.price
)
Run Code Online (Sandbox Code Playgroud)

任何指导我错误所在的帮助将不胜感激!

postgresql cte except

2
推荐指数
1
解决办法
632
查看次数

如何向时间戳列添加日/夜指示器?

timestamp我用一列来指示一行是在白天还是晚上创建的。我的代码如下,但由于某种原因,我只得到“DAY”作为结果。我没有正确格式化值吗?

select record_id, rec_date,
       case when date_part('hour', rec_date) between 20 and 07 then 'Night'
            else 'Day' end as Indicator
from records;      
Run Code Online (Sandbox Code Playgroud)

rec_date列是一个时间戳,我可以在其中看到诸如2019-11-20 21:34:02.000000- 之类的值,它应该得到一个'Night'指标。

postgresql query date-format date date-math

2
推荐指数
1
解决办法
784
查看次数

为什么在构造具有一个元素而不是两个元素的行时需要 ROW 关键字?

在 PostgreSQL 11 中,以下表达式

UPDATE test_table SET ("column_a","column_b") = ('value-a','value-b') WHERE "column_a" = 'value-c' 
Run Code Online (Sandbox Code Playgroud)

被接受并执行更新。

但是对于单个列/值,例如

UPDATE test_table SET ("column_a") = ('value-a') WHERE "column_a" = 'value-c'
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误。ROW必须提供,例如

UPDATE test_table SET ("column_a") = ROW ('value-a') WHERE "column_a" = 'value-c'
Run Code Online (Sandbox Code Playgroud)

有没有解释为什么选择这种行为?如果ROW缺少,是否有歧义?

postgresql syntax row

2
推荐指数
1
解决办法
136
查看次数

Postgresql 是否为不变更新语句创建一个新元组?

我需要修复 Postgresql 数据库中的一些数据问题,其中主要是从文本列中修剪空格。我正在使用如下语句执行此操作:

UPDATE app.products
SET "description" = TRIM(BOTH FROM "description")
Run Code Online (Sandbox Code Playgroud)

在测试数据库上发出这个返回UPDATE 2000. 测试表包含 2000 行,其中只有 1 行实际上会随着空白修剪而改变。这是否会导致 Postgres 创建新的、不必要的元组?添加 WHERE 子句会有好处吗?大多数目标列都没有编入索引。

UPDATE app.products
SET "description" = TRIM(BOTH FROM "description")
WHERE "description" LIKE ' %' OR "description" LIKE '% '
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-performance

2
推荐指数
1
解决办法
124
查看次数