我有一个执行大量重复工作的查询:
SELECT visitor_id, '1'::text AS filter
FROM events
WHERE id IN (SELECT event_id FROM params
WHERE key = 'utm_campaign' AND value = 'campaign_one')
AND id IN (SELECT event_id FROM params
WHERE key = 'utm_source' AND value = 'facebook')
GROUP BY visitor_id
UNION ALL
SELECT visitor_id, '2'::text AS filter
FROM events
WHERE id IN (SELECT event_id FROM params
WHERE key = 'utm_campaign' AND value = 'campaign_two')
AND id IN (SELECT event_id FROM params
WHERE key = 'utm_source' AND value = 'facebook') …Run Code Online (Sandbox Code Playgroud) 我很难弄清楚如何准确实现“如果未找到则插入”功能。考虑以下。
我们有一个名为artist2 列的表,(name, id)其中name是唯一id键,是串行主键。这是一个人为的例子,但它说明了我的问题:
SESSION A SESSION B
1. SELECT id FROM artist
WHERE name = 'Bob';
2. INSERT INTO artist (name)
VALUES ('Bob')
3. INSERT INTO artist (name)
VALUES ('Bob')
4. code that users 'Bob'
(e.g., a FK to Bob's ID)
5. ??? Bob already exists, but we
can't find it
4. COMMIT
Run Code Online (Sandbox Code Playgroud)
会话 B 开始尝试找到一个artist叫 Bob 的人,但失败了。但是,会话 A 然后创建了 Bob。会话 B 尝试插入名为 Bob 的艺术家,但由于违反主键而失败。但这是我不明白的一点——如果我将操作 3 更改 …
我希望在具有许多非唯一值的字段上的大表(约 5000 万行)上创建索引。
表架构如下所示:
Column | Type | Modifiers | Storage | Stats target | Description
--------+-----------------------+-----------+----------+--------------+-------------
gid | character varying(20) | | extended | |
word | character varying(30) | | extended | |
stat | double precision | | plain | |
Has OIDs: no
Run Code Online (Sandbox Code Playgroud)
我想在 'word' 列上创建一个索引。有一个相当规律的模式,每个单词出现大约 1000 次。我需要做快速SELECT * FROM mytable WHERE word='something';查询。在这些表上创建常规 B 树索引需要大量时间,但确实可以显着提高性能。
由于几个原因,我现在对我的解决方案感到不舒服
(1) B-Tree 索引的选择不是特别积极。是否有替代索引方案在具有高度重复值的字段上表现更好?
(2) 我在一个生产环境中,这些表相当频繁地出现和消失。因为并非所有表都会被大量查询,所以我选择只在触发某些(数据库外)应用程序时在表上构建索引,这样我知道将在表+字段上执行 10k+ 次查询。然而,在创建索引时等待 20 分钟并不理想。情况很微妙;通过创建索引获得的优化与创建索引所需的初始 time-sink 竞争。是否有“更便宜”的索引可以创建?也许整体性能比 B-Tree 稍差,但初始创建成本更低?