SQL Server 视图查询慢,如何优化?请不要复制粘贴谢谢

来源:百度知道 编辑:UC知道 时间:2024/06/14 18:31:53
这是视图的创建代码:
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]

慢的原因在:【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中应该也有,如果我的改善计划还不能达到你的要求的话,建议考虑一下。

---
以上,希望对你有所帮助。

原因:
1.在视图的查询语句中,大量使用right、ltrim、rtrim等字符串操作函数,这时最主要原因。
2.大量使用Case……When……End语句进行取值判断,这是次要原因。
3.查询表为基础数据表,字段数量和记录行数都比较大。这是第三个原因。

解决办法:
1.改用自定义表函数、或者自定义过程返回结果表,不使用视图。
2.在自定义函数/自定义过程中使用临时表抽取基础数据,然后再在临时表上进行判断操作,对要进行处理的字段进行UPDATE。比如