SQL和平面文件哪个更高效?

4
我正在考虑升级一个实时程序ASP.NET C#,它会频繁地更新数据并将其从一个数据库移动到另一个数据库。
目前使用的是一个中间应用程序,通过SqlBulkCopy从一个数据库中提取并插入到另一个数据库中。
是否更好让源数据库服务器编写一个平面文件,然后中间人从该平面文件中收集?
或者使用SQL触发器?
或者DTS?
任何建议都将非常有用!
谢谢。

3
同一句话中不理解 ASP.NET 和实时的含义! - leppie
非常频繁,比如每毫秒、每秒、每分钟...?扁平文件永远不是答案。触发器是“最快”的(最低延迟)。您需要什么样的延迟? - Kieren Johnstone
当前应用程序每60秒访问SQL。 - Chris M
5个回答

2

这实际上取决于你传递的数据量以及是否有任何转换。 DTS / SSIS是您列出的最可扩展和功能丰富的选项。

您期望什么样的负载? 是否进行复杂的转换? 如果您有使用SSIS的资源,我建议您使用它,因为它可以随着您想要达到的规模而扩展。


1
我理想情况下也会选择DTS/SSIS - 特别是如果数据库是SQL Server。这主要是因为根据我的经验,数据传输逻辑随着时间的推移可能变得复杂,而SSIS就是为此目的而构建的。 - Jagmag
我每60秒移动大约250行,10列数据,其中大部分是varchar和datetime类型。你觉得应该用SSIS吗?我会进行调查。谢谢! - Chris M
在这种情况下,由于数据量很小,我会编写一个SQL查询来完成工作,然后将其作为SQL作业每60秒运行一次。 - Dustin Laine

2

读写平面文件更加高效。但是如果你想使用索引搜索和其他 SQL 功能,最好使用 SQL。


一个平面文件?那肯定不好,对吧?锁定问题怎么办?既然整个情况都在问题的范围内(即他完全掌控),为什么要将其写入磁盘,然后再次读取呢?这样更有效率吗? - Kieren Johnstone
目前还没有索引或 SQL 功能。字面上收集 X 行 X 时间段的数据,然后转存到新服务器。如果 SQL 服务器可以使用存储过程写入平面文件 - 那么我可以收集并在新的盒子上转储吗? - Chris M
我认为你应该提供更多的信息。收集x期间的数据意味着索引使用。如果是平面文件,为什么需要SQL过程? - Trurl123
@Kieren:在我参与的一个项目中,我们每分钟需要向表中插入几千行数据。我们尝试了几种方法:将每一行数据写入数据库、将所有数据缓存起来然后使用一个大的插入语句插入所有值,或者将值写入一个平面文件,然后使用一个 SQL 命令导入 CSV。最后一种使用平面文件的方法速度非常快(在我们的情况下快了两倍以上)。还有其他问题,比如表的大小、索引数量等等,但是在所有情况下,使用平面文件进行插入都更快。我们尝试过 MySQL 和 PostgreSQL。 - kriss
1
我想我忘了一些数据库管理系统可以直接从CSV文件中读取等等,非常好的观点! 我撤回我评论中的震惊! - Kieren Johnstone

2
据我所知,使用SQL Server有三种不同的“标准”方法来实现此目的:
  • 复制。通常用于保持跨数据库的表同步,有发布者和订阅者。
  • SSIS(以前是DTS)。可以通过预定作业自动化。
  • 服务代理。新生事物。
这些方法中的任何一种都比写入平面文件并读取它要更好,但唯一确定(在您的环境中)哪种方法最好的方法是测试和计时不同的方法。

1

考虑过了,但还没有进行适当的调查。感谢您的提示,我今天会研究这些技术。 - Chris M

0

如果你喜欢编写C#而不喜欢SSIS,可以考虑Rhino ETL作为替代方案。我发现它的性能非常快。

似乎将数据写入平面文件是不必要的,因为你并不需要这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接