标签: postgresql

在 WHERE 子句中使用 CASE 表达式时,列不存在

我有这个 SQL

SELECT 
    price_amount, 
    price_currency, 
    CASE 
        WHEN price_currency='USD' THEN price_amount * 3.9024 
        WHEN price_currency='EUR' THEN price_amount * 4.413 
        WHEN price_currency='ILS' THEN price_amount * 1 
        ELSE price_amount * 1 
    END AS final_price 
FROM items 
WHERE final_price BETWEEN 1 AND 100
Run Code Online (Sandbox Code Playgroud)

但我得到:

错误:“final_price”列不存在第
1 行:...ce_amount * 1 END AS final_price FROM items WHERE final_pric...

它使用别名被选中,那么为什么它试图在表中找到它?

postgresql

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

Postgresql 等价于 sqlite pragma

如果我想从 postgresql 中获得最佳性能,那么下面的 sqlite pragma 相当于什么。

pragma synchronous = OFF;
pragma journal_mode = OFF;
pragma count_changes = OFF;
pragma temp_store = MEMORY;
Run Code Online (Sandbox Code Playgroud)

postgresql sqlite performance postgresql-performance

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

Postgres 消耗大量 RAM(缓存)

我在 Centos 6 x64(RAM:8 GB)上有一个小型数据库 PostgreSQL (v9.3)。

postgresql.conf

max_connections = 512
shared_buffers = 3000MB  
temp_buffers = 8MB          
work_mem = 2MB          
maintenance_work_mem = 128MB         
effective_cache_size = 3000MB
Run Code Online (Sandbox Code Playgroud)

大约 150 个连接,PostgreSQL 需要超过 6 GB 的 RAM(当然,其他应用程序使用大约 200 MB 的 RAM),这里是我的信息:

Mem:  7062.945M total, 6892.410M used,  170.535M free, 6644.000k buffers
Swap:    0.000k total,    0.000k used,    0.000k free, 5378.922M cached
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 为什么 PG 需要大量 RAM?

  2. 如何减少 PG 的缓存缓冲区?

postgresql configuration enterprisedb

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

PostgreSQL 流式复制 - 主服务器损坏

我们在主数据库和从数据库之间有 PostgreSQL 9.3.9 流式复制。在复制时,Master 上是否会发生可能导致持久性问题或 Master 和 Slave DB 完全失败的问题?在复制时,我是否总是会保持持久性并准备好工作或恢复从属数据库?

postgresql replication

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

Postgres 重新索引崩溃的民间传说

我正在努力解决Postgres的民间记忆问题。

民间传说

听说很久以前在一个遥远的星系(Ubuntu 12.04下的PostgreSQL 8.4),PostgreSQL经常遇到一个问题,如果承载服务器的机器出现故障(例如内核崩溃),当机器重新启动时,Postgres将启动,但数据库上的索引可能已损坏。例如

SELECT foo FROM bar WHERE baz = 123
Run Code Online (Sandbox Code Playgroud)

会失败,因为上的索引bar.baz会损坏。重新索引表修复了问题,但由于无法检测到此问题,而且这是在设备环境中(手头没有 DBA),本质上为了防止这种情况,有必要在重新启动时重新索引所有表,这会非常昂贵。因此(推理是这样的)如果手头没有 DBA,使用 Postgres 是不明智的,特别是在表很大且计算索引昂贵的环境中。

由于这种民间传说,在这种情况下首选 MySQL。

我的理论

  1. 我依稀记得在 8.4 下看到过​​这个问题,所以我认为其中有一些道理。

  2. 我确信这也发生在 Ubuntu 14.0.4 下的 Postgres 9.3 上。我不知道它是否“经常”发生。它发生的系统正在运行(公认的旧)企业级 SAS 驱动器,该驱动器声称写入缓存已关闭,因此我认为这不是写入缓存问题。

  3. 如果情况仍然如此,我想我可以在网上找到比我能找到的更多的证据。

  4. 因此,我怀疑它可能已修复,或者可能是由于某些问题造成的postgresql.conf(尽管检查表明只有 autovacuum 设置从默认值更改)。

更多信息

  1. 在我最近知道的系统中(使用 9.3)没有使用 LVM。存储系统是 ext4,安装在具有默认属性的物理驱动器上。这个驱动器是一个(公认的老)企业 SAS 驱动器加上 SAS1068 PCI-X Fusion-MPT SAS 控制器,它sdparm声称它没有打开写缓存,但这已经(据称)在不同供应商的多个驱动器上看到过等等。 ,虽然总是在 Ubuntu 上的 ext4 上。

  2. fsync处于默认状态(on我相信)。

  3. 没有主/从配置——只有一个主——(所以这不是multixact错误)。

  4. 表是使用默认索引创建的(没有花哨的哈希索引)。

  5. Postgres 会定期更新到任何相关的 Ubuntu LTS 版本。最新的问题是在 14.04。

问题

  1. 系统崩溃后手动重建索引是一项预期任务吗?

  2. 如果没有,是否曾经有过,什么时候改变过?

  3. 是否可以避免手动重新索引的需要?

postgresql index crash

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

Postgresql - 返回表的函数出错

我刚刚定义了这个函数来返回给定表中的所有列名:

create or replace function GET_COLUMNS(in tbl_name character varying(30))
returns table(colunas character varying) as $$
begin
    SELECT column_name
    FROM information_schema.columns
    WHERE table_schema = 'Main'
    AND table_name   = tbl_name;
end;
$$ language 'plpgsql'
Run Code Online (Sandbox Code Playgroud)

但是当我使用它调用它时,select * from get_columns('tabfuncionarios');我收到了以下错误:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function get_columns(character varying) line 3 at SQL statement
Run Code Online (Sandbox Code Playgroud)

我正在使用postgresql 9.4.5版本

postgresql plpgsql

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

psql:致命:用户“GuardDog_02”的密码验证失败

在 postgresql 9.5.1 中,我创建了一个名为 GuardDog_02 的用户。我给了它密码。我给了它创建数据库和用户的权限:

CREATE USER GuardDog_02 WITH PASSWORD 'apple100' CREATEDB CREATEUSER;
Run Code Online (Sandbox Code Playgroud)

然后在 GuardDog_02 系统用户(Mac OSX)下:

$ psql -d template1
Password: 
psql: FATAL:  password authentication failed for user "GuardDog_02"
Run Code Online (Sandbox Code Playgroud)

我更新密码只是为了确保我输入正确:

template1=# ALTER USER GuardDog_02 WITH PASSWORD 'apple100';
Run Code Online (Sandbox Code Playgroud)

仍然说密码验证失败。我也检查了 pg_hba.conf 文件:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# …
Run Code Online (Sandbox Code Playgroud)

postgresql authentication

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

PostgreSQL (PostGIS) 和 SQL Server (Spatial) 的结果差异

我有两点,我必须计算它们之间的差异。

我在 SQL Server 中使用以下查询。

SELECT geography::Point(27.185425, 88.124582, 4326)
       .STDistance(geography::Point(27.1854258, 88.124500, 4326));
Run Code Online (Sandbox Code Playgroud)

它运行良好,结果是:

8.12599260290125
Run Code Online (Sandbox Code Playgroud)

现在,当我在 PostgreSQL 中运行以下查询时,同样的情况。

SELECT ST_Distance(ST_GeomFromText('POINT(27.185425 88.124582)',4326),
                   ST_GeomFromText('POINT(27.1854258 88.124500)', 4326));
Run Code Online (Sandbox Code Playgroud)

现在结果是:

8.20039023523232
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么计算两点之间的距离时结果存在差异?

postgresql sql-server spatial postgis

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

不推荐使用 SQL 文本数据类型?

我已经读到 Microsoft SQL Server 已弃用text数据类型而支持varchar(max).

PostGreSQL 已经允许varchar(没有长度)作为text.

问题是,ANSI SQL 标准对弃用text和最佳替代方案有何看法?另外,MySQL/MariaDB 是否也遵循这一点?

谢谢

mysql postgresql sql-server sql-standard

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

为什么我的数据库的数据类型发生了变化?

我在 EC2 实例中安装了 PostgreSQL。我想迁移到RDS,因此使用了DMS服务。但是,后来我意识到列的数据类型已更改。数据类型的变化可以在附加的图像中看到。EC2 中的表

RDS中的表

postgresql aws amazon-dms

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