之前检查,或管理例外?

时间:2013-01-30 02:19:21

标签: c# sql performance optimization database-performance

这是一个非常需要的,但我想知道你在性能和设计方面会推荐什么。

当你需要做某事时,什么会更快更好?检查一下是否可以,如果可以的话。或者直接尝试,如果失败,你就会理解这个例子。

这是我的特例: 我有一个数据库表,我将使用foreach填充。该表有一个主键,不能在tabale中重复。

所以..

foreach(object in Objects)
{
   bool exists = //SQL SELECT to check if exists.
   if (exists == false)
   {
      //SQL INSERT
      return INSERTED
    }
   else 
    {
     return failed
    }
}

OR

    foreach(object in Objects)
    {
       try 
          {
          //SQL INSERT
          return INSERTED
           }
       catch
         {
        return FAILED
         }

    }

我想在其他方面了解这方面的最佳做法,例如创建没有覆盖propetry的文件,管理execpiton或在try之前检查文件是否存在。

更新 根据答案,我知道我不应该为每个插件进行交易,因为性能。我应该做一个批量插入。 在我的代码中,我有点像这样的

//SQL Start Transaction
foreach
{
//SQL INSERT
}
//SQL Commit transaction

我的问题是关于交易内部,如果我应该在插入之前检查或只是尝试。

3 个答案:

答案 0 :(得分:3)

例外的建筑成本远高于布尔值。

一些通用指南仅针对实际异常的行为使用异常(您不希望将其作为正常事件),并避免使用异常进行程序控制。

答案 1 :(得分:1)

通过C#进行的大量数据库操作非常无效且耗时。当我接近这个而不是检查时,我通常将插入结构化为一个查询;例如:

"INSERT INTO sitemaps (link, site) 
 (SELECT ('" + NAME2 + "') as link, '" + SITE + "' as site 
   WHERE NOT EXISTS 
 (SELECT link FROM sitemaps 
    WHERE link = '" + NAME2 + "' and site='" + SITE + "')"

这会减轻数据库的负担并削减编码。

另一种选择,一种非常好的方法来增加插入性能(实际上数百次)是将BULK INSERT(仅限MS SQL)用于临时数据库表(对于数千条记录一次非常快);然后,在数据库端,使用MERGE命令并编写if-else场景如何处理更新,插入,删除等。采取后面和后面的部分并将其移动到数据库程序结束。

答案 2 :(得分:0)

如果你想在C#中执行此操作,我建议制作一个HashSet主键,然后在尝试添加它们之前检查对象。

注意:您应确保不使用每个插入向数据库发送查询,因为远远慢于<{1}}和{{1之间的差异 }}。

执行插入操作的最快方法是将它们批处理为单个数据库调用。