表关联与exist的运行效率对比

raymonshi 2011-11-04 12:03:44
如题。我写了俩段sql,一个是表关联的,一个是用exist的。A表数据量级百万,B表不到1万
从执行计划上看,是exist的耗费低;但是执行的时间,是表关联的用时少。
sql如下:SELECT COUNT(1) -- 耗费 9895 ,用时1.172s/1.532s/1.231s
FROM table1 A, table2 B
WHERE A.JOB_CODE IS NOT NULL AND B.FACTDETAILNO = '5005'
AND (B.FACTDETAILCODE = SUBSTR(A.JOB_CODE, 1, 3) OR
B.FACTDETAILCODE = SUBSTR(A.JOB_CODE, 1, 2));

SELECT COUNT(1)-- 耗费 5950 ,用时3.721s/2.781s/4.562s
FROM table1 A
WHERE A.JOB_CODE IS NOT NULL
AND EXISTS (SELECT 1
FROM table2 B AND B.FACTDETAILNO = '5005'
WHERE (B.FACTDETAILCODE = SUBSTR(A.JOB_CODE, 1, 2) OR
B.FACTDETAILCODE = SUBSTR(A.JOB_CODE, 1, 3))
)
表关联,与exist的查询过程是怎么查询的,哪个更优些,或者分情况。
...全文
491 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
raymonshi 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 roy_88 的回复:]

改改,有兩個地方沒改到
SQL code
SELECT COUNT(1)-- 耗费 5950 ,用时3.721s/2.781s/4.562s
FROM table1 A
WHERE A.JOB_CODE IS NOT NULL
AND EXISTS (SELECT 1 FROM table2 B WHERE B.FACTDETAILNO = '5005' AN……
[/Quote]
这样改,没看懂。举个例子:a表中job_code 存储的A012345,012345,b表FACTDETAILCODE中存的是01,A01.
你的意思是,我应改写成a.job_code like b.FACTDETAILCODE || '%'吗?
中国风 2011-11-04
  • 打赏
  • 举报
回复
改改,有兩個地方沒改到
SELECT COUNT(1)-- 耗费 5950 ,用时3.721s/2.781s/4.562s
FROM table1 A
WHERE A.JOB_CODE IS NOT NULL
AND EXISTS (SELECT 1 FROM table2 B WHERE B.FACTDETAILNO = '5005' AND A.JOB_CODE LIKE A.JOB_CODE+'%')
中国风 2011-11-04
  • 打赏
  • 举报
回复
SELECT COUNT(1)-- 耗费 5950 ,用时3.721s/2.781s/4.562s
FROM table1 A
WHERE A.JOB_CODE IS NOT NULL
AND EXISTS (SELECT 1 FROM table2 B AND B.FACTDETAILNO = '5005' WHERE A.JOB_CODE LIKE A.JOB_CODE+'%')


這樣測測
快溜 2011-11-04
  • 打赏
  • 举报
回复
用exist不稳定,看你内外表的匹配度,或快或慢
中国风 2011-11-04
  • 打赏
  • 举报
回复
條件存在1對多關係時用第2种
raymonshi 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 roy_88 的回复:]

SUBSTR(A.JOB_CODE, 1, 3) ?

Oracle麼?
[/Quote]
这段是oracle的,在sqlserver 与db2数据同样有这样的疑问。
中国风 2011-11-04
  • 打赏
  • 举报
回复
SUBSTR(A.JOB_CODE, 1, 3) ?

Oracle麼?

662

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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