【发布时间】:2012-05-29 21:24:26
【问题描述】:
我有很多数据需要根据一些简单的标准进行配对。有一个时间窗口(两条记录都有一个 DateTime 列),如果一条记录在时间上(5 秒内)非常接近另一条记录,则它是潜在匹配,时间最接近的记录被认为是完全匹配。还有其他字段也有助于缩小范围。
我写了一个存储过程,它在返回之前在服务器上进行匹配 完整、匹配的数据集到 C# 应用程序。我的问题是,将 100 万 (x2) 行拉入并在 C# 中处理它们会更好,还是 sql server 更适合执行这种匹配?如果 Sql server 是,那么使用 datetime 字段配对数据的最快方法是什么?
现在我将表 1/表 2 中的所有记录选择到临时表中,遍历表 1 中的每条记录,在表 2 中查找匹配项并将匹配项(如果存在)存储在临时表中,然后我删除各自临时表中的两条记录。
为了我正在写的游戏,我不得不匆忙写这篇文章,所以请原谅糟糕的(非常糟糕的)程序......它有效,只是效率低得可怕!整个 SP 在 pastebin 上可用:http://pastebin.com/qaieDsW7
我知道 SP 写得不好,所以说“嘿,笨蛋……写得更好”并没有帮助!我正在寻求改进它的帮助,或者关于我应该如何以不同的方式做整个事情的帮助/建议!我有大约 3/5 天的时间来重写它,我可以将截止日期推迟一点,但如果你们能及时帮助我,我宁愿不要! :)
谢谢!
【问题讨论】:
-
您绝对需要进行实验。最好在更小、更易于处理的测试集上。但我的猜测是,如果你做对了,SQL 将是明显的赢家......恕我直言......
-
我过去做过类似的事情,我必须根据某种滑动窗口来匹配记录(尽管我必须使用不同步的时间源跨不同的数据源工作 [关闭几分钟] )。无论如何,我发现做到这一点的最简单方法是首先将所有数据按时间升序插入临时表(就像你正在做的那样),然后通过从中选择并将其连接回自身来对表进行修改来确定更新值。如果您对此技术有任何疑问,请联系我SO C# Chat
-
也许您可以创建一个表值函数来进行匹配并将
CROSS APPLY与第一个表一起使用?无论如何,我想在服务器上这样做会更有效率。
标签: c# sql sql-server database c#-4.0