sql语句运行速度太慢,求大佬帮忙优化。

qq_15126639 2017-11-09 10:25:26
select u.name as NAME,c.JYMID,j.JYMMC,COUNT(*) as JYBS,
SUM(a.ZKHJE) as JYJE ,c.BBCS as CS,c.XSSX SX from view_T_Z_JLLS a
inner join T_Z_JLLSFB b on a.org_id=b.org_id and a.id=b.CLH
inner join T_Z_JYMFB c on a.JYMID=c.JYMID and c.org_id = a.org_id
inner join T_Z_JYM j on j.id = c.JYMID
inner join sys_user u on u.id = b.CZYID and u.org_id = a.org_id where a.org_id = 70 and c.BBCS in('1','2')
and a.RQ_UINT>=531705601
AND a.RQ_UINT<531791999 and u.id in (3) and is_oper=1
group by c.JYMID,u.name, j.JYMMC ,c.BBCS,c.XSSX order by NAME,c.BBCS,c.XSSX


执行计划:

(3 行受影响)
表 'T_Z_JLLSFB'。扫描计数 1,逻辑读取 6448828 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_Z_JYM'。扫描计数 0,逻辑读取 243352 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_Z_JYMFB'。扫描计数 1,逻辑读取 608405 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_Z_JLLSTMP'。扫描计数 1,逻辑读取 138 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_Z_JLLS'。扫描计数 1,逻辑读取 122476 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'sys_user'。扫描计数 0,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。


各表的索引:


这个查询完要2分26秒,太久了。。。不知道怎么去优化它,大佬们帮帮忙!谢谢。
...全文
834 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2017-11-09
  • 打赏
  • 举报
回复
#12 试过没有?
顺势而为1 2017-11-09
  • 打赏
  • 举报
回复
引用 13 楼 qq_15126639 的回复:
[quote=引用 11 楼 appetizing_fish1 的回复:] [quote=引用 4 楼 qq_15126639 的回复:] [quote=引用 1 楼 appetizing_fish1 的回复:] T_Z_JYMFB: JYMID T_Z_JLLSFB: CZYID 这两列建聚族索引看看
。。。没有用过,是怎么语句怎么写。。。。[/quote] ALTER TABLE T_Z_JYMFB add constraint PK_JYMID primary key clustered (JYMID) ALTER TABLE T_Z_JLLSFBadd constraint PK_CZYID primary key clustered (CZYID)[/quote] 这不是主键么。。。?[/quote] 是啊, 聚族索引就是 clustered ALTER TABLE T_Z_JYMFB add constraint PK_JYMID primary key clustered (JYMID) ALTER TABLE T_Z_JLLSFB add constraint PK_CZYID primary key clustered (CZYID)
qq_15126639 2017-11-09
  • 打赏
  • 举报
回复
引用 11 楼 appetizing_fish1 的回复:
[quote=引用 4 楼 qq_15126639 的回复:] [quote=引用 1 楼 appetizing_fish1 的回复:] T_Z_JYMFB: JYMID T_Z_JLLSFB: CZYID 这两列建聚族索引看看
。。。没有用过,是怎么语句怎么写。。。。[/quote] ALTER TABLE T_Z_JYMFB add constraint PK_JYMID primary key clustered (JYMID) ALTER TABLE T_Z_JLLSFBadd constraint PK_CZYID primary key clustered (CZYID)[/quote] 这不是主键么。。。?
吉普赛的歌 2017-11-09
  • 打赏
  • 举报
回复
ALTER INDEX ix_T_Z_JLLS_RQ_UINT_org_id ON T_Z_JLLS REBUILD PARTITION = ALL
你用上面类似的脚本, 把所有索引重新生成。 然后再执行你的SQL 看下效果如何?
顺势而为1 2017-11-09
  • 打赏
  • 举报
回复
引用 4 楼 qq_15126639 的回复:
[quote=引用 1 楼 appetizing_fish1 的回复:] T_Z_JYMFB: JYMID T_Z_JLLSFB: CZYID 这两列建聚族索引看看
。。。没有用过,是怎么语句怎么写。。。。[/quote] ALTER TABLE T_Z_JYMFB add constraint PK_JYMID primary key clustered (JYMID) ALTER TABLE T_Z_JLLSFBadd constraint PK_CZYID primary key clustered (CZYID)
qq_15126639 2017-11-09
  • 打赏
  • 举报
回复
引用 8 楼 wtujedp 的回复:
view_T_Z_JLLS 是个视图?查看一下结果, 统计一下,看看慢不慢 select count(1) from view_T_Z_JLLS where RQ_UINT>=531705601AND RQ_UINT<531791999 SQL一个个分解执行下,找出哪个地方慢,然后再优化
select count(1) from view_T_Z_JLLS where RQ_UINT>=531705601AND RQ_UINT<531791999 结果是:121681
SELECT *FROM T_Z_JLLS 
UNION 
SELECT *FROM T_Z_JLLSTMP where ZT<>'1' and ZT<>'5'
视图代码 要怎么搞。。。。
qq_15126639 2017-11-09
  • 打赏
  • 举报
回复
引用 7 楼 zengertao 的回复:
LZ看下view_T_Z_JLLS先把过滤条件提成临时表再替换进去跑。 顺便你这个是视图啊,看看过滤条件是不是都在原始的1张表或2张表上。可以考虑用实体表不要用视图。偷懒要不得
SELECT *FROM T_Z_JLLS 
UNION 
SELECT *FROM T_Z_JLLSTMP where ZT<>'1' and ZT<>'5'
视图代码 要怎么搞。。。。
wtujedp 2017-11-09
  • 打赏
  • 举报
回复
view_T_Z_JLLS 是个视图?查看一下结果, 统计一下,看看慢不慢 select count(1) from view_T_Z_JLLS where RQ_UINT>=531705601AND RQ_UINT<531791999 SQL一个个分解执行下,找出哪个地方慢,然后再优化
繁花尽流年 2017-11-09
  • 打赏
  • 举报
回复
LZ看下view_T_Z_JLLS先把过滤条件提成临时表再替换进去跑。 顺便你这个是视图啊,看看过滤条件是不是都在原始的1张表或2张表上。可以考虑用实体表不要用视图。偷懒要不得
听雨停了 2017-11-09
  • 打赏
  • 举报
回复
引用 3 楼 qq_15126639 的回复:
[quote=引用 2 楼 qq_37170555 的回复:]

SELECT u.name        AS NAME,
       c.JYMID,
       j.JYMMC,
       COUNT(*)      AS JYBS,
       SUM(a.ZKHJE)  AS JYJE,
       c.BBCS        AS CS,
       c.XSSX           SX
FROM   view_T_Z_JLLS a
       INNER JOIN T_Z_JLLSFB b
            ON  a.org_id = b.org_id
            AND b.org_id=70
            AND a.id = b.CLH
       INNER JOIN T_Z_JYMFB c
            ON  a.JYMID = c.JYMID
            AND c.org_id = a.org_id
            AND (c.BBCS = '1' OR c.BBCS = '2')
       INNER JOIN T_Z_JYM j
            ON  j.id = c.JYMID
       INNER JOIN sys_user u
            ON  u.id = b.CZYID
            AND u.id = 3
            AND u.org_id = a.org_id
WHERE  a.RQ_UINT BETWEEN 531705601 AND 531791998
       AND is_oper = 1
GROUP BY
       c.JYMID,
       u.name,
       j.JYMMC,
       c.BBCS,
       c.XSSX
ORDER BY
       NAME,
       c.BBCS,
       c.XSSX
没有一点提升。。。。[/quote] 建立下面的非聚集索引,然后再执行上面的查询语句

CREATE view_T_Z_JLLS_NCL NONCLUSTERED INDEX ON view_T_Z_JLLS(org_id,RQ_UINT)
INCLUDE(ZKHJE,JYMID)

CREATE T_Z_JLLSFB_NCL NONCLUSTERED INDEX ON T_Z_JLLSFB_NCL(CLH,CZYID)

CREATE T_Z_JYMFB_NCL NONCLUSTERED INDEX ON T_Z_JYMFB_NCL(org_id,JYMID)
INCLUDE(BBCS,XSSX)

CREATE T_Z_JYM_NCL NONCLUSTERED INDEX ON T_Z_JYM_NCL(id,JYMMC)
INCLUDE(BBCS,XSSX)

CREATE sys_user_NCL NONCLUSTERED INDEX ON sys_user_NCL(id,org_id)
INCLUDE(name)
qq_15126639 2017-11-09
  • 打赏
  • 举报
回复
@_大约在冬季_ 大佬快来救我~~
qq_15126639 2017-11-09
  • 打赏
  • 举报
回复
引用 1 楼 appetizing_fish1 的回复:
T_Z_JYMFB: JYMID T_Z_JLLSFB: CZYID 这两列建聚族索引看看
。。。没有用过,是怎么语句怎么写。。。。
qq_15126639 2017-11-09
  • 打赏
  • 举报
回复
引用 2 楼 qq_37170555 的回复:

SELECT u.name        AS NAME,
       c.JYMID,
       j.JYMMC,
       COUNT(*)      AS JYBS,
       SUM(a.ZKHJE)  AS JYJE,
       c.BBCS        AS CS,
       c.XSSX           SX
FROM   view_T_Z_JLLS a
       INNER JOIN T_Z_JLLSFB b
            ON  a.org_id = b.org_id
            AND b.org_id=70
            AND a.id = b.CLH
       INNER JOIN T_Z_JYMFB c
            ON  a.JYMID = c.JYMID
            AND c.org_id = a.org_id
            AND (c.BBCS = '1' OR c.BBCS = '2')
       INNER JOIN T_Z_JYM j
            ON  j.id = c.JYMID
       INNER JOIN sys_user u
            ON  u.id = b.CZYID
            AND u.id = 3
            AND u.org_id = a.org_id
WHERE  a.RQ_UINT BETWEEN 531705601 AND 531791998
       AND is_oper = 1
GROUP BY
       c.JYMID,
       u.name,
       j.JYMMC,
       c.BBCS,
       c.XSSX
ORDER BY
       NAME,
       c.BBCS,
       c.XSSX
没有一点提升。。。。
听雨停了 2017-11-09
  • 打赏
  • 举报
回复

SELECT u.name        AS NAME,
       c.JYMID,
       j.JYMMC,
       COUNT(*)      AS JYBS,
       SUM(a.ZKHJE)  AS JYJE,
       c.BBCS        AS CS,
       c.XSSX           SX
FROM   view_T_Z_JLLS a
       INNER JOIN T_Z_JLLSFB b
            ON  a.org_id = b.org_id
            AND b.org_id=70
            AND a.id = b.CLH
       INNER JOIN T_Z_JYMFB c
            ON  a.JYMID = c.JYMID
            AND c.org_id = a.org_id
            AND (c.BBCS = '1' OR c.BBCS = '2')
       INNER JOIN T_Z_JYM j
            ON  j.id = c.JYMID
       INNER JOIN sys_user u
            ON  u.id = b.CZYID
            AND u.id = 3
            AND u.org_id = a.org_id
WHERE  a.RQ_UINT BETWEEN 531705601 AND 531791998
       AND is_oper = 1
GROUP BY
       c.JYMID,
       u.name,
       j.JYMMC,
       c.BBCS,
       c.XSSX
ORDER BY
       NAME,
       c.BBCS,
       c.XSSX
顺势而为1 2017-11-09
  • 打赏
  • 举报
回复
T_Z_JYMFB: JYMID T_Z_JLLSFB: CZYID 这两列建聚族索引看看
吉普赛的歌 2017-11-09
  • 打赏
  • 举报
回复
引用 16 楼 qq_15126639 的回复:
[quote=引用 15 楼 yenange 的回复:] #12 试过没有?
完美, 还是你最棒![/quote] 索引这个东西需要维护, 你的这些表可能增、删、改 太频繁导致了索引无效。 你要建立一个作业, 每天凌晨 2 点左右(反正是服务器空闲的时段)运行 重新生成索引 的脚本。
qq_15126639 2017-11-09
  • 打赏
  • 举报
回复
引用 15 楼 yenange 的回复:
#12 试过没有?
完美, 还是你最棒!

22,206

社区成员

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

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