相关疑难解决方法(0)

在关系除法中删除重复的 SELECT 语句

我有一个执行大量重复工作的查询:

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)

relational-division redshift

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

如何在可序列化隔离级别为事务实现 insert-if-not-found?

我很难弄清楚如何准确实现“如果未找到则插入”功能。考虑以下。

我们有一个名为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 更改 …

postgresql transaction serialization

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

在具有许多共享值的非常大的表上创建索引

我希望在具有许多非唯一值的字段上的大表(约 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 稍差,但初始创建成本更低?

postgresql index

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