请查找以下用于在数据库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列中搜索数据的解决方案。除了从列中检索数据外。
当在前端点击搜索按钮而不输入任何关键字时,点击操作必须从数据库中检索所有项目。
提前致谢
答案 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会减慢节点搜索速度。
第五,避免单字母别名,这是另一个可维护性问题。