我在数据库中有很多表,其中至少有一个包含Url的列。这些在数据库中重复了很多次。所以我将它们规范化为专用表,我只需要在需要它的地方使用数字ID。我经常需要加入它们,因此数字ID比完整字符串要好得多。
在MySql + C++
中,要在一次攻击中插入大量网址,我过去常常使用多行INSERT IGNOREs
或mysql_set_local_infile_handler()
。然后使用SELECT
批处理IN ()
以从数据库中取回ID。
在C# + SQLServer
中,我注意到SqlBulkCopy
课程在群众插入方面非常有用和快速。但我插入后也需要批量选择来解析Url ID。 是否有任何此类帮助程序类与SELECT WHERE IN (many, urls, here)
的作用相同?
或者您是否有更好的想法在C#中以一致的方式将网址转换为数字?我在考虑crc32
网址或crc64
他们但我担心碰撞。我不在乎碰撞是否很少,但如果不是......那将是一个问题。
PS :我们正在谈论数以千万计的网址以了解规模。
PS :对于基本大型插入,SQLBulkCopy
比SqlDbType.Structured
快。此外,它还有SqlRowsCopied
事件用于状态跟踪回调。
答案 0 :(得分:2)
甚至比SQLBulkCopy更好的方法。
它被称为Structured Parameters,它允许您通过ADO.NET将表值参数传递给存储过程或查询。
文章中有代码示例,因此我只重点介绍了启动和运行所需的操作:
UrlTable
UrlTable
DataTable
具有相同结构的UrlTable
,用URL填充它并将其作为结构化参数传递给SqlCommand
。请注意,列顺序对应关系在数据表和表类型之间是至关重要的。 ADO.NET在幕后做了什么(如果你对查询进行了剖析,你可以看到这个)是在查询之前它声明了一个UrlTable
类型的变量并用你传入的内容填充它(INSERT语句)结构化参数。
除此之外,在查询方面,您可以使用SQL中的表值参数(连接,选择等)完成所有操作。
答案 1 :(得分:0)
我认为您可以在索引上使用IGNORE_DUP_KEY选项。如果在URL列的索引上设置IGNORE_DUP_KEY = ON,则只会忽略重复的值,并相应地插入其余值。