慢的原因在:【DELETE_FLAG IN ('R', 'X', 'U', 'D')】,查询中出现【in】的话数据库会解析成下面这个样子去执行。
【DELETE_FLAG='R' OR DELETE_FLAG='X' OR DELETE_FLAG='U' OR DELETE_FLAG='D'】
而数据库一旦使用了【OR】条件做查询的话,索引就不会用到了,因此就会造成查询过慢。
建议:
SELECT 。。。。。
WHERE DELETE_FLAG='R'
UNION
SELECT 。。。。。
WHERE DELETE_FLAG='X'
UNION
SELECT 。。。。。
WHERE DELETE_FLAG='U'
UNION
SELECT 。。。。。
WHERE DELETE_FLAG='D'
另外补充一点,视图本身就会造成效率低,因为视图存的是sql定义,当执行查询的时候 数据库会先上磁盘上查询视图定义 再利用视图定义查询数据,这样就产生了至少两次磁盘i/o,oracle中有物化视图的概念,SqlServer中应该也有,如果我的改善计划还不能达到你的要求的话,建议考虑一下。
---
以上,希望对你有所帮助。
说真像SQLServer这样的数据库系统优化最多就两个方面:
一,为数据服务器硬件提高配置,数据库最需要的内存,所以内存大性能就越好,查询起来也越快。
二,表或视图在设计时的优化考虑,表应该将常会查询的字段尽可能的放在同一个表上,交减少查询时表的连接,为常会查询的字段设置好排序优化之类的,视图的创建也是一个样的道理。
三,查询时应当尽量使用存储过程序,这样也可以提高查询速度,因为数据库会为存储过程自动进行优化,在尽可能多的系统内存中分配好内存用量。
原因:
1.在视图的查询语句中,大量使用right、ltrim、rtrim等字符串操作函数,这时最主要原因。
2.大量使用Case……When……End语句进行取值判断,这是次要原因。
3.查询表为基础数据表,字段数量和记录行数都比较大。这是第三个原因。
解决办法:
1.改用自定义表函数、或者自定义过程返回结果表,不使用视图。
2.在自定义函数/自定义过程中使用临时表抽取基础数据,然后再在临时表上进行判断操作,对要进行处理的字段进行UPDATE。比如那些Case的处理、字符串的处理。
3.如果在基础表FIDS..APT_INFORMATION.T_FLIGHTLEG上 尚未建立主键和索引,可考虑建立适当的主键和索引。
用了太多的,case when then
想要提高速度,觉得还是需要从根本入手,你的数据库结构会不会设计的有问题呢
还有一个方法是用多个视图来解决你现在的问题,加上视图索引
速度肯定比现在快
复制粘贴
复制粘贴
复制粘贴
复制粘贴