gpt4 book ai didi

sql-server - LINQ to SQL - Xml 字段问题 - 你能拦截生成的 SQL 有多低?

转载 作者:行者123 更新时间:2023-12-01 05:42:00 26 4
gpt4 key购买 nike

我们的开发在 Linq to Sql 和 Sql 2005+ Xml 字段方面遇到了主要障碍。我们有一个包含字段的 Xml blob 字段...

<Profile name-first="Terry" name-last="Aney" [...more]/>

为了利用 LINQ to SQL,我们在 SQL 中创建了一个 UDF 并将其添加到我们的 DataContext 并调用它(大致基于 LINQ to SQL (Part 6 - Retrieving Data Using Stored Procedures) )。但是,当我们使用这些函数时,SQL 的 XML 索引变得毫无用处。针对 14,000 行的筛选和排序查询,它会以默认的 30 秒 CommandTimeout 超时。但是,如果我们获取命令文本(由 SQL Profiler 嗅探)并用直接 XQuery 换出 UDF,则查询所需的时间不到一秒钟(显然是我们想要的)。我已经看到了关于 Xml 字段的类似问题(即 this question ),但常见的答案是使用 UDF - 但我们已经证明如果广泛使用它们是低效的。

我们希望有一些低级点,我们可以在那里获取命令文本并使用正确的 XQuery 语法(通过 RegEx)换出 UDF。不理想,但这是我们认为可行的唯一解决方案。我们对任何事情都持开放态度——命令文本翻译、CLR 与 SQL 的集成等。

在某些情况下,我们已经可以做到这一点。例如,如果我们总是有一个 IQueryable,其中 T 不是匿名和/或复杂/嵌套类型,我们可以调用 GetCommandText,然后调用 DataContext.Translate()。但是,对于匿名/复杂类型和/或标量查询,我们没有看到可以 Hook 的地方。

任何建议都非常感谢。

最佳答案

所以这里有一些想法,将针对返回的每一行调用 this 中的函数,从而降低性能,但显然 Linq to SQL 并不是 XML 字段的忠实粉丝,您可能已经注意到了。
所以一个可能的解决方案是尝试真正优化函数,最好的方法是使用 SQLCLR,所以看看这个链接,看看他是如何做到的。

http://conficient.wordpress.com/2011/01/20/querying-xml-fields-in-linq-to-sql/

关于sql-server - LINQ to SQL - Xml 字段问题 - 你能拦截生成的 SQL 有多低?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4972312/

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