2010-08-17 60 views
0

条件我想执行一个SQL查询在逻辑上等同于以下内容:有效途径凡在SQL语句

DELETE FROM pond_pairs 
WHERE 
    ((pond1 = 12) AND (pond2 = 233)) OR 
    ((pond1 = 12) AND (pond2 = 234)) OR 
    ((pond1 = 12) AND (pond2 = 8)) OR 
    ((pond1 = 13) AND (pond2 = 6547)) OR 
    ((pond1 = 13879) AND (pond2 = 6)) 

我将有几十万pond1 - pond2对。我有(pond1, pond2)的索引。

我有限的知识SQL想出了几种方法:

  1. 运行整个查询的是。
  2. 批量查询成更小的查询与nWHERE条件
  3. 保存pond1 - pond2对到一个新表,并做一个子查询WHERE子句中识别
  4. 转换标识要删除的行蟒蛇逻辑进入存储过程。请注意,我不熟悉编程的存储过程,因此这可能会涉及到一个陡峭的学习曲线。

我使用Postgres的,如果这是相关的。

回答

1

对于大量的pond1-pond2对在一个DELETE中被删除,我会创建临时表并加入到这张表中。

-- Create the temp table: 
CREATE TEMP TABLE foo AS SELECT * FROM (VALUES(1,2), (1,3)) AS sub (pond1, pond2); 

-- Delete 
DELETE FROM bar 
USING 
    foo -- the joined table 
WHERE 
    bar.pond1= foo.pond1 
AND 
    bar.pond2 = foo.pond2; 
+0

虽然(除非对已经存在于数据库中),但使用对填充TEMP TABLE与原始DELETE问题是等效的问题。 – Thilo 2010-08-17 06:10:19

+1

不,您可以使用COPY填充临时表。这比其他选项更快地将数据存入临时表。我只是举了一个非常简单的例子,但这个想法是一样的。 – 2010-08-17 06:15:48

+0

您能否演示如何使用COPY填充临时表? – Thilo 2010-08-17 06:37:45

1

我会做3.(与JOIN,而不是子查询),测量DELETE查询的时间(不创建表和插入)。这是很好的起点,因为加入是非常普遍和优化过程中,所以这将是很难被击败的那个时候。然后,您可以将该时间与您当前的方法进行比较。你

也可以尝试以下方法:以同样的方式

  1. 排序对作为索引。
  2. 从您的描述中删除使用方法2.(可能在单个事务中)。

删除前的排序会提高索引读取性能,因为硬盘缓存工作的可能性更大。

+0

DELETE作品对连接的表? – Thilo 2010-08-17 06:03:21

+0

是的,你有例子在弗兰克Heikens答案。 – 2010-08-17 06:12:46

+0

,使用条款整洁。但他仍然需要将这些对发送到数据库中e(除非他们已经在某处)。 – Thilo 2010-08-17 06:44:29

0

由于SQL语句太长,因此有成千上万对,因此您无法执行1(按原样运行查询)。

3如果您已经在表格中配对了,那么这很好。如果不是,您需要先插入它们。如果您以后不需要它们,那么您可以运行相同数量的DELETE语句而不是INSERT语句。

如何在循环一份声明,也许分批(如果Python的支持)

  1. 开始交易
  2. 准备语句“DELETE FROM pond_pairs WHERE((pond1 =?)AND(pond2 =?))”
  3. 环比数据(在Python),并运行一个对的语句(或添加到批)
  4. 提交

哪里都是对来自哪里?如果你能写一个SELECT语句来识别它们,你可以移动这个条件进入你删除的WHERE子句。

DELETE FROM pond_pairs WHERE (pond1, ponds) in (SELECT pond1, pond2 FROM ...... )