XQuery - 在表中的XML列中搜索

时间:2011-12-20 15:40:53

标签: sql xml sql-server-2008 xquery

请查找以下用于在数据库xml列中搜索关键字的查询

显示的查询用于从SQL Server中的xml列搜索Name,word或brief。正在使用的CMS是Umbraco。

该查询最初是在数据有限时设计的。

现在数据库有数百万条记录,查询超时无法获取数据。 该查询还优先考虑检索搜索结果的顺序 如果返回名称字段数据搜索结果,则返回CASE 1 取决于返回的搜索数据

     SELECT Name,word,brief,              */Selecting Values */
     CASE
       WHEN Name  like '%' THEN 1       */Prioritizing Order in which data to be seen */
     WHEN word  like '%' THEN 2
     WHEN brief like '%' THEN 3
     END AS Search
  from
      (select                                 
            A.xml.value('(//@node)[1]','nvarchar(20)') as Name,   /* XQuery */    
          A.xml.value('(//word)[1]','nvarchar(225)') as word,
          A.xml.value('(//brief)[1]','nvarchar(max)')as brief
  from 
         (Select Convert(xml, xml) AS XML 
          from [dbo].[cmsContentXml]) AS B
          Cross Apply xml.nodes('//items/item') AS A(xml)) D  
        where  ((Name like '%')                                   /*Condition */
               OR(word like '%')   
               OR(brief like '%'))
          group by word,Name,brief
      order by 3 ASC

请帮助优化或重写此查询以在xml列中搜索数据的解决方案。除了从列中检索数据外。

当在前端点击搜索按钮而不输入任何关键字时,点击操作必须从数据库中检索所有项目。

提前致谢

1 个答案:

答案 0 :(得分:0)

首先,不允许不带关键字的搜索,而是将用户引导到浏览机制。如果没有什么可以搜索的话,那么搜索查询的开销是没有意义的。

其次,选择转换(xml,xml)是不必要的开销,如果存储xml,则数据库列应为xml。使用xml类型的列也允许您在其上放置xml索引,这将有助于加快速度。有关XML索引的更多信息,请参阅http://msdn.microsoft.com/en-us/library/ms191497.aspx。此外,如果没有转换,您不再需要将其保留为子查询。

第三,不要使用ORDER BY 3语法,使用列名。 ORDER BY 3不是ANSI标准,也可能导致可维护性问题。

第四,你的xml样本数据似乎是无效的xml(简短的未闭合数据标记,id没有关闭元素,没有块的开放元素)。请检查您的数据,如果它实际上像真实数据库中那样被破坏,则需要修复它,因为错误的xml会减慢节点搜索速度。

第五,避免单字母别名,这是另一个可维护性问题。