2011-12-20 29 views
0

请找到正在使用中所显示的查询被用来从XML搜索名称,单词或简短数据库中的XML列的XQuery - 表XML列中搜索

搜索关键字以下查询SQL Server中的列。使用的CMS是Umbraco。

该查询最初是在数据有限的情况下设计的。

现在数据库有数百万条记录,并且查询超时无法获取数据。 查询也优先在搜索结果中取出作为 中如果返回Name字段数据搜索结果返回的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列中搜索数据的解决方案。除了从列中检索数据。

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

在此先感谢

+0

向我们展示您的XML可能看起来像什么! – 2011-12-20 15:59:20

+0

我无法从我所在的地方访问数据库。我引用的xml列是因为它是由Umbraco CMS创建的默认值“cmscontentxml”是表名。 – Gallop 2011-12-20 16:08:45

+0

没有XML文档,没有什么可以优化的。请提供XML文档(一个典型的例子),使这个问题有意义。 – 2011-12-20 17:09:37

回答

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会减慢节点搜索速度。

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