哪个更快找到重复?

时间:2011-07-05 12:05:55

标签: primary-key repeat

我有一个包含1列的表,我想检查10,000个可用行之间的值的重复。

我想我有两个选择:

使用SELECT语句进行查询,如下所示:

Var = Query('SELECT * FROM Table WHERE
Field1="VALUE"');

if (Var <> null)
  MessageBox("This value exists in the table");

将我的列设置为Primary Key并使用INSERT语句,如下所示:

try {
    Var = Query('INSERT INTO Table(Field1) VALUES("VALUE")');
}
catch {
    MessageBox("This value exists in the table");
}

哪个更快?

3 个答案:

答案 0 :(得分:1)

我建议使用select count:

Var = Query('SELECT count(*) FROM Table WHERE Field1="VALUE"');

if (Var > 0) MessageBox("This value exists in the table");

第二种方法不太好,IMO,它可能会慢得多。 顺便说一句,它应该读取存在而不是存在: - )

答案 1 :(得分:1)

这里没有一般性答案,这取决于您的架构的设置方式。在大多数(可能是所有?)关系数据库中,将字段设为Primary Key将自动在该字段上创建索引。对索引进行唯一性检查几乎和在这种情况下一样快。

但是,您可以为自己的字段编制索引,而不会将其声明为表Primary Key。如果你这样做,SELECT命令将与INSERT加上catch方法一样快。更广泛地说,每个表只能有一个Primary Key,因此使Primary Key字段不是一个非常强大的解决方案。一旦你想要强制执行唯一性的多个字段,它就会中断(除非你在两个字段中创建一个复合主键......但是我离题了,但这并不强制执行每列唯一性)。

因此,我建议您在字段/列上创建索引,然后使用SELECT方法查看该值是否已存在。或者,您可以为该字段编制索引并规定它应该是唯一的,没有使其成为Primary Key,并使用INSERT加上catch方法。

答案 2 :(得分:1)

如果你想插入一个值,如果它不存在,那么类似下面的内容将是最合适的(虽然可能适用不同的SQL方言):

INSERT INTO Table(Column)
SELECT 'New Value' WHERE NOT EXISTS (SELECT * FROM Table where Column = 'New Value')

然后检查0或1行是否受到影响。

请注意我说的最合适,我没有进行绩效评估。我在谈论最清楚地表达 intent 的代码。通常,这将足够好。只有极少数情况下你才能放弃最能明确表达你意图的代码,因为那些不那么清晰的代码可以提高0.5%......


您还应该注意您的第一种格式(SELECT * FROM TABLE...),作为一般风格。如果您正在查询大型宽表,执行此类选择可能会导致数据库执行大量I / O,以检索所有列值,只为您的代码忽略所有这些值。另一方面,EXISTS子句中的SELECT *...由大多数数据库引擎专门处理,不会检索实际的行/列数据。