数据集较大的查询语句如何编写才能最优化? ( 积分: 30 )

  • 主题发起人 主题发起人 imail_my
  • 开始时间 开始时间
I

imail_my

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟最近在修改公司的ERP系统,发现部分模块在进行数据操作的时候特别慢
(DB SERVER XEON 2.4G 512M 70G SCSI),模块中用到几个表的数据,每个表的记录都上30000条(ERP是外面公司写的表结构很烂,乱七八糟的FIELD多的很)现以两个表的查询为例说明

A表(30000 record)
Key Field A1,A2,A3

B表(30000 record)
Key Field B1,B2,B3

A1,A2,A3 B1,B2,B3 成对应关系

现要查出 B表中不存在B1,B2,B3 的A表记录

我写了两个语句进行分析

1
select * from A where A1+A2+A3 NOT IN(select B1+B2+B3 FROM B)

2
select * from A where NOT EXISTS(select '1' FROM B B1+B2+B3=A1+A2+A3)

用事件探查的时候发现2的语句较优化一些

3
在B表保存的时候就在A表中作一个标记An='Y'
select * from A where An='N'

这些就是我脑子里的方法(太菜)我想知道大家用的是什么方法(语句),各大虾谢谢了...
 
没有人回答啊.
 
用left join ,inner join 来优化,速度会快很多.

select * from A as a inner join B as b on (a.A1+a.A2+a.A3)=(b.B1+b.B2+b.B3)
 
select * from A where NOT EXISTS(select '1' FROM B B1+B2+B3=A1+A2+A3)
应该是:
select * from A where NOT EXISTS(select '1' FROM B WHERE B1+B2+B3=A1+A2+A3)吧

假设A,B表都有主键:ID,不知这样写会不会更快,未调试过

select * from A where ID NOT IN (select A.ID FROM A INNER JOIN B ON A.A1=B.B1 AND A.A2=B.B2 AND A.A3=B.B3)
 
你1和2的情况比较是正确的!网上随便找个贴个看看,一些语法在数据量大的时候尽量转换.
你3的说法,也许是个速度的方法,但安全性,操作性就...
库结构(表的结构,索引,相互的关联等等)直接影响着速度
但有时候,查询是必须要花时间的,当时间不可缩短的时候,可以分页显示,或者带进度的查询,让用户知道你在做什么就OK了.
 
楼主的查询方法是有问题的 假设a1,a2,a2,b1,b2,b3是整数。。那么a1+a2+a2=b1+b2+b3相等而a1=b1 a2=b2 a3=b3 不同时成立是有可能的 同样是字符类型这种情况也是有可能发生的
要提高数据集较大造成的查询响应速度慢可也采用top分页处理
 
后退
顶部