2011-06-06 40 views
1

我寫了一個查詢,我的數據庫管理員告訴我需要優化,但我的SQL知識有限。該查詢將爲每個新聞稿和1個相關的照片和標題。它加入了id上的站點(位置)表。需要幫助優化ColdFusion查詢從多個表中提取數據

<cfquery name="local.query" datasource="#this.Dsn()#"> 
      SELECT 
      pr.press_release_id, 
      pr.Site_id, 
      pr.press_release_subject, 
      pr.press_release_title, 
      pr.press_release_datetime, 
      pr.press_release_number, 
      pr.press_release_published_flag, 
      pr.press_release_top_story, 
      pr.related_photo_gallery, 
      pr.related_page, 
      s.site_name, 
      (SELECT TOP 1 ph.press_release_photo_lowres_filename 
       FROM 
        tbl_photo as ph 
       WHERE 
        ph.press_release_id = pr.press_release_id) as photo_filename, 
      (SELECT TOP 1 ph.press_release_photo_caption 
       FROM 
        tbl_photo as ph 
       WHERE 
        ph.press_release_id = pr.press_release_id) as photo_caption 
      FROM 
      tbl_press_release as pr 

      INNER JOIN tbl_site s 
       ON pr.Site_id = s.site_id 
      WHERE 
       LEFT(pr.press_release_number,1) <> <cfqueryparam cfsqltype="cf_sql_varchar" value="I"> 
       <cfif val(event.GetValue("site_id")) gt 0> 
        AND s.site_id = <cfqueryparam cfsqltype="cf_sql_integer" value="#val(event.GetValue("site_id"))#"> 
       </cfif> 
      <cfif event.GetValue("pao_search") neq ""> 
      AND 
      (
       press_release_subject like <cfqueryparam cfsqltype="cf_sql_varchar" value="%#event.GetValue("pao_search")#%"> 
       OR 
       press_release_copy like <cfqueryparam cfsqltype="cf_sql_varchar" value="%#event.GetValue("pao_search")#%"> 
       OR 
       press_release_wingspan_title like <cfqueryparam cfsqltype="cf_sql_varchar" value="%#event.GetValue("pao_search")#%"> 
       OR 
       press_release_wingspan_subject like <cfqueryparam cfsqltype="cf_sql_varchar" value="%#event.GetValue("pao_search")#%"> 
      ) 
      </cfif> 
      AND pr.press_release_published_flag = <cfqueryparam cfsqltype="cf_sql_integer" value="1"> 
      AND (pr.press_release_top_story <> <cfqueryparam cfsqltype="cf_sql_bit" value="True"> OR pr.press_release_top_story IS NULL) 
     <cfif listLen(event.GetValue("orderBy")) neq 0> 

     ORDER BY 
      <cfloop list="#event.GetValue("orderBy")#" index="local.o">#local.o# #uCase(event.GetValue("sort"))#<cfif local.o neq listLast(event.GetValue("orderBy"))>,</cfif></cfloop> 
     </cfif> 
     </cfquery> 

從管理員告訴我,嵌入式SELECT語句正在減慢查詢速度。我現在意識到,爲每個新聞稿拉動相關的圖片和標題是不必要的,因爲我只需要用press_release_top_story等於true的方式將它們拉到新聞稿中。我認爲這可能有助於節省一些CPU。

我能做些什麼來優化這個?僅供參考這對於SQL Server來說很重要。

回答

4

首先,考慮高速緩存。 ColdFusion的用戶可以很容易地高速緩存查詢(例如<cfquery cachedWithin="#createTimeSpan(d, h, m, s)#">...</cfquery>,但如果你需要確保時效性,當底層的新聞稿表的更新,而是使用cachePut()cacheGet(),其中值被放在當新聞稿表更新英寸

接下來, WHERE子句LIKE語句可能是減速的罪魁禍首:要考慮的兩種方法是SQL Server全文索引或使用ColdFusion's search capabilities。另外,在查詢中使用SQL Server的數據庫調整顧問來查看是否有其他索引可以提高性能

+0

這絕對有助於顯着降低SQL服務器上的負載,管理員再次高興。我最終將這個查詢分解成兩個單獨的(並緩存這些),因爲這個查詢有些部分並沒有經常被觸及。謝謝! – negzero7 2011-06-06 17:30:59

1

我認爲orangepips可能是正確的,但LIKE語句是罪魁禍首,而不是子選詞

作爲一種快速和骯髒的方式來查看sql server是否可以提供改進的一件事是將查詢複製到management studio中,運行它以確保它能正常工作,然後在編輯器中單擊鼠標右鍵並選擇「分析數據庫引擎調優顧問中的查詢「。經歷這個過程,它至少會發現任何明顯缺失的索引。