【问题标题】:Optimizing queries for a database using SQL/XML. Suggested resources?使用 SQL/XML 优化数据库查询。推荐资源?
【发布时间】:2010-07-10 04:37:57
【问题描述】:

这个问题既是理论问题,也是实践问题。任何表明对优化查询有用的资源的结果将不胜感激。

有一个大型 SQL 数据库,其中存储了大量存储在 SQLXML 字段中的数据。直接查询 XML 不够快。

我看过一些关于优化 SQLXML 的 MSDN 文章(即http://msdn.microsoft.com/en-us/library/aa902661(SQL.80).aspx),我知道索引可搜索的 xml 字段会提高搜索速度。

任何人都可以推荐任何其他特别有用的资源来优化数据库,无论是在这种环境中还是在一般情况下?一如既往,感谢大家的帮助

【问题讨论】:

  • “有一个大型 SQL 数据库” - 定义大型...
  • 对于这个问题,我们假设它是 ebay 的大小或类似的东西

标签: sql-server xml database-design query-optimization sql-optimization


【解决方案1】:

这取决于您需要对 XML 做什么。我有一个类似的设置,其中表结构被设置为“通用”,并且任何特定于产品的内容都隐藏在 XML 字段中。

我们还注意到查询 XML 并不是特别快的困难方式......并且使用 XML 索引(SQL Server 也提供)导致我们的数据库大小从大约 1 GB 跃升至超过 10 GB...... ..

我们现在从 XML 中选择元素是这样的:

  • 创建一个用户自定义函数,获取 XML 内容作为其参数
  • 从该 XML 参数中提取值
  • 使用该 UDF 在父表中定义计算的持久列

这样,我们可以从 XML 中提取某些键值(例如“ProductID”或“ProductName”),并将它们作为列存储在父表中。它是计算出来的,例如它始终是最新的,并且由于它也是持久的,因此它与表数据一起存储,例如它不会不断地重新查询和重新计算。而且由于它与表数据一起持久化,您甚至可以在其上放置索引。

这非常有效,但它只适用于您想要从 XML 中提取的孤立的单值事物的情况。对于这种情况,这是一个很好的解决方案,它确实可以将这些值的查询速度提高几个数量级。

【讨论】:

  • 我考虑过这个解决方案,它适用于项目的当前域。考虑到未来的多样化,我希望将其保持为可搜索,但我认为只要仍然可以执行更具体的搜索,就可以通过这种方式处理常见的搜索功能。就可扩展性而言,这对您有何帮助?
  • @smartcaveman:那些最终成为 INT 或短字符串的元素工作得很好——你可以让它们在包含 XML 的表上持久化计算列,它们绝对像普通的 INT或 VARCHAR 列。可扩展性根本不是问题。
【解决方案2】:

虽然不能完全回答您的问题,但您可能需要考虑不同的搜索策略。 SQL Server/Oracle 和 MySQL 都非常适合存储大量的关系数据,但是在大多数情况下,它们在搜索文本时并不是那么好(显然这取决于您正在搜索的内容和您的索引)。

我建议您花一些时间查看Lucene 之类的搜索引擎,因为它可能比 SQL 更适合您的需求?

【讨论】:

  • so - 优化策略是不使用当前数据库?我称之为恶作剧。
【解决方案3】:

显示估计的执行计划。

还有:

SET STATISTICS IO ON
SET STATISTICS TIME ON

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多