SQL Server 在检查多行是否不存在后插入多行的例程 - 我怎样才能提高我的性能?

发布于 2024-12-11 07:37:37 字数 732 浏览 0 评论 0原文

我有一个 sql server 2008 数据库表,其中包含文章的链接。 我的应用程序例程是,每隔约 1-10 秒我就会收到包含 url 的 10-100 篇新文章的列表, 我需要做的是检查每篇文章的网址,如果数据库中不存在,我将添加它。

我是怎么知道的: 第一件事 - 我为网址创建了一个唯一的索引,所以无论如何 - 我不会多次使用相同的网址(当然,我会规范化网址,例如在插入之前剪切它的“http://www.”前缀等)它)。

“InsertArticles”方法是这样的:

  1. 为每个链接打开一个事务
  2. - 检查(使用事务)每个不存在的链接的 url 是否存在于数据库中
  3. - 添加链接(当然,使用相同的事务)
  4. 执行并关闭事务+处理事务/一般异常情况

是这样的 - 大多数时候它工作得非常快(0.05-0.2秒)大约10-20个左右的链接.. 但有时它会变得慢得多 - 甚至需要 50 秒才能调用 50 篇文章的方法。

所以这里有两个问题——

  1. 我做的可以吗?我应该使用交易来完成这种工作吗?
  2. 我有什么选择?如果不存在的话可以插入吗?

我也在想 - 为什么不只是将新文章“暴力插入”到数据库 - 意思是,我将尝试将所有输入网址插入到数据库中,并且我将让 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:

  1. Open a transaction
  2. for each link - check (using the transaction) if its url exists in the db
  3. for each unexisting link - add the link (of course,using the same transaction)
  4. 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 -

  1. is what I do ok ? should i use transactions for this kind of a job?
  2. 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

坦然微笑 2024-12-18 07:37:37

您可以尝试使用 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)

You could try the MERGE-statement to combine the SELECT and INSERT into one statement:

-- 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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文