0

我有一个 SQL Server 2008 数据库,其中包含我需要用来生成代码的数据(实际上它是一个 SQL 脚本,我需要生成以填充另一个具有不同结构的数据库,但请不要被它误导 - 这个是一个关于基本上基于数据生成一大块文本的问题)。

我担心性能。因此,一般来说,是否会更高效

a)在 SQL Server 上的存储过程中生成代码:

优点:数据不必通过网络移动,因此延迟问题更少(尽管必须发送完整的文本块,这可能更大)

缺点:操作数据很麻烦(游标),并且在 T-SQL(我想)中操作字符串比在 Web 服务器(.NET)上慢

b)检索我需要的数据并在 Web 服务器上生成代码:

优点:更快、更灵活的字符串处理

缺点:从 SQL 框中取回所有数据

为了这个问题,让我们考虑使用大约 100,000 行的数据


更新: 我没有提到我的目标是从表单提交生成脚本并将结果直接发送回浏览器。因此,在这种情况下,使用 SSIS 之类的解决方案可能会受到限制

4

3 回答 3

1

研究使用 SSIS(SQL Server 集成服务)。SSIS 允许转换,并且应该能够处理大型集合的批处理等。

当然,如果您需要立即响应操作,那么 SSIS 不会有太大帮助。如果转换不是非常复杂并且可以在单个查询中完成,您可以选择使用 CLR,正如这里已经建议的那样。我编写了一个名为 SQL# (SQLsharp) 的 SQL CLR 函数和过程库,可以在以下网址找到:http ://www.SQLsharp.com/并且大部分是免费的。您可以使用 DB_BulkCopy 存储过程来执行此操作(同样,取决于转换的复杂性)。DB_BulkCopy 过程在免费版本中可用,它基于 .Net SqlBulkCopy 类(如果您想编写自己的 SQL CLR 方法)。但这确实允许您定义一个查询,该查询将用于将结果集发送到目标连接(SQL Server 或 Oracle)。此过程处理批处理操作,因此如果您不希望传输 100,000 行,则不会是单个事务。

于 2012-05-02T14:27:18.167 回答
1

从纯粹的经验水平来看,SQL Server 执行字符串操作比代码慢得多。

我重构了几个程序,这些程序从一个源获取数据,对其进行操作,然后将其放入另一个源,第一个,最佳性能提升是通过使用 DataSets 和 System.Text.StringBuilders 将所有字符串操作转移到代码中来实现的。

我终于找到了一些文档来支持这一点:http: //msdn.microsoft.com/en-us/library/ms131075.aspx

此外,与 Transact-SQL 相比,托管代码在过程代码、计算和字符串操作方面具有决定性的性能优势。计算密集型且不执行数据访问的 CLR 函数最好用托管代码编写。

也就是说,尝试两者并对它们进行基准测试然后权衡您的选择可能没有什么坏处。除了性能之外,还要考虑可读性、未来维护的便利性等因素。如果在基准测试时性能差异不是那么好,其他因素可能会变得更重要。

阅读您对其他答案的其他注释,可能是安全性而不是性能应该是决定因素。 一般来说,在代码中操作字符串并清理任何可能不受信任的用户输入以防止 SQL 注入、XSS 等要容易得多。在纯 T-SQL 中转义字符串是可能的,但在代码中,您可以根据输入创建参数化查询,这(根据 OWASP)比转义字符串更好。这在 T-SQL 中几乎是不可能的。

来自 OWASP:

第三种技术是在将用户输入放入查询之前对其进行转义。如果您担心将动态查询重写为准备好的语句或存储过程可能会破坏您的应用程序或对性能产生不利影响,那么这可能是您的最佳方法。但是,与使用参数化查询相比,这种方法是脆弱的。仅应谨慎使用此技术以具有成本效益的方式改造遗留代码。从头开始构建的应用程序或需要低风险容忍度的应用程序应该使用参数化查询来构建或重写。

于 2012-05-02T14:28:15.763 回答
1

我更喜欢字母 A,但我建议您忘记在 SQL Server 中使用游标和操作数据。从现有数据库中获取您的数据并使用 C# 代码将其转换为 XML,然后如果您想转换您的数据结构,您可以使用 XSLT 转换 XML,XSLT 以强大的数据转换而广为人知。

希望这个链接可以帮助你。

于 2012-05-02T14:31:41.170 回答