sql server视图优化

y651157092 2013-11-12 03:10:41
CREATE VIEW MMS_TOTAL_CHARGES AS
SELECT
A.EA_ANO AS EA_BRID,
SUM(A.EA_JE) AS TOTAL_CHARGES
FROM (SELECT EA_ANO,EA_JE FROM EA_AMXFY WITH(NOLOCK) WHERE EA_JZSH IS NULL
UNION ALL
SELECT EA_ANO,EA_JE FROM EA_ZYYPMXK WITH(NOLOCK) WHERE EA_JZSH IS NULL
UNION ALL
SELECT EA_ANO,EA_JE FROM EA_ZYYJMXK WITH(NOLOCK) WHERE EA_JZSH IS NULL) A
GROUP BY A.EA_ANO

EA_AMXFY,EA_ZYYPMXK,EA_ZYYJMXK ,这三张表是消费金额表,每个人在这三种表中可能有多条消费记录,
EA_ANO是这个人的标示,EA_JZSH表示这个人的状态。现在求EA_JZSH状态为空时,这人的总消费是多少。
求优化一下这个查询速度怎么来弄,在线等。
...全文
286 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2013-11-13
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390641297?page=1#post-396071193 问题是视图里面又有视图的话不能在最外层视图上建索引,顶多能在最底层的视图上建
y651157092 2013-11-13
  • 打赏
  • 举报
回复
引用 9 楼 DBA_Huangzj 的回复:
试试改成索引视图
大神,那这张视图怎么改成索引视图啊?求教啊,速度慢的原因就是知道是出在这了,就是不知道怎么来改了。经理总说速度慢,求教啊!!!!
  • 打赏
  • 举报
回复
看了你的查询计划,应该都是聚集索引扫描,效率肯定是比较低的。 如果你的数据量大了,光查询这个视图,估计就很耗时。 关键是,这个视图,只是一个大的视图中关联的一个二期,还有一堆表的关联。 既然你能修改这个视图,那么和客户说说,能不能给你建索引的权限,或者建索引的代码给他们,让他们帮你建索引,可以在EA_AMXFY,EA_ZYYPMXK,EA_ZYYJMXK 三个表 ,按照EA_JZSH、EA_ANO、EA_JE的顺序,来建索引。 否则,你这个也不能改,那个也不能改的,就很难优化了,不是说你不优化,而是你没办法优化,这个得和客户说明
發糞塗牆 2013-11-12
  • 打赏
  • 举报
回复
试试改成索引视图
發糞塗牆 2013-11-12
  • 打赏
  • 举报
回复
问题是你的业务需求貌似已经没什么提升,而索引方面你又不能改
y651157092 2013-11-12
  • 打赏
  • 举报
回复
CREATE VIEW [dbo].[MMS_PATS_IN_HOSPITAL] AS SELECT CAST(A.EA_ZYH AS VARCHAR) AS PATIENT_ID, --病人标识号 A.EA_RYCS AS VISIT_ID, --病人住院标识 A.EA_BMH AS WARD_CODE, --病区 A.EA_BMH AS DEPT_CODE, --科室 E.BED_NO AS BED_NO, --床号 A.EA_RYRQ AS ADMISSION_DATE_TIME, --入院日期及时间 A.EA_RKRQ AS ADM_WARD_DATE_TIME, --入科日期及时间 NULL AS OPERATING_DATE, -- 手术日期 ISNULL(C.EA_MJZZD,A.EA_RYZD) AS DIAGNOSIS, --主要诊断 A.EA_RYBQ AS PATIENT_CONDITION, --病情级别 CASE A.EA_HLJB WHEN 9 THEN '0' ELSE A.EA_HLJB END AS NURSING_CLASS, --护理等级 B.EA_YSM AS DOCTOR_IN_CHARGE, --经治医生姓名(需查字典表) A.EA_YJJ AS PREPAYMENTS, --预交金 D.TOTAL_CHARGES, --累计未结费用 A.EA_ID AS EA_BRID --病人ID FROM EA_ASY A WITH(NOLOCK) LEFT OUTER JOIN EA_ZD_YSK B WITH(NOLOCK) ON A.EA_YSH = B.EA_YSH LEFT OUTER JOIN EA_BASYK_ZY C WITH(NOLOCK) ON A.EA_ID = C.EA_BRID LEFT JOIN MMS_TOTAL_CHARGES D ON D.EA_BRID=A.EA_ID LEFT JOIN BED_REC E ON E.BED_LABEL = A.EA_CWH AND E.WARD_CODE = A.EA_BMH WHERE A.EA_CYRQ IS NULL AND A.EA_CWH !='' 在这个视图里链接了那个视图,然后查询这个视图,就慢,在两秒以后,去掉链接,查这个视图才0.0几秒
y651157092 2013-11-12
  • 打赏
  • 举报
回复


这是执行计划,我不会看执行计划。看表面,是查询三个表的时候花费时间挺多,但是具体怎么消耗的时间,就看不懂了
發糞塗牆 2013-11-12
  • 打赏
  • 举报
回复
那好像没得改了,
y651157092 2013-11-12
  • 打赏
  • 举报
回复
做接口,表是人家的,不让随便改,所以只能在语句上下工夫
小魚人 2013-11-12
  • 打赏
  • 举报
回复
添加個篩選索引
發糞塗牆 2013-11-12
  • 打赏
  • 举报
回复
最好给出执行计划
發糞塗牆 2013-11-12
  • 打赏
  • 举报
回复
EA_ANO,EA_JE ,EA_JZSH加索引

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧