MSSQL存储过程缓慢



我不确定我缺少了什么,但我有一个存储过程可以(通过php)带回数据库中的最新内容,但它确实很慢。

我有一个视图,它引入了一种特定类型的数据(大约8000条记录)。

我的存储过程看起来像这样,大约需要9-11秒才能完成,有什么建议吗?善良一点,我是新手:)

WITH maxdate As (
SELECT id_cr, MAX(date_activation) "LastReading"
FROM [pwf].[dbo].[content_code_service_new_content]
GROUP BY id_cr
)
SELECT DISTINCT TOP 7 s.id_cr, s.date_activation, s.title, s.id_element
FROM [pwf].[dbo].[content_code_service] s
INNER JOIN maxdate t on s.id_cr = t.id_cr and s.date_activation = t.LastReading
WHERE (
id_service = @id_service
AND  content_languages_list LIKE '%' + @id_language + '%'
) ORDER by date_activation DESC

好吧,你承认你对此有点陌生,所以在完成所有这些之后,你可能想在谷歌上搜索一下如何优化SQL查询的性能。

但是,这里有一个快速的概述,应该可以帮助你解决这个特殊的问题。

首先:"显示实际执行计划"。MS SQL中最有用的工具之一是"显示实际执行计划",它可以在"查询"菜单中找到。选中此选项后,运行查询将在运行查询后在"结果"one_answers"消息"旁边创建第三个选项卡。它将显示SQL引擎必须执行的每个操作,以及每个操作所占的百分比通常,这将足以找出可能的错误(如果你的12个步骤中有1个步骤花费了95%的时间,这可能表明它使用数据库的速度很慢。)

其中最重要的一点是观察它实际上是如何从SQL中读取数据的——它们是它构建的小树中最合适的节点。有几种可能性:

表格扫描这通常很糟糕-这意味着它必须读取整个表才能获得它想要的

群集索引扫描这通常也很糟糕。集群索引表,如果正在扫描,则意味着它正在查看所有记录。

非聚集索引扫描不是最优的,但不一定是问题。它可以使用索引来帮助解决问题,但还不足以执行二进制搜索(它必须扫描整个索引)

索引查找(群集或非群集)这就是你想要的。它正在执行二进制查找,以便快速找到要查找的特定数据。

所以!如何获取索引搜索?请确保您的表在适当的字段上有索引。

通过快速浏览查询,以下是SQL必须查找的列:

  • content_code_service_new_content.id_cr
  • content_code_service_new_content.date_activation
  • content_code_service.id_cr
  • content_code_service.date_activation
  • content_code_service.id_service
  • content_code_service.content_languages_list

所以,我会立即检查这两个表,并确保这些列有索引。

我对您的数据一无所知,但我想这一点会损害您的性能

AND  content_languages_list LIKE '%' + @id_language + '%'

使用这样的通配符搜索总是很慢。有关更多信息,请参阅https://www.brentozar.com/archive/2010/06/sargable-why-string-is-slow/

最新更新