语句优化,求解

shf156184620 2010-04-26 02:29:39
--两表结构完全相同,数据量都在500万以上,有什么办法能提高这条语句的查询速度
SELECT *
FROM T_AAA A, T_BBB B
WHERE A.ID = B.ID
AND ABS(A.FIELD1 - B.FIELD1) <= 10
AND ABS(B.FIELD2 - B.FIELD2) <= 100;

慢就慢在
AND ABS(A.FIELD1 - B.FIELD1) <= 10
AND ABS(B.FIELD2 - B.FIELD2) <= 100;
这两句话了,求如何改善语句提高查询速度
...全文
132 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ypfe23 2010-05-05
  • 打赏
  • 举报
回复
核心是数据分布
shf156184620 2010-04-29
  • 打赏
  • 举报
回复
我已经解决这个问题了,这个语句是用来做对账程序的,也就是两表的数据作对比,把不同的数据标志出来,原先是update语句
原语句
update T_AAA A
set a.bj = 0
WHERE not exist (select 1
from T_BBB B
where A.ID = B.ID
AND ABS(A.FIELD1 - B.FIELD1) <= 10
AND ABS(B.FIELD2 - B.FIELD2) <= 100);

AND ABS(A.FIELD1 - B.FIELD1) <= 10
AND ABS(A.FIELD2 - B.FIELD2) <= 100);
10和100其实是偏移量,也就是两表字段数据之差小于偏移量就行。慢就是因为这两句

解决思路:因为两表不同的数据是比较少的,索性我就先标志出两表相同的数据,然后再拿不同的数据去对比,缩小范围,速度大幅提升。
标志出相同数据:
UPDATE T_AAA A
SET A.BJ = 2
WHERE NOT EXIST (SELECT 1
FROM T_BBB B
WHERE A.ID = B.ID
AND A.FIELD1 = B.FIELD1
AND B.FIELD2 = B.FIELD2);
这条语句很快,接着再执行如下语句,加上偏移量,缩小范围

UPDATE T_AAA A
SET A.BJ = 0
WHERE NOT EXIST (SELECT 1
FROM T_BBB B
WHERE A.ID = B.ID
AND ABS(A.FIELD1 - B.FIELD1) <= 10
AND ABS(B.FIELD2 - B.FIELD2) <= 100)
AND A.BJ = 2;

最后BJ=0的就是不同的数据。
非常感谢大家的回复,谢谢!
ypfe23 2010-04-29
  • 打赏
  • 举报
回复
还有一点就是附合数据的命中比较底,基本上需要全表扫!
小灰狼W 2010-04-28
  • 打赏
  • 举报
回复
AND ABS(A.FIELD1 - B.FIELD1) <= 10
AND ABS(a.FIELD2 - B.FIELD2) <= 100;
改成
and a.field1<=b.field1+10 and a.field1>=b.field1-10
and a.field2<=b.field2+100 and a.field2>=b.field2-100
试试,建a表中field1和field2、id的联合索引
ypfe23 2010-04-28
  • 打赏
  • 举报
回复
1.
ABS(B.FIELD2 - B.FIELD2) <= 100;
这个有点问题吧,其结果始终是0
2.
FIELD2,FIELD1的值的分布情况大概说一下,比如说正负情况
shf156184620 2010-04-27
  • 打赏
  • 举报
回复
没人给些建议了吗
ojuju10 2010-04-26
  • 打赏
  • 举报
回复
2个表不能建立函数索引
shf156184620 2010-04-26
  • 打赏
  • 举报
回复
如果函数索引有效的话该如何去创建 ? 我只会建单表的,两个表似乎不能建吧
shf156184620 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ojuju10 的回复:]
新建一个统计表,保存SELECT *
FROM T_AAA A, T_BBB B
WHERE A.ID = B.ID

将计算结果ABS(A.FIELD1 - B.FIELD1)保存到统计表中
[/Quote]
我想过,问题是两表的ID都不是唯一,笛卡尔积非常庞大,光保存就要耗费很长的时间,再说项目上也不允许
永生天地 2010-04-26
  • 打赏
  • 举报
回复
这个语句已经很精简了,我是想不到有什么优化的地方
ojuju10 2010-04-26
  • 打赏
  • 举报
回复
新建一个统计表,保存SELECT *
FROM T_AAA A, T_BBB B
WHERE A.ID = B.ID

将计算结果ABS(A.FIELD1 - B.FIELD1)保存到统计表中

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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