我有这个 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 中获得最佳性能,那么下面的 sqlite pragma 相当于什么。
pragma synchronous = OFF;
pragma journal_mode = OFF;
pragma count_changes = OFF;
pragma temp_store = MEMORY;
Run Code Online (Sandbox Code Playgroud) 我在 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)
为什么 PG 需要大量 RAM?
如何减少 PG 的缓存缓冲区?
我们在主数据库和从数据库之间有 PostgreSQL 9.3.9 流式复制。在复制时,Master 上是否会发生可能导致持久性问题或 Master 和 Slave DB 完全失败的问题?在复制时,我是否总是会保持持久性并准备好工作或恢复从属数据库?
我正在努力解决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。
我依稀记得在 8.4 下看到过这个问题,所以我认为其中有一些道理。
我确信这也发生在 Ubuntu 14.0.4 下的 Postgres 9.3 上。我不知道它是否“经常”发生。它发生的系统正在运行(公认的旧)企业级 SAS 驱动器,该驱动器声称写入缓存已关闭,因此我认为这不是写入缓存问题。
如果情况仍然如此,我想我可以在网上找到比我能找到的更多的证据。
因此,我怀疑它可能已修复,或者可能是由于某些问题造成的postgresql.conf(尽管检查表明只有 autovacuum 设置从默认值更改)。
在我最近知道的系统中(使用 9.3)没有使用 LVM。存储系统是 ext4,安装在具有默认属性的物理驱动器上。这个驱动器是一个(公认的老)企业 SAS 驱动器加上 SAS1068 PCI-X Fusion-MPT SAS 控制器,它sdparm声称它没有打开写缓存,但这已经(据称)在不同供应商的多个驱动器上看到过等等。 ,虽然总是在 Ubuntu 上的 ext4 上。
fsync处于默认状态(on我相信)。
没有主/从配置——只有一个主——(所以这不是multixact错误)。
表是使用默认索引创建的(没有花哨的哈希索引)。
Postgres 会定期更新到任何相关的 Ubuntu LTS 版本。最新的问题是在 14.04。
系统崩溃后手动重建索引是一项预期任务吗?
如果没有,是否曾经有过,什么时候改变过?
是否可以避免手动重新索引的需要?
我刚刚定义了这个函数来返回给定表中的所有列名:
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');我收到了以下错误:
Run Code Online (Sandbox Code Playgroud)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
我正在使用postgresql 9.4.5版本
在 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) 我有两点,我必须计算它们之间的差异。
我在 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)
谁能告诉我为什么计算两点之间的距离时结果存在差异?
我已经读到 Microsoft SQL Server 已弃用text数据类型而支持varchar(max).
PostGreSQL 已经允许varchar(没有长度)作为text.
问题是,ANSI SQL 标准对弃用text和最佳替代方案有何看法?另外,MySQL/MariaDB 是否也遵循这一点?
谢谢
postgresql ×10
sql-server ×2
amazon-dms ×1
aws ×1
crash ×1
enterprisedb ×1
index ×1
mysql ×1
performance ×1
plpgsql ×1
postgis ×1
replication ×1
spatial ×1
sql-standard ×1
sqlite ×1