SQL Server 视图查询慢,如何优化?请不要复制粘贴谢谢
这是视图的创建代码:USE[Transit]GO/******对象:View[dbo].[V_FIDS_FLIGHTLEG]脚本日期:09/27/200910:38:17...
这是视图的创建代码:
USE [Transit]
GO
/****** 对象: View [dbo].[V_FIDS_FLIGHTLEG] 脚本日期: 09/27/2009 10:38:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER VIEW [dbo].[V_FIDS_FLIGHTLEG]
AS
SELECT [LEG_ID]
,[PDATE]
,[FLIGHT_NO]=
case right(ltrim(rtrim(flight_no)),1)
when '&' then substring(ltrim(rtrim(flight_no)),1,(len(ltrim(rtrim(flight_no)))-1))
when '#' then substring(ltrim(rtrim(flight_no)),1,(len(ltrim(rtrim(flight_no)))-1))
else ltrim(rtrim(flight_no))
end
,[FLIGHT_NO_DISP]
,[TAIL_NO]
,[AC_TYPE]
,[CARRIER]
,[DEPT_AIRPORT]=
case dept_airport
when 'HHA' then 'CSX'
when 'ZGC' then 'LHW'
else dept_airport
end
,[DEPT_AGT]
,[DEPT_AC_LOC]
,[DEPT_GATE]
,[CHECK_IN]
,[WAIT_ROOM]
,[PLAN_DEPT_TIME]
,[EST_DEPT_TIME]
,[REAL_DEPT_TIME]
,[ARR_AIRPORT]=
case dept_airport
when 'HHA' then 'CSX'
when 'ZGC' then 'LHW'
else arr_airport
end
,[ARR_AGT]
,[ARR_AC_LOC]
,[ARR_GATE]
,[ARR_ROOM]
,[PLAN_ARR_TIME]
,[EST_ARR_TIME]
,[REAL_ARR_TIME]
,[FLT_PROP]
,[INT_OR_DOM]
,[DELETE_FLAG]
FROM FIDS..APT_INFORMATION.T_FLIGHTLEG AS T_FIDS_FLIGHTLEG
WHERE DELETE_FLAG IN ('R', 'X', 'U', 'D')
每次查询这个视图都要5秒以上,程序运行速度都卡在这了。谁能替我想想办法?请不要复制粘贴其他网站上的答案,那些我自己也会搜的。 展开
USE [Transit]
GO
/****** 对象: View [dbo].[V_FIDS_FLIGHTLEG] 脚本日期: 09/27/2009 10:38:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER VIEW [dbo].[V_FIDS_FLIGHTLEG]
AS
SELECT [LEG_ID]
,[PDATE]
,[FLIGHT_NO]=
case right(ltrim(rtrim(flight_no)),1)
when '&' then substring(ltrim(rtrim(flight_no)),1,(len(ltrim(rtrim(flight_no)))-1))
when '#' then substring(ltrim(rtrim(flight_no)),1,(len(ltrim(rtrim(flight_no)))-1))
else ltrim(rtrim(flight_no))
end
,[FLIGHT_NO_DISP]
,[TAIL_NO]
,[AC_TYPE]
,[CARRIER]
,[DEPT_AIRPORT]=
case dept_airport
when 'HHA' then 'CSX'
when 'ZGC' then 'LHW'
else dept_airport
end
,[DEPT_AGT]
,[DEPT_AC_LOC]
,[DEPT_GATE]
,[CHECK_IN]
,[WAIT_ROOM]
,[PLAN_DEPT_TIME]
,[EST_DEPT_TIME]
,[REAL_DEPT_TIME]
,[ARR_AIRPORT]=
case dept_airport
when 'HHA' then 'CSX'
when 'ZGC' then 'LHW'
else arr_airport
end
,[ARR_AGT]
,[ARR_AC_LOC]
,[ARR_GATE]
,[ARR_ROOM]
,[PLAN_ARR_TIME]
,[EST_ARR_TIME]
,[REAL_ARR_TIME]
,[FLT_PROP]
,[INT_OR_DOM]
,[DELETE_FLAG]
FROM FIDS..APT_INFORMATION.T_FLIGHTLEG AS T_FIDS_FLIGHTLEG
WHERE DELETE_FLAG IN ('R', 'X', 'U', 'D')
每次查询这个视图都要5秒以上,程序运行速度都卡在这了。谁能替我想想办法?请不要复制粘贴其他网站上的答案,那些我自己也会搜的。 展开
6个回答
展开全部
慢的原因在:【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中应该也有,如果我的改善计划还不能达到你的要求的话,建议考虑一下。
---
以上,希望对你有所帮助。
【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上 尚未建立主键和索引,可考虑建立适当的主键和索引。
1.在视图的查询语句中,大量使用right、ltrim、rtrim等字符串操作函数,这时最主要原因。
2.大量使用Case……When……End语句进行取值判断,这是次要原因。
3.查询表为基础数据表,字段数量和记录行数都比较大。这是第三个原因。
解决办法:
1.改用自定义表函数、或者自定义过程返回结果表,不使用视图。
2.在自定义函数/自定义过程中使用临时表抽取基础数据,然后再在临时表上进行判断操作,对要进行处理的字段进行UPDATE。比如那些Case的处理、字符串的处理。
3.如果在基础表FIDS..APT_INFORMATION.T_FLIGHTLEG上 尚未建立主键和索引,可考虑建立适当的主键和索引。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用了太多的,case when then
想要提高速度,觉得还是需要从根本入手,你的数据库结构会不会设计的有问题呢
还有一个方法是用多个视图来解决你现在的问题,加上视图索引
速度肯定比现在快
想要提高速度,觉得还是需要从根本入手,你的数据库结构会不会设计的有问题呢
还有一个方法是用多个视图来解决你现在的问题,加上视图索引
速度肯定比现在快
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2020-06-15
展开全部
复制粘贴
复制粘贴
复制粘贴
复制粘贴
复制粘贴
复制粘贴
复制粘贴
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询