需要帮助优化ColdFusion查询从多个表中提取数据

时间:2011-06-06 12:50:31

标签: sql-server-2005 coldfusion

我写了一个查询,我的数据库管理员告诉我需要优化,但我的SQL知识有限。该查询为每个版本提取新闻稿和1张相关照片和标题。它加入了id。

上的站点(位置)表
<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来说非常重要。

2 个答案:

答案 0 :(得分:4)

首先,考虑缓存。 ColdFusion可以轻松缓存查询(例如<cfquery cachedWithin="#createTimeSpan(d, h, m, s)#">...</cfquery>,但如果您需要确保基础新闻稿表更新时的及时性,请使用cachePut()cacheGet(),其中值将在新闻中输入发布表已更新。

接下来,WHERE子句LIKE语句可能是减速的罪魁祸首:要考虑的两种方法是SQL Server全文索引或使用ColdFusion's search capabilities。此外,在查询中使用SQL Server的数据库调优顾问程序,以查看是否有其他索引可以提高性能。

答案 1 :(得分:1)

我认为对于LIKE语句是罪魁祸首而不是子选择,orangepips可能是正确的。

您可以通过快速而又脏的方式查看sql server是否可以提出改进建议,将查询复制到管理工作室,运行以确保其正常工作,然后右键单击编辑器并选择“分析”在数据库引擎调优顾问中查询“。完成这个过程,它至少会发现任何明显缺失的索引。