关于不等号和or的优化问题

cometing 2012-08-07 03:33:49
据说用union会比or快,但是太多or的话,union的次数就多了,我碰到了一个sql语句,比如

SELECT * FROM 业务表 A, 业务表记录B
WHERE A.ID = B.ID
....
AND (A.a <>B.a
OR A.b <>B.b
OR A.c <>B.c
OR A.d <>B.d
OR A.e <>B.e
OR A.f <>B.f
...)


这个没用到触发器,只是在存储过程里面,通过这个句子,找改变过的记录
如何优化比较好呢?
...全文
232 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
cometing 2012-08-08
  • 打赏
  • 举报
回复
非常感谢各位大大~!
筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

引用 14 楼 的回复:
可以改成下面的两种逻辑

SQL code

--1
SELECT *
FROM #ta AS a ,
#tb AS b
WHERE a.id = b.id
AND NOT (
a.a = b.a
AND a.b = b.b
……


非常感谢,只是这个跑起来反而更慢了一分钟,将近一倍的差距。可能不能单从sql上入手,可惜不……
[/Quote]

SELECT *
FROM #ta AS a ,
#tb AS b
WHERE a.id = b.id
AND NOT EXISTS ( SELECT 1
FROM #tb AS c
WHERE a.a = c.a
AND a.b = c.b
AND a.c = c.c
AND a.b = c.d
AND a.e = c.e
AND a.id = c.id )

这个可能会快点,还有你是怎么测试的,估计没请缓存吧。
or 运算不慢。。。。。。。。。
cometing 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
可以改成下面的两种逻辑

SQL code

--1
SELECT *
FROM #ta AS a ,
#tb AS b
WHERE a.id = b.id
AND NOT (
a.a = b.a
AND a.b = b.b
……
[/Quote]

非常感谢,只是这个跑起来反而更慢了一分钟,将近一倍的差距。可能不能单从sql上入手,可惜不太懂配置,比如索引表空间等。。
Mr_Nice 2012-08-07
  • 打赏
  • 举报
回复
如果结构相同,except可以解决
筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 10 楼 的回复:
引用 8 楼 的回复:

引用 7 楼 的回复:
怎么能直接加呢

1<>2
2<>1
1+2=2+1

唉,无语了。怎么都当成数值了,明显是作为字符来处理的,如果字段是数值,先转化为字符

ab<>cd
abc<>d
abcd=abcd



少年说话客气点。。。

首先先声明下,我没有不客气的意思,而且我的回答也没有体现对你……
[/Quote]
哦,那我多想了,呵呵
筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
可以改成下面的两种逻辑
--1
SELECT *
FROM #ta AS a ,
#tb AS b
WHERE a.id = b.id
AND NOT (
a.a = b.a
AND a.b = b.b
AND a.c = b.c
AND a.b = b.d
AND a.e = b.e
)


--2
SELECT *
FROM #ta AS a ,
#tb AS b
WHERE a.id = b.id
AND NOT EXISTS ( SELECT 1
FROM #tb AS c
WHERE a.a = c.a
AND a.b = c.b
AND a.c = c.c
AND a.b = c.d
AND a.e = c.e
AND a.id = c.id )
cometing 2012-08-07
  • 打赏
  • 举报
回复
明天中午结贴,谢谢各位。。希望能有更好的方法。。
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
引用 8 楼 的回复:

引用 7 楼 的回复:
怎么能直接加呢

1<>2
2<>1
1+2=2+1

唉,无语了。怎么都当成数值了,明显是作为字符来处理的,如果字段是数值,先转化为字符

ab<>cd
abc<>d
abcd=abcd



少年说话客气点。。。
[/Quote]
首先先声明下,我没有不客气的意思,而且我的回答也没有体现对你不客气;另外谁大谁小还不知道呢?
cometing 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
引用 8 楼 的回复:

引用 7 楼 的回复:
怎么能直接加呢

1<>2
2<>1
1+2=2+1

唉,无语了。怎么都当成数值了,明显是作为字符来处理的,如果字段是数值,先转化为字符

ab<>cd
abc<>d
abcd=abcd



少年说话客气点。。。
[/Quote]


除了膜拜我还能干嘛呢,谢谢!
筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:
怎么能直接加呢

1<>2
2<>1
1+2=2+1

唉,无语了。怎么都当成数值了,明显是作为字符来处理的,如果字段是数值,先转化为字符
[/Quote]
ab<>cd
abc<>d
abcd=abcd



少年说话客气点。。。


cometing 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 7 楼 的回复:
怎么能直接加呢

1<>2
2<>1
1+2=2+1

唉,无语了。怎么都当成数值了,明显是作为字符来处理的,如果字段是数值,先转化为字符
[/Quote]

恩,发帖的时候没说清楚,是不同类型的很多
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
怎么能直接加呢

1<>2
2<>1
1+2=2+1
[/Quote]
唉,无语了。怎么都当成数值了,明显是作为字符来处理的,如果字段是数值,先转化为字符
筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
怎么能直接加呢

1<>2
2<>1
1+2=2+1
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 1 楼 的回复:
试试
SQL code
AND (A.a+A.b+A.c+A.d+Q.d+Q.e+Q.f)<>(B.a+B.b+B.c+B.d+B.d+B.e+B.f)

思路很好,但是确定没错?:)
试试这个:
(abs(A.a - B.a) + abs(A.b - B.b) + abs(A.c - B.c) + abs(A.d - B.d) + abs(A.e - B.e……
[/Quote]
奇怪了,你为什么要用abs呢? 你不会把它们都当成数值了吧?
我的做法是把它们全部当做字符然后拼接在一起再比较的,方法肯定可行,但不保证效率是否能满足LZ的要求。
cometing 2012-08-07
  • 打赏
  • 举报
回复
偶是菜鸟。。请问大侠,问题在哪里哦。。我觉得这个思路挺不错,反正我只要有一个不同就成立,不如全加起来,判断一次就够。

但是操作起来不方便,各个字段的类型不一样,而且还不知道效率如何,基本上是千万记录级别的。
shoppo0505 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
试试
SQL code
AND (A.a+A.b+A.c+A.d+Q.d+Q.e+Q.f)<>(B.a+B.b+B.c+B.d+B.d+B.e+B.f)
[/Quote]
思路很好,但是确定没错?:)
试试这个:
(abs(A.a - B.a) + abs(A.b - B.b) + abs(A.c - B.c) + abs(A.d - B.d) + abs(A.e - B.e) + abs(A.f - B.f))> 0
icebbb34 2012-08-07
  • 打赏
  • 举报
回复
明显1楼的回答有问题

cometing 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
试试

SQL code

AND (A.a+A.b+A.c+A.d+Q.d+Q.e+Q.f)<>(B.a+B.b+B.c+B.d+B.d+B.e+B.f)
[/Quote]

挺好,就是转换格式麻烦了点,眼前一亮
  • 打赏
  • 举报
回复
试试
AND (A.a+A.b+A.c+A.d+Q.d+Q.e+Q.f)<>(B.a+B.b+B.c+B.d+B.d+B.e+B.f)

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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