小编Ole*_*nov的帖子

从PostgreSQL表中选择具有加权行概率的随机行

输入示例:

SELECT * FROM test;
 id | percent   
----+----------
  1 | 50 
  2 | 35   
  3 | 15   
(3 rows)

你会怎么写这样的查询,平均50%的时间我可以获得id = 1的行,35%的时间行id = 2,15%的时间行id = 3?

我尝试了类似的东西SELECT id FROM test ORDER BY p * random() DESC LIMIT 1,但它给出了错误的结果.经过10,000次运行后,我得到了一个类似于的发行版{1=6293, 2=3302, 3=405},但我预计发行版几乎是:{1=5000, 2=3500, 3=1500}.

有任何想法吗?

sql postgresql statistics probability

15
推荐指数
3
解决办法
3905
查看次数

PostgreSql - > CTE + UPDATE + DELETE - >不是预期的结果,为什么?

只是感兴趣,为什么下面(简化)的例子以这种方式工作.

CREATE TABLE test (id SERIAL, val INT NOT NULL, PRIMARY KEY(id));
INSERT INTO test (val) VALUES (1);

WITH t AS ( UPDATE test SET val = 1 RETURNING id ) 
DELETE FROM test WHERE id IN ( SELECT id FROM t);
Run Code Online (Sandbox Code Playgroud)

结果:
DELETE 0

问题:
为什么DELETE没有找到要删除的行?

PostgreSql版本9.2.1
事务隔离=读取提交

谢谢!

postgresql common-table-expression

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

Java:Producer = Consumer,如何知道何时停止?

我有几个工人,使用ArrayBlockingQueue.

每个worker从队列中获取一个对象,对其进行处理,结果可以得到几个对象,这些对象将被放入队列中进行进一步处理.所以,工人=生产者+消费者.

工人:

public class Worker implements Runnable
{
    private BlockingQueue<String> processQueue = null;

    public Worker(BlockingQueue<String> processQueue)
    {
        this.processQueue = processQueue;
    }

    public void run()
    {
        try
        {
            do
            {
                String item = this.processQueue.take();
                ArrayList<String> resultItems = this.processItem(item);

                for(String resultItem : resultItems)
                {
                    this.processQueue.put(resultItem);
                }
            }
            while(true);
        }
        catch(Exception)
        {
            ...
        }
    }

    private ArrayList<String> processItem(String item) throws Exception
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

主要:

public class Test
{
    public static void main(String[] args) throws Exception
    {
        new Test().run();
    }

    private …
Run Code Online (Sandbox Code Playgroud)

java producer-consumer blockingqueue

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

PostgreSql中的数十亿行:分区还是不分区?

是)我有的:

  • 简单的服务器,一个xeon,8个逻辑核心,16 gb ram,mdadm raid1,2x 7200rpm驱动器.
  • PostgreSQL的
  • 很多数据都可以使用.每天最多导入3000万行.
  • 时间复杂的查询可以执行长达一个小时

表的简化模式,将是非常大的:

id| integer | not null default nextval('table_id_seq'::regclass)
url_id      | integer | not null
domain_id   | integer | not null
position    | integer | not null
Run Code Online (Sandbox Code Playgroud)

上面的架构的问题是我没有关于如何对其进行分区的确切答案.将使用所有期间的数据(没有查询将具有日期过滤器).

我想过在"domain_id"字段上进行分区,但问题是很难预测每个分区会有多少行.

我的主要问题是:

如果我不使用分区修剪而且我不打算删除旧数据,那么分区数据是否有意义?

什么是利弊?

如果我不进行分区,如何降低我的导入速度?

另一个与规范化有关的问题:

url应该导出到另一个表吗?

正常化的优点

  • 表将具有平均大小为20-30字节的行.
  • 加入"url_id"应该比"url"字段快得多

非规范化的优点

  • 可以更快,更快地导入数据,因为我不必在每次插入之前查找"url"表.

任何人都可以给我任何建议吗?谢谢!

postgresql partitioning

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

Postgresql - >简单更新的死锁.我无法得到原因

这是表格(简化):

                                       Table "public.link"
    Column     |            Type             |                     Modifiers                     
---------------+-----------------------------+---------------------------------------------------
 id            | integer                     | not null default nextval('link_id_seq'::regclass)
 page_id       | integer                     | 
 placed_at     | timestamp without time zone | default now()
Indexes:
    "link_pkey" PRIMARY KEY, btree (id)
    "link_page_id_index" btree (page_id)
Foreign-key constraints:
    "link_page_id_foreign_key" FOREIGN KEY (page_id) REFERENCES page(id) ON UPDATE RESTRICT ON DELETE RESTRICT

这里是查询(简化):

UPDATE link SET page_id = ?, placed_at = now() 
WHERE id IN ( SELECT id FROM link ... ) AND page_id IS NOT NULL

死锁消息:

ERROR: …

postgresql deadlock database-deadlocks

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