SQL Server 在检查多行是否不存在后插入多行的例程 - 我怎样才能提高我的性能?
我有一个 sql server 2008 数据库表,其中包含文章的链接。 我的应用程序例程是,每隔约 1-10 秒我就会收到包含 url 的 10-100 篇新文章的列表, 我需要做的是检查每篇文章的网址,如果数据库中不存在,我将添加它。
我是怎么知道的: 第一件事 - 我为网址创建了一个唯一的索引,所以无论如何 - 我不会多次使用相同的网址(当然,我会规范化网址,例如在插入之前剪切它的“http://www.”前缀等)它)。
“InsertArticles”方法是这样的:
- 为每个链接打开一个事务
- - 检查(使用事务)每个不存在的链接的 url 是否存在于数据库中
- - 添加链接(当然,使用相同的事务)
- 执行并关闭事务+处理事务/一般异常情况
是这样的 - 大多数时候它工作得非常快(0.05-0.2秒)大约10-20个左右的链接.. 但有时它会变得慢得多 - 甚至需要 50 秒才能调用 50 篇文章的方法。
所以这里有两个问题——
- 我做的可以吗?我应该使用交易来完成这种工作吗?
- 我有什么选择?如果不存在的话可以插入吗?
我也在想 - 为什么不只是将新文章“暴力插入”到数据库 - 意思是,我将尝试将所有输入网址插入到数据库中,并且我将让 sql server 对那些已经存在的网址抛出异常。也许
使用存储过程来完成所有这些可以提高性能?
无论如何,任何帮助将不胜感激。
I have an sql server 2008 db table that holds links to articles.
My app routine is that every ~1-10 seconds i get a list of 10-100 new articles that contain a url,
and what i need to do is check every article's url and if it doesn't exist on the db i will add it.
How i do it know :
first thing - i made a unique index for the url so no matter what - i won't have the same url more than once (of course i normalize the url e.g cut it's 'http://www.' prefix etc before i insert it).
the 'InsertArticles' method is something like this:
- Open a transaction
- for each link - check (using the transaction) if its url exists in the db
- for each unexisting link - add the link (of course,using the same transaction)
- execute and close the transaction + handle transaction/general exceptions
the thing is - most of the time it works very fast (0.05-0.2 secs) for about 10-20 or so links..
but sometimes it gets much slower - it can even take 50 secs to call this method with 50 articles.
So 2 questions here -
- is what I do ok ? should i use transactions for this kind of a job?
- what alternatives do i have ? maybe insert if not exists ?
i was also thinking - why not just 'brute insert' the new articles to the db - meaning, i will try to insert all the input url's to the db and I will let sql server throw an exception for those urls that already exist there..
Maybe using a stored proceude to do all of this can enhance perfomance ?
anyway any help would be appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以尝试使用 MERGE 语句将 SELECT 和 INSERT 合并到一个语句中:
You could try the MERGE-statement to combine the SELECT and INSERT into one statement: