查询视图时 ,带where 条件速度过慢

博客讲述视图查询情况,无where语句时查询快,添加后耗时从1秒变为30多秒。原因是视图设计中用isnull函数处理基表主键orgid,使其无法作为索引,导致查询变慢。指出基表主键也是索引,可通过适当创建索引提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到这样一个情况,通过视图查询一些字段不带where语句时很快。SQL如下

	select * ,ROW_NUMBER () OVER (ORDER BY tabs.recognisedmaori DESC) AS pos
	from( 
	SELECT
		vp.projectid id,
		vp.projectno projectno,
		vp.projectname objname,
		vp.orgname implementationdepartment,
		vp.orgid orgid,
		vp.ocontractmoney ,
		ISNULL(vp.saleIncome,0) saleIncomeBudget,
		ISNULL(vp.grossValue,0) grossValueBudget,
		vp.contractArchivingdate ,
		vp.confirmIncomeDate ,
		vp.saleman salesman,
		vp.prjmname projectmanager,
		vp.prjdirector projectdirector,
		vp.confirmIncomPer ,
		cast(ISNULL(vp.saleIncome,0) as NUMERIC(20,2))* vp.confirmIncomPer recognisedincome,
		cast(ISNULL(vp.grossValue,0) as NUMERIC(20,2)) * vp.confirmIncomPer recognisedmaori,
		vp.planFirstAccDate ,
		LEFT ( vp.planFirstAccDate, 7 ) planmoth,
		se.objname  problemType,
		act.LATESTPROGRESS latestProgress
		
	FROM
		VIEW_PROJECTMONITOR vp
		LEFT JOIN acceptanceAndReceiveT act ON act.projectid = vp.projectid
		left join selectitemlabel se on se.id = act.problemType
		
	) tabs 

大概耗时一秒左右, VIEW_PROJECTMONITOR 是视图 其他的都是表。

当添加上 where 语句时,耗时变为30多秒。SQL如下

	select * ,ROW_NUMBER () OVER (ORDER BY tabs.recognisedmaori DESC) AS pos
	from( 
	SELECT
		vp.projectid id,
		vp.projectno projectno,
		vp.projectname objname,
		vp.orgname implementationdepartment,
		vp.orgid orgid,
		vp.ocontractmoney ,
		ISNULL(vp.saleIncome,0) saleIncomeBudget,
		ISNULL(vp.grossValue,0) grossValueBudget,
		vp.contractArchivingdate ,
		vp.confirmIncomeDate ,
		vp.saleman salesman,
		vp.prjmname projectmanager,
		vp.prjdirector projectdirector,
		vp.confirmIncomPer ,
		cast(ISNULL(vp.saleIncome,0) as NUMERIC(20,2))* vp.confirmIncomPer recognisedincome,
		cast(ISNULL(vp.grossValue,0) as NUMERIC(20,2)) * vp.confirmIncomPer recognisedmaori,
		vp.planFirstAccDate ,
		LEFT ( vp.planFirstAccDate, 7 ) planmoth,
		se.objname  problemType,
		act.LATESTPROGRESS latestProgress
		
	FROM
		VIEW_PROJECTMONITOR vp
		LEFT JOIN acceptanceAndReceiveT act ON act.projectid = vp.projectid
		left join selectitemlabel se on se.id = act.problemType
		
	) tabs where tabs.orgid = '2c948148689e23db0168a234e6971853'

发现很奇怪,其中orgid 是一张基表的主键怎么会这么慢。后来在查了查我的 VIEW_PROJECTMONITOR 视图在设计的时候有问题,    其中有这么一句   isnull(org.id,'') orgid   这里用了 isnull  函数处理了orgid 使其不能在被当做索引来对待,因此查询的时候回边的很慢。

在视图中基表的主键也是索引。

如果想提高查询效率可以适当创建索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值