【发布时间】:2009-04-09 07:15:29
【问题描述】:
我有两张表,如下所示:
News: (ID, Title, TagID)
Tags: (ID, Tag)
每条新闻只能有一个标签。处理对新闻表的插入最有效的方法是什么? Tags 表有大约 50 000 行。
我只做大约的批量插入。一次 300 条新闻,大约每小时 2 次。我假设我需要一些用于标签的内存缓存?
如果标签不在标签表中,我需要插入它并将TagID设置为新插入的id。
希望你能明白!
【问题讨论】:
我有两张表,如下所示:
News: (ID, Title, TagID)
Tags: (ID, Tag)
每条新闻只能有一个标签。处理对新闻表的插入最有效的方法是什么? Tags 表有大约 50 000 行。
我只做大约的批量插入。一次 300 条新闻,大约每小时 2 次。我假设我需要一些用于标签的内存缓存?
如果标签不在标签表中,我需要插入它并将TagID设置为新插入的id。
希望你能明白!
【问题讨论】:
您在后台使用的是什么版本的 SQL Server?
如果您使用的是 SQL Server 2008,我建议将每天的标签和新闻批量加载到临时工作表中,然后使用 MERGE 语句从这些工作表中更新实际的标签和新闻表。我会为此使用 C#“SqlBulkCopy”类。
MERGE 允许您轻松地仅插入已更改的项目,并可能更新已存在的项目,所有这些都在一个方便的 SQL 语句中。
如果您使用的是 SQL Server 2005 或更低版本,您可以执行基本相同的操作,但您必须编写一些代码(C# 或 T-SQL)来手动检查需要从临时批量加载表中插入的内容,以及已经存在的内容。
马克
【讨论】:
我认为对于每个新闻项目,您都会得到一个字符串列表,这些字符串是所谓的“标签”。从您给出的结构来看,每个新闻项只能有一个标签?这似乎不寻常,但以下内容仍然适用。
如果您的 Tags 表上有索引,则搜索速度会非常快,并且无论如何数据库都会处理缓存,因此不必担心缓存。当您在正确的位置建立索引时,您会惊讶于数据库可以加快速度
从标签中选择其中标签 = 不管1(为每个标签执行此操作),每次如果没有返回行就插入它,否则使用您找到的 id 来执行此操作。在每个 INSERT 上运行 proc。
【讨论】: