我不知道我缺少的是什么,但是我有一个存储过程,它将数据库中的最新内容(通过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发布于 2017-11-09 21:52:25
好吧,你承认了你对这件事的认识,所以在这一切之后,你可能会想在如何优化SQL查询的性能上做一些谷歌搜索。
但是,这里有一个可以帮助您解决这个特殊问题的简单介绍。
首先是:“显示实际执行计划”。most中最有用的工具之一是“显示实际执行计划”--这可以在查询菜单中找到。选中此选项卡后,运行查询将在运行查询后在结果和消息旁边创建第三个选项卡。它将显示SQL引擎必须执行的每个操作,以及每个操作所占的百分比。通常,这足以找出可能出了什么问题(如果您的12个步骤中有一个执行了95%的时间,它可能表明它是如何缓慢地使用DB的)。
其中最重要的事情之一是查看它是如何从SQL读取数据的--它们是它构建的小树中最正确的节点。有几种可能性:
表扫描。--这通常是不好的--意味着它必须读取整个表才能得到它想要的东西。
聚集索引扫描。这通常也是不好的。聚集索引是表,如果它正在扫描它,就意味着它正在查看所有的记录。
非聚集索引扫描.不是最优的,但不一定是一个问题.它能够使用索引来帮助解决问题,但还不足以执行二进制搜索来查找所要查找的内容(必须扫描整个索引)。
索引寻找(集群或非聚集)。,这是你要追求的。它正在执行二进制查找,以快速获取它所寻找的特定数据。
所以!你是怎么得到索引的?确保您的表在适当的字段上有索引。
通过快速浏览查询,下面是SQL必须查找的列:
因此,在不好的情况下,我会检查这两个表,并确保这些列都有索引。
发布于 2017-11-09 22:00:33
我对你的数据一无所知,但我猜这一点影响了你的表现
AND content_languages_list LIKE '%' + @id_language + '%'用这样的通配符搜索总是很慢。有关更多信息,请参见https://www.brentozar.com/archive/2010/06/sargable-why-string-is-slow/
https://stackoverflow.com/questions/47211840
复制相似问题