我写了一个查询,我的数据库管理员告诉我需要优化,但我的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来说非常重要。
答案 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是否可以提出改进建议,将查询复制到管理工作室,运行以确保其正常工作,然后右键单击编辑器并选择“分析”在数据库引擎调优顾问中查询“。完成这个过程,它至少会发现任何明显缺失的索引。