2011-12-20 30 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會減慢節點搜索速度。

第五,避免單個字母的別名,這是另一個可維護性問題。