优化啊,优化啊啊啊啊!

qq_15126639 2018-01-18 03:17:11

create VIEW [dbo].[view_T_J_DJXMJFMX]
AS

select a.id,us.id usid,us.user_no,us.name user_name,us.pinyin,us.pinyinFirst,e.XMJFJE,
us.user_cata,d.id YHLXBH,d.ZDYMC,dept.code dept_code,dept.name dept_name,A.XMID,B.XMMC,
cast(CONVERT(CHAR(10),A.FYRQ,120)as varchar(10)) AS FYRQ,
e.id as ZFFSID, e.ZFFSBH,e.ZFFSMC, CONVERT(VARCHAR, e.CZRQ, 120) JFRQ,
CASE SIGN(e.XMJFJE) WHEN - 1 THEN '退费' ELSE '缴费' END AS JFBZ,a.org_id ,org.name as org_name
from T_J_DJFYB a
inner join sys_organization org on org.id = a.org_id
inner join T_J_DJXMB b on a.xmid=b.id
INNER JOIN
(
select FYXMID,XMJFJE, ZFFSID,CZRQ,RZBZ,f.id, f.ZFFSBH,f.ZFFSMC from T_J_DJFYMXB dj
INNER JOIN T_J_DJZFFSB f ON dj.ZFFSID = f.id
union all
select FYXMID,XMHJJE as XMJFJE ,ZFFSID,CZRQ,'1',f.id, f.ZFFSBH,f.ZFFSMC as RZBZ from T_J_DJXMHJMX dm
INNER JOIN T_J_DJZFFSB f ON dm.ZFFSID = f.id

) e ON A.id = e.FYXMID
left join sys_user us on a.YHID = us.id
inner join sys_dept dept on us.dept_id = dept.id
inner join T_B_YHLXFB d on us.user_cata=d.id
inner join T_B_YHLX c on d.YHLXID=c.id
WHERE b.XMLX = '1' and e.RZBZ='1'


GO

这是视图的创建语句, 之前发的贴感觉都优化蒙了。。。从头开始。

(104330 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_J_DJXMHJMX'。扫描计数 1,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_J_DJFYMXB'。扫描计数 1,逻辑读取 3974 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_J_DJZFFSB'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'sys_dept'。扫描计数 0,逻辑读取 317952 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_B_YHLX'。扫描计数 0,逻辑读取 317952 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_B_YHLXFB'。扫描计数 0,逻辑读取 317952 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'sys_user'。扫描计数 0,逻辑读取 317952 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_J_DJXMB'。扫描计数 0,逻辑读取 525441 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_J_DJFYB'。扫描计数 46,逻辑读取 998 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'sys_organization'。扫描计数 1,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。


这个视图要怎么优化 提高查询效率?
...全文
953 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_15126639 2018-02-05
  • 打赏
  • 举报
回复
引用 8 楼 yenange 的回复:
[quote=引用 6 楼 qq_15126639 的回复:] @_大约在冬季_ 这样就6秒,但是不能重复执行啊 临时表这方面不怎么懂要怎么操作? 我想直接建立个视图做查询,这段可以实现吗。
之所以让你直接贴出最后需要查询的语句, 而不是贴这个视图, 是因为: 你这个视图根本没有筛选数据, 根本没有办法优化, 没有任何意义。 所谓的优化, 都是万里挑一。 一万就得出九千九, 那还挑什么?不用挑了。 A. 全中国14亿人里, 找出身份证号为 4xxxxxxxxxxxxxx0 这一个人出来, 排好了序, 就是秒秒钟的事。 B. 全中国14亿人里, 找出所有用过手机的人, 容易吗? 挑出来站都没地方站。 记住最终的结果集不能大, 大了就没办法优化。 你要优化的, 只能是最终需要查询的SQL, 而不是这个视图, 这个视图相当于一个表, 没有优化价值了。 [/quote] 恩恩 谢谢, 学到了。
吉普赛的歌 2018-01-30
  • 打赏
  • 举报
回复
引用 6 楼 qq_15126639 的回复:
@_大约在冬季_ 这样就6秒,但是不能重复执行啊 临时表这方面不怎么懂要怎么操作? 我想直接建立个视图做查询,这段可以实现吗。
之所以让你直接贴出最后需要查询的语句, 而不是贴这个视图, 是因为: 你这个视图根本没有筛选数据, 根本没有办法优化, 没有任何意义。 所谓的优化, 都是万里挑一。 一万就得出九千九, 那还挑什么?不用挑了。 A. 全中国14亿人里, 找出身份证号为 4xxxxxxxxxxxxxx0 这一个人出来, 排好了序, 就是秒秒钟的事。 B. 全中国14亿人里, 找出所有用过手机的人, 容易吗? 挑出来站都没地方站。 记住最终的结果集不能大, 大了就没办法优化。 你要优化的, 只能是最终需要查询的SQL, 而不是这个视图, 这个视图相当于一个表, 没有优化价值了。
吉普赛的歌 2018-01-30
  • 打赏
  • 举报
回复
引用 6 楼 qq_15126639 的回复:
@_大约在冬季_ 这样就6秒,但是不能重复执行啊 临时表这方面不怎么懂要怎么操作? 我想直接建立个视图做查询,这段可以实现吗。
A. 6秒能不能满足你的需要? B. 视图没办法用临时表, 有需要的地方只能用存储过程里面加上这段代码了。
qq_15126639 2018-01-30
  • 打赏
  • 举报
回复
@_大约在冬季_ 这样就6秒,但是不能重复执行啊 临时表这方面不怎么懂要怎么操作? 我想直接建立个视图做查询,这段可以实现吗。
吉普赛的歌 2018-01-24
  • 打赏
  • 举报
回复
SELECT * 
INTO #tmpA
FROM (
	      SELECT a.id,
                  a.FYRQ,
                  a.XMID,
                  a.org_id,
                  a.YHID,
                  FYXMID,
                  XMJFJE,
                  ZFFSID,
                  dj.CZRQ,
                  RZBZ,
                  f.id AS f_id,
                  f.ZFFSBH,
                  f.ZFFSMC
           FROM   T_J_DJFYB a
                  INNER JOIN T_J_DJFYMXB dj
                       ON  dj.FYXMID = a.id
                  INNER JOIN T_J_DJZFFSB f
                       ON  dj.ZFFSID = f.id
           WHERE  dj.RZBZ = '1'
           UNION ALL 
           SELECT a.id,
                  a.FYRQ,
                  a.XMID,
                  a.org_id,
                  a.YHID,
                  FYXMID,
                  dm.XMHJJE  AS XMJFJE,
                  ZFFSID,
                  dm.CZRQ,
                  '1',
                  f.id       AS f_id,
                  f.ZFFSBH,
                  f.ZFFSMC   AS RZBZ
           FROM   T_J_DJFYB a
                  INNER JOIN T_J_DJXMHJMX dm
                       ON  dm.FYXMID = a.id
                  INNER JOIN T_J_DJZFFSB f
                       ON  dm.ZFFSID = f.id
) AS t;
CREATE CLUSTERED INDEX ix_#tmpA_1 ON #tmpA(org_id,xmid,YHID);

SELECT a.id,
       us.id                             usid,
       us.user_no,
       us.name                           USER_NAME,
       us.pinyin,
       us.pinyinFirst,
       a.XMJFJE,
       us.user_cata,
       d.id                              YHLXBH,
       d.ZDYMC,
       dept.code                         dept_code,
       dept.name                         dept_name,
       A.XMID,
       B.XMMC,
       CAST(CONVERT(CHAR(10), A.FYRQ, 120)AS VARCHAR(10)) AS FYRQ,
       a.f_id                         AS ZFFSID,
       a.ZFFSBH,
       a.ZFFSMC,
       CONVERT(VARCHAR, a.CZRQ, 120)     JFRQ,
       CASE SIGN(a.XMJFJE)
            WHEN - 1 THEN '退费'
            ELSE '缴费'
       END                            AS JFBZ,
       a.org_id,
       org.name                       AS org_name
FROM   #tmpA a
       INNER JOIN sys_organization org
            ON  org.id = a.org_id
       INNER JOIN T_J_DJXMB b
            ON  a.xmid = b.id
            AND b.XMLX = '1'
       LEFT JOIN sys_user us
            ON  a.YHID = us.id
       INNER JOIN sys_dept dept
            ON  us.dept_id = dept.id
       INNER JOIN T_B_YHLXFB d
            ON  us.user_cata = d.id
       INNER JOIN T_B_YHLX c
            ON  d.YHLXID = c.id  
这样需要多少秒?
qq_15126639 2018-01-24
  • 打赏
  • 举报
回复
引用 2 楼 yenange 的回复:
[quote=引用 1 楼 qq_15126639 的回复:] @_大约在冬季_ 大佬再救一波
直接查视图没有任何意义, 你还是把需要查询的语句贴出来吧[/quote]
select a.id,us.id usid,us.user_no,us.name user_name,us.pinyin,us.pinyinFirst,a.XMJFJE,
	us.user_cata,d.id YHLXBH,d.ZDYMC,dept.code dept_code,dept.name dept_name,A.XMID,B.XMMC,
	cast(CONVERT(CHAR(10),A.FYRQ,120)as varchar(10)) AS FYRQ, 
	a.f_id as ZFFSID, a.ZFFSBH,a.ZFFSMC, CONVERT(VARCHAR, a.CZRQ, 120) JFRQ,  
	CASE SIGN(a.XMJFJE) WHEN - 1 THEN '退费' ELSE '缴费' END AS JFBZ,a.org_id ,org.name as org_name
	from (
		select a.id,a.FYRQ,a.XMID,a.org_id,a.YHID,FYXMID,XMJFJE,  ZFFSID,dj.CZRQ,RZBZ,f.id as f_id, f.ZFFSBH,f.ZFFSMC 
		from T_J_DJFYB a 
		inner join T_J_DJFYMXB dj on dj.FYXMID = a.id
		INNER JOIN T_J_DJZFFSB f ON dj.ZFFSID = f.id
		where dj.RZBZ='1'
		union all 
		select a.id,a.FYRQ,a.XMID,a.org_id,a.YHID,FYXMID,dm.XMHJJE as XMJFJE ,ZFFSID,dm.CZRQ,'1',f.id as f_id, 
		f.ZFFSBH,f.ZFFSMC as RZBZ 
		from T_J_DJFYB a
		inner join T_J_DJXMHJMX dm on dm.FYXMID = a.id
		INNER JOIN T_J_DJZFFSB f ON dm.ZFFSID = f.id
	)a 
	inner join sys_organization org on org.id = a.org_id
	inner join T_J_DJXMB b on a.xmid=b.id and b.XMLX='1'
	left join sys_user us on a.YHID = us.id 
	inner join sys_dept dept on us.dept_id = dept.id
	inner join T_B_YHLXFB d on us.user_cata=d.id
	inner join T_B_YHLX c on d.YHLXID=c.id  
吉普赛的歌 2018-01-18
  • 打赏
  • 举报
回复
引用 1 楼 qq_15126639 的回复:
@_大约在冬季_ 大佬再救一波
直接查视图没有任何意义, 你还是把需要查询的语句贴出来吧
qq_15126639 2018-01-18
  • 打赏
  • 举报
回复
@_大约在冬季_ 大佬再救一波

22,210

社区成员

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

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