2009-02-16 29 views
3

我正在考虑在我的代码中特别沉重的部分进行优化。 它的任务是将统计数据插入到表中。这些数据正在被其他程序打出相当数量。否则,我会考虑使用SQL批量插入等SQL性能 - 更好地插入并引发异常或检查存在?

所以我的问题是...

它是确定,试图插入一些数据知道它可能(不要过于频繁)抛出SQLException的重复行?

比插入前检查每行更差的异常的性能是否会受到影响?

回答

6

首先,我的建议是宁可正确性的一面,而不是速度。当你完成你的项目和分析表明你丢失了重要的时间检查插入它们之前存在的行,只有然后优化它。

其次,我认为如果所有RDBMS中都有重复项,就会有插入和跳过的语法,所以这首先不应该是个问题。我尽量避免将异常作为正常应用程序流程的一部分,并将其留作真正的特殊情况。也就是说,不要指望数据库中的异常来解决代码中的逻辑问题。保持最终(代码)上的一致性,并让DB异常仅指示真正的错误。

0

是的,我会经常检查。例如电子邮件地址或IP地址。

如果您担心性能会使用存储过程来处理重复的逻辑。

2

我认为是更好地利用一个存储过程,以及使用IF

IF(SELECT COUNT(*)FROM X其中Y = Z)= 0 INSERT INTO(X)VALUES( 'XX') ....

,你可以添加一个else条件...

+0

NOT EXISTS是影响查询的性能(应该是)总是快于计数。 – 2009-02-16 07:43:36

+0

是的,不仅EXISTS测试会比COUNT(*)快,在大表上COUNT(*)会很慢,即使列索引为 – Kristen 2009-02-16 07:51:33

6

在纯粹的性能级别上,插入数据和处理错误的速度更快,特别是在错误不频繁的情况下。运行选择查询来检查重复项,处理结果,然后插入(如果成功),将比插入和处理偶然错误慢得多。如果它引发一个异常,那么这将会慢一些,因为在大多数语言中异常处理速度很慢,但处理异常比任何语言的SQL查询要快很多倍。按照Assaf的说法,通常还有一种方法可以明确处理重复项,以便完全避免错误。这会进一步提高性能,并让您明确表示您正在以特定方式处理重复项。

是否使用存储过程取决于您 - 它可以帮助提高性能,但会增加数据库中的逻辑。这是你必须做出的决定。我对此有过不好的经验,但它取决于RDBMS和您使用的语言。

0

在这里可能不太相关的问题。

但是我在一个项目中工作,在此之前以编程方式删除表格,用于检查表格是否存在。

当我们开始优化代码时,我们将其更改为处理特定的异常,而不是在删除表之前检查表的存在。

而且我们有相当多的时间改进,因为我们在流程流中使用了存在检查。

有了这样的思路,我认为处理异常而不是另一个数据库查询检查成本更低。

2

我没有看到存储过程会加速单例插入,除非涉及其他处理。可将eB其他好处虽然 - 保持所有的逻辑一旦放置等

个人,如果有重复等,我会插入和捕获错误

如果你做一个IF NOT EXISTS检查,然后有条件INSERT有是事务需要锁定的时间间隔,这可能会增加表上的阻塞。

对于一个忙碌的插入表,值得检查该表是如何分割的。如果您在身份/自动编号列中插入了群集PK,则所有插入都位于一端(索引可以具有100%的填充因子),但是如果插入在整个聚簇索引中是随机的,那么您可能会从页面拆分等问题中获得问题。

一个相关的问题是,在表中的统计数据很可能会很快会过时,而且可以使用缓存查询计划等