我有一个包含一些关系列和一个 XML 列的表,其中有时包含相当大的数据块。我还有一个使用数据库的简单网络服务。我需要能够报告诸如 XML 列中某个元素的所有实例、某个元素的所有不同值的列表之类的事情。
我能够得到一个元素的所有不同值的列表,但没有比这更进一步。我最终编写了极其复杂的 T-SQL 代码来执行在 C# 中看起来非常简单的事情:遍历此表中的所有行,并将其 ( XPath | XQuery | XSLT ) 应用于 XML 列。我可以过滤关系列以减少数据量,但这对于某些查询来说仍然是很多数据。
我的计划是在 SQL Server 中嵌入一个程序集(我使用的是 2008 SP2)并让它为给定的查询动态创建一个索引视图(我有其他逻辑来清理这个视图)。这将使我能够降低网络流量,并且可能还允许我使用 Excel 和 MSRS 报告等工具作为廉价的用户界面,但我看到很多人说“只使用应用程序逻辑而不是 SQL 程序集” . (我想我可能在这里完全叫错了树)。
将大量数据抓取到 Web 服务并在那里进行处理也会有好处——我不受 SQL Server 环境的限制(因为我不住在其中),而且我的设置过程更容易。但这确实意味着我要通过网络传输大量数据,在处理数据时将其存储在内存中,然后将其中的一部分丢弃。
这里的任何建议将不胜感激。
谢谢
编辑:
谢谢大家,你们都帮了大忙。问题是我们在表中为一个文件生成一行,每个文件可能有多个结果,我们每次运行特定的构建作业时都会这样做。我想把它展平成一个表格视图。
此构建作业的每次执行都会检查数千个文件的多个属性,并且在某些情况下,这些测试中的每一个都会产生数千个结果(MSIVAL 测试是最严重的罪魁祸首)。
答案(呃!)是在它进入数据库之前把它弄平!根据您的反馈,我决定尝试为每个文件的每个测试的每个结果创建一行,而 XML 仅包含该结果的详细信息 - 这使得查询更加简单。当然,我们现在每次运行此工具时都有数十万行,但性能要好得多。我现在有一个视图,它创建了构建作业发出的一类结果的扁平化版本 - 这将返回 >200,000 并且需要 <5 秒,而我去之前的等效(复杂)查询大约需要 3 分钟更平坦的路线,旧(非数据库)版本的 XML 文件处理需要 10 到 30 分钟。
我现在对连接的次数有一些问题,但我知道如何解决这个问题。
再次感谢!全方位+1