gpt4 book ai didi

C# 和 SQLServer 标准化大量的 Urls

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:22 25 4
gpt4 key购买 nike

我在数据库中有许多表,它们至少有一列包含一个 Url。这些在整个数据库中重复了很多次。所以我将它们规范化为一个专用表,我只在需要的地方使用数字 ID。我经常需要加入它们,因此数字 ID 比完整字符串要好得多。

MySql + C++中,为了一次插入很多Urls,我曾经使用多行INSERT IGNOREs或者mysql_set_local_infile_handler()。然后使用 IN () 批处理 SELECT 以从数据库中拉回 ID。

C# + SQLServer 中,我注意到有一个 SqlBulkCopy 类在批量插入中非常有用且速度很快。但我还需要批量选择来解析插入后的 Url ID。 是否有任何这样的辅助类可以像 SELECT WHERE IN (many, urls, here) 一样工作?

或者对于在 C# 中以一致的方式将 Urls 转换为数字,您有更好的主意吗?我考虑过 crc32'ing urls 或 crc64'ing 他们但我担心碰撞。我不在乎碰撞是否很少,但如果不是……那将是一个问题。

PS:我们讨论数千万个 Url 是为了了解规模。

PS:对于基本的大型插入,SQLBulkCopySqlDbType.Structured 更快。此外,它还有用于状态跟踪回调的 SqlRowsCopied 事件。

最佳答案

还有比 SQLBulkCopy 更好的方法。

它叫做 Structured Parameters它允许您将表值参数传递给存储过程或通过 ADO.NET 进行查询。

文章中有代码示例,所以我只会强调你需要做些什么来启动它并工作:

  1. 在数据库中创建一个用户定义的表类型。你可以称它为 UrlTable
  2. 设置一个 SP 或查询,它通过连接一个表变量或类型 UrlTable
  3. 来执行 SELECT
  4. 在您的支持代码 (C#) 中,创建一个与 UrlTable 具有相同结构的 DataTable,用 URL 填充它并将它传递给 SqlCommand through 作为结构化参数。请注意,列顺序对应关系在数据表和表类型之间至关重要。

ADO.NET 在幕后所做的事情(如果您对查询进行概要分析,您会看到这一点)是在查询之前它声明了一个类型为 UrlTable 的变量并用什么填充它(INSERT 语句)您传入结构化参数。

除此之外,在查询方面,您可以使用 SQL 中的表值参数执行几乎所有操作(连接、选择等)。

关于C# 和 SQLServer 标准化大量的 Urls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25241966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com