求该条SQL的优化.见内容

[复制链接]
查看11 | 回复7 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
表结构
A:
CREATE TABLE A (FATHER_ID INT identity(1,1),KH VARCHAR(50),JJ VARCHAR(50),XJ FLOAT,CPMCH VARCHAR(50),CPBH VARCHAR(50),KHDDH VARCHAR(50))
B:
create table B(father_id int identity(1,1),kh varchar(50),jj varchar(50),htbh varchar(50))
----------------要求:
先SQL:select* from A where kh+jj not in(select kh+jj from B)
执行效率太低!请解答!
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
还有一个因素就是两个表的数据量,以及差值大小的评估,一般情况的方法如下
1.新建一个字段,其值是两个加起来
2.在新字段上,建索引
3.使用NOT EXISTS
另:如果是MSSQL2005以上版本,推荐使用EXCEPT
注:你的SQL中有两个错误(优化),A.不能使用索引(原因是使用了计算字段),B.使用了NOT IN(这是SQL查询中,效率最低的一种)
[ 本帖最后由 twslh 于 2010-2-9 11:39 编辑 ]
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
select* into #A from A
delete t1 from #At1,B t2 where t1.kh=t2.kh and t1.jj =t2.jj
select * from #A
应该会快点吧
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
楼上的处理,思路不错,但有2个不恰当的地方
1.建临时表,会耗费时间的
2.删除后面的过滤条件性能没有改变

另一个小错误:有数据漏洞,AA+BBB = AAB + BB
[ 本帖最后由 twslh 于 2010-2-9 11:32 编辑 ]
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
SQL:select* from A where kh+jj not in(select kh+jj from B)
执行效率太低!请解答!

不仅仅是执行效率低,还可能有岐意
比如 abc+def = ab+cdef
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
如 abc+def = ab+cdef
这个在业务中是不可能有的!
这个可以暂且不谈!
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
这里牵扯掉一些业务问题,我们是做服装行业的.
A表里的信息:主要用于算料,可以说A表里的信息是产生自B表.
B表里的信息:是大货订单的里信息.
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
做一个辅助字段吧,rule=A+B,并在上面建索引
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行