SQL Server例程插入多行检查后,如果他们不存在-我怎么能提高我的性能
本文关键字:怎么能 高我的 性能 我的 不存在 他们 插入 例程 Server 检查 如果 | 更新日期: 2023-09-27 18:12:11
我有一个sql server 2008数据库表,包含文章的链接。我的应用程序程序是,每~1-10秒,我得到一个包含一个url的10-100篇新文章的列表,我需要做的是检查每篇文章的url,如果它不存在,我将添加它。
我是怎么知道的:第一件事-我为url做了一个唯一的索引,所以无论如何-我不会有相同的url不止一次(当然,在我插入它之前,我将url规范化,例如剪掉它的'http://www.'前缀等)。
'InsertArticles'方法是这样的:
- 打开交易
- 对于每个链接-检查(使用事务)它的url是否存在于数据库
- 为每个不存在的链接添加链接(当然,使用相同的事务)
- 执行并关闭事务+处理事务/一般异常
的事情是-大多数时候它的工作速度非常快(0.05-0.2秒),大约10-20个左右的链接。但有时它会变得更慢-甚至可能需要50秒才能调用50篇文章的这个方法。
这里有两个问题-
- 是我做的好吗?对于这种工作,我应该使用交易吗?
- 我有什么选择?也许插入如果不存在?
我也在想-为什么不只是'蛮力插入'的新文章到数据库-意思是,我将尝试插入所有的输入url到数据库,我会让sql server抛出一个异常为那些已经存在的url .
也许使用存储过程来完成所有这些可以提高性能?
您可以尝试使用merge语句将SELECT和INSERT合并到一个语句中:
-- Table "links" with column "url"
MERGE links AS L
USING (SELECT url FROM links WHERE url = @url) AS I (url)
ON (L.url = I.url)
WHEN NOT MATCHED THEN INSERT (url) VALUES (@url)