我有一个关于如何JOIN在多个表上工作的基本问题。我想计算link1&中外键的出现次数link2
CREATE TABLE main (
id SERIAL PRIMARY KEY,
name text NOT NULL
);
CREATE TABLE link1 (
id SERIAL PRIMARY KEY,
main_id integer NOT NULL,
CONSTRAINT main_id_fk FOREIGN KEY (main_id) REFERENCES main (id)
);
-- link2 is similar to link1
Run Code Online (Sandbox Code Playgroud)
当两列中的计数都不为零时,为什么下面的查询会给出计数的乘积(而不是总和)。
SELECT main.id, COUNT(link1.main_id) + COUNT(link2.main_id)
FROM main
LEFT JOIN link1 ON main.id=link1.main_id
LEFT JOIN link2 ON main.id=link2.main_id
GROUP BY main.id
Run Code Online (Sandbox Code Playgroud) 我即将创建一个包含 15 亿行的 Postgres 表。该表将只有一个 TEXT 列。
该表实际上是一个黑名单。当我的软件用户保存某些数据时,会查找该表以确保他们保存的值不存在于其中。
我可以做些什么来优化 Postgres 或该表以尽可能快地“读取”?该表将仅被写入大约一年一次。
要在 postgres 中强制执行部分唯一性,创建部分唯一索引而不是显式约束是一种众所周知的解决方法,如下所示:
CREATE TABLE possession (
possession_id serial PRIMARY KEY,
owner_id integer NOT NULL REFERENCES owner(owner_id),
special boolean NOT NULL DEFAULT false
);
CREATE UNIQUE INDEX possession_unique_special ON possession(owner_id, special) WHERE special = true;
Run Code Online (Sandbox Code Playgroud)
这将限制每个所有者在数据库级别拥有不超过一个特殊财产。显然,创建跨多个表的索引是不可能的,因此在列存在于不同表中的超类型和子类型情况下,此方法不能用于强制执行部分唯一性。
CREATE TABLE possession (
possession_id serial PRIMARY KEY,
owner_id integer NOT NULL REFERENCES owner(owner_id)
);
CREATE TABLE toy (
possession_id integer PRIMARY KEY REFERENCES possession(possession_id),
special boolean NOT NULL DEFAULT false
);
Run Code Online (Sandbox Code Playgroud)
如您所见,在此示例中,较早的方法不允许将每个所有者限制为不超过一个特殊玩具。假设每个财产都必须实现一个子类型,那么在不大量改变原始表的情况下在 postgres 中强制执行此约束的最佳方法是什么?
我正在寻找有关如何为我正在创建的游戏设计高分表的意见。
我使用的数据库是postgres。这不是我真的可以或不想改变的东西(除非有很好的理由)。
version
-----------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 9.3.4 on x86_64-apple-darwin13.1.0, compiled by Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn), 64-bit
Run Code Online (Sandbox Code Playgroud)
我的目标是允许多达 10 000 000 行。我不确定这是否现实。
在我最初的尝试中,表格是最简单的表格(注意键alias和score)。
Column | Type | Modifiers
---------+------------------------+---------------------------------------------------------
id | integer | not null default nextval('highscores_id_seq'::regclass)
traceid | integer |
alias | character varying(256) |
score | integer |
rows | integer |
level | integer |
duration | integer |
Indexes:
"highscores_pkey" PRIMARY KEY, btree (id)
"highscores_alias_idx" btree (alias) …Run Code Online (Sandbox Code Playgroud) 我想要做的是检查列的值是否等于某个字符串,但不区分大小写。在ilike不使用通配符(百分比)和lower()? 的情况下使用时是否存在性能差异?
我打算在上创建索引lower(column_name)并使用lower(column_name) = value(值已经是小写的),但结果证明我使用的 ORM 不允许我以lower()漂亮的方式使用(但有方便的方法ilike)。会column_name ilike 'value'使用lower(column_name)索引吗?
我有一个 PostgreSQL 表,其中有两列名为col1and col2,都是整数类型(表中有大约 10M 行)。我想执行 SQL 查询,例如:
SELECT * FROM table WHERE col1 >= val1 AND col2 <= val2;
Run Code Online (Sandbox Code Playgroud)
(对某些val1和val2我知道的查询时间)。
如果我将 btree 索引放在上面col1并且col2PostgreSQL 尝试执行查询,在两列之一上执行索引扫描,然后在另一列上进行过滤。这意味着在大多数情况下,它必须扫过大约一半的表,即使匹配的行数很少。添加多列索引是没有用的,因为只有当两列中的至少一列经过相等性测试时,PostgreSQL 才能有效地使用它。
不过,我可以对这些值做出的一个重要假设是,这两列相对于另一列是单调的。这意味着如果在一行col1中大于或等于col1另一行中的两个,则两个对应col2条目之间的相同关系是有效的。
这意味着原则上可以通过对两列之一执行索引扫描、过滤另一列并在第二列上发现不匹配的值时立即停止执行来加快查询执行速度。在这种情况下,查询将准确读取要返回的行。
有什么方法可以在 PostgreSQL 中设置索引或任何其他不变量,以便查询规划器能够检测到这一点?
(当然,问题可以通过执行两个查询轻松解决,第一个将不等式col2转换为不等式 on col1;我问是否有办法避免这种解决方法并让 PostgreSQL 自己管理混乱)
我正在尝试创建一个脚本,该脚本在两个 postgres 9.4 数据库之间创建 postgres-fdw 连接。该脚本(在版本控制下签入)一直依靠 pgpass 来做其他事情。我可以使用任何选项来请求在 pgpass 中查找密码吗?...一般来说,关于哪些选项可用的文档在哪里CREATE USER MAPPING?该参考只是说,选项取决于在服务器上。
我有一张如下表:
order_item
------------
serial | id (PK)
integer | order_id
???? | quantity
integer | unit_of_measure_id (PK) --> ml, l, kg, mg, mm, m, etc.
Run Code Online (Sandbox Code Playgroud)
我正在做一个应用程序,我需要存储化学分析中使用的材料量。有时材料的用量很小,如微升,有时则更多,如一两升。
它的numeric数据类型是否足够好?
我读过将值转换为最小度量单位是个好主意。所以如果我有 10 升,我必须传递到 10000000 微升。但是,如果您将来需要使用更低的度量单位怎么办?像皮升?不可避免地,我认为应用程序将不得不使用浮点数。
我被要求对一个在后端使用 postgresql 的应用程序进行逆向工程。我可以看到正在进行一些数据库复制...根据我的阅读,我*认为它被称为流复制。主服务器上的设置如下所示:
wal_level = hot_standby
max_wal_senders = 5
wal_keep_segments = 32
Run Code Online (Sandbox Code Playgroud)
我的问题是:什么会影响在 master 上创建新记录与何时出现/复制到 slave 之间的延迟?
通过阅读手册,(http://www.postgresql.org/docs/current/static/hot-standby.html)我看到它使用的模型是“最终一致性”......该页面上的第 4 段指出:
备用服务器上的数据需要一些时间才能从主服务器到达,因此主服务器和备用服务器之间会存在可测量的延迟。因此,在主数据库和备用数据库上几乎同时运行相同的查询可能会返回不同的结果。我们说备用数据库上的数据最终与主数据库一致。
但是有没有任何模式/方法可以猜测需要多长时间?或者它真的只是随意的?
如果您能指出我正确的方向,我将不胜感激。谢谢。
我在试图改变类型的列时,这个错误time类型为timestamp:
PG::CannotCoerce: ERROR: cannot cast type time without time zone to timestamp without time zone
Run Code Online (Sandbox Code Playgroud)
现有时间如何转换对我来说并不重要,但我确实需要更改此列。我怎么能强制这个或投这个?
这是 SQL 语句:
ALTER TABLE "students" ALTER COLUMN "time_since_missing_schedule_notification" TYPE timestamp USING CAST(time_since_missing_schedule_notification AS timestamp)
Run Code Online (Sandbox Code Playgroud)
我正在使用 Rails/ActiveRecord,这是生成上述 SQL 语句的 Ruby 代码:
change_column :students, :time_since_missing_schedule_notification, 'timestamp USING CAST(time_since_missing_schedule_notification AS timestamp without time zone)'
Run Code Online (Sandbox Code Playgroud)
当我连接到 Heroku 的 PostgreSQL 服务器时,我得到以下版本:
psql (9.3.1, server 9.2.7)
Run Code Online (Sandbox Code Playgroud) postgresql ×10
performance ×3
aggregate ×1
cast ×1
foreign-data ×1
heroku ×1
inheritance ×1
join ×1
orm ×1
partitioning ×1
rails ×1
replication ×1