RicarKS 2022-05-11 09:20 采纳率: 0%
浏览 87
已结题

SYBASE SQL 优化

线上项目,客户反映SQL执行特别慢,分析SQL得到,是某个子查询过慢,要优化,但想了很久不知道要怎么优化

数据库是SYBASE

问题相关代码,请勿粘贴截图

除去无关业务,SQL大致可以简化成这样
SELECT A.NAME,
A.AGE,
(SELECT COUNT(1) FROM B WHERE B.ID = A.ID AND B.NAME = '张三') NUM
FROM A
WHERE A.SEX = '1'
AND A.STATE IN ('1', '2')
ORDER BY A.CREATEDATE, A.LASTUPDATE

运行结果及报错内容

执行大概需要10几秒

我的解答思路和尝试过的方法

A表特别大,外部查A表的查询可能会返回几十万到几百万的数据,但是全走索引,仅查询A表并不慢,查询计划分析能知道,是从A表查询之后,执行子查询(SELECT COUNT(1) FROM B WHERE B.ID = A.ID AND B.NAME = '张三') 特别慢,因为A表返回几百万的数据,这里就要扫描几百万次B表,但是B表特别小,除去关联查询之后,(SELECT * FROM B WHERE B.NAME = '张三') 可能只会返回几十到几百条数据,现在想的是应该用B表驱动A表才对,但是外部A表的查询条件可能会特别多,查询的所有列除了这个COUNT之外都是A表的数据,可以说除了这个COUNT,这个查询和B表是没有关系的

我想要达到的结果

希望能把SQL优化到2s以下

  • 写回答

7条回答 默认 最新

  • 黑白码农 2022-05-11 09:36
    关注
    获得0.35元问题酬金

    既然是只取b表的部分数据,而且where中和B表无关,那这个为什么不直插a表分页后,内存上处理b表的条件,然后获取B表数据就可以了啊

    评论

报告相同问题?

问题事件

  • 系统已结题 5月19日
  • 创建了问题 5月11日