最近做了个项目,完工之后发现项目某个页面的查询速度相当慢,最快查询20秒出结果,最慢查询40秒出结果,这对于客户的体验感来说,应该是相当差的,在不优化数据库部署的情况下,只能去优化查询的方式
在不使用遍历查询,而使用视图查询的情况下,很显然,视图的查询是更快的,但是这个项目其实已经用上了视图查询,那就只能去优化视图了,首先,可以知道的是,在视图的查询中,需要查出来的字段越少,速度可能就会越快,当然,如果你只是用于统计计数,那毫无疑问,可以选择count(1)去进行查询,它的速度应该是很难在继续往后优化了(在我目前的认知里,只针对现在的我),但是这个项目它需要的不是统计计数,而是需要数据的,那么就只能去选择减少字段,但是这个视图应用的范围特别的广,手机端,pc端都有使用,如果单对这个页面进行优化,减少字段,很显然不可行,那么就只能再建一个视图,专门针对这个页面的视图,从而去取只有这个页面需要的字段,这种方法可行,但是由于这个项目是别人先做的,我本次做是加新功能,很多字段都要去查,能不能删,需不需要,很显然,也是一件费时费力的事情。
之前视图的源代码是这样的
筛查条件是这样的
很显然,VisitDate,UserID都是a表中的数据,在这种情况下,整个查询速度大概需要20-40秒
后来我将视图改成了这样
将a表中的VisitDate,UserID改到了r表中,那么筛选条件中的这两个字段也就是对应到r表中的数据,这里需要注意的是我这两张表中,这两个字段的数据是一致的,a表和r表数据条数是一致的,r表是a表的关联数据表,所以可以这样做,当这样做之后,查询速度从20-40秒,变成了1-2秒
因为这种现象我也是第一次遇到,遇到就是学到嘛,猜测大概率是因为left join的原因,因为在这个视图中主要是根据ReportRecord表的数据来的,在对r表的数据进行筛选之后,被筛查出去的数据的这部分,后面的表就都可以不用查,主要应该是这个原因提升了这个查询速度,当然还猜测因为a表用了个INNER JOIN导致查询速度不快,不然应该速度差距也不会这么离谱。
根据这个表象,可以得出,以后在传出字段的时候,尽量往left左边的表的字段传出,在多表数据一样的情况下,这样筛查也会去筛查左边表里面的数据,会加快查询速度,程序这东西,真的还是要多学,才能扩展开来自己的视野,很显然这部分就在我的盲区,得加油。
SQL
Server
数据库
查询
速度
慢的原因有很多,常见的有以下几种:
1、没有索引或者没有用到索引(这是
查询
慢最常见的问题,是程序设计的缺陷)
2、I/O吞吐量小,形成了瓶颈效应。
3、没有创建计算列导致
查询
不
优化
。
4、内存不足
5、网络
速度
慢
6、
查询
出的数据量过大(可以采用多次
查询
,其他的方法降低数据量)
7、锁或者死锁(这也是
查询
慢最常见的问题,是程序设计的缺陷)
8、s...
今天早上上班发现应该在周末执行完的脚本执行到了现在,靠着自建的etl日志表发现某个大表的
查询
修改
速度
特别慢 。
后来重新启动了
数据库
(在控制面板的服务里面重新启动
sqlserver
),就好了。
猜测原因:可能是因为系统的临时
数据库
tempdb满了,或者是被阻塞之类的,在活动件事器里面看到我的那个进程一直在报RESOURCE_SEMAPHORE 等待状态 ,阻塞他的进程是tempdb
数据库
的,然后就猜测是不是这个原因。
sqlserver
每次启动都会重新建立tempdb表。
--20190305更新
视图
查询
慢可以有多种原因,以下是一些常见的可能性:
1.
查询
复杂度高:如果
视图
的定义包含了复杂的联接操作、子
查询
或者聚合函数等,可能会导致
查询
执行变慢。可以考虑
优化
视图
定义,使用更简单的
查询
方式或者创建索引来提高
查询
性能。
2. 数据量过大:如果
视图
查询
的数据量很大,可能导致
查询
速度
变慢。可以考虑对相关表进行分区或者分页
查询
来
优化
性能。
3.
视图
依赖的表缺乏索引:如果
视图
依赖的表没有适当的索引,可能会导致
查询
变慢。可以通过分析
查询
执行计划,确定需要创建的索引,并进行相应的
优化
。
4.
数据库
配置不合理:
数据库
的配置参数可能对
查询
性能有影响。可以检查
数据库
的配置参数,如缓冲区大小、连接数等,来
优化
查询
性能。
5. 硬件资源不足:如果
数据库
所在的服务器硬件资源不足,如CPU、内存或者磁盘IO能力,可能导致
查询
变慢。可以考虑升级硬件或者
优化
服务器资源分配。
综上所述,针对
视图
查询
慢的问题,需要综合考虑
查询
复杂度、数据量、索引、
数据库
配置和硬件资源等方面进行
优化
。