这样的sql查询如何能优化?

no_mIss 2007-07-02 11:03:09
我举一个简单的例子来说明我的问题
表A
字段 A_id,A_name
主键 A_id
表B
字段 B_id,B_name
主键 B_id
A_id和B_id没有关系
A_name和B_name均有索引

现在查询的是
SELECT COUNT(*) FROM A INNER JOIN B ON A.A_name = B.B_name
WHERE B.id IS NULL
由于表A的数据大约在30W,表B的大约在300W,所以查询相当的慢,大约在2分钟

所以请教大家,这种查询如何优化?
...全文
200 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
no_mIss 2007-07-02
  • 打赏
  • 举报
回复
to lianqizhi : WHERE b.name is null 效果一样
Zack999 2007-07-02
  • 打赏
  • 举报
回复
WHERE b.name is null
试试这个
no_mIss 2007-07-02
  • 打赏
  • 举报
回复
to lee_wei :确定不是inner join 主键有索引 count(*)=count(主键)
to lianqizhi :这个我知道

我只是想如何能避免全扫B表
no_mIss 2007-07-02
  • 打赏
  • 举报
回复
To paoluo:
没有效果,这种not in /left join /not exists
的查询效果从执行计划上看是等效的
Zack999 2007-07-02
  • 打赏
  • 举报
回复
查A表里A_name存在值但在B表里的B_name不存在
SELECT COUNT(*) FROM A LEFT JOIN B ON A.A_name = B.B_name
WHERE B.id IS NULL
lee_wei 2007-07-02
  • 打赏
  • 举报
回复
SELECT COUNT(*) FROM A INNER JOIN B ON A.A_name = B.B_name
WHERE B.id IS NULL

——————————
这语句好像有3个地方需要确认.
B.id是否建索引;
INNER JOIN是不是可以改用LEFT/RIGHT JOIN
COUNT(*) 改为 COUNT(索引字段)
no_mIss 2007-07-02
  • 打赏
  • 举报
回复
其实就是查A表里A_name存在值但在B表里的B_name不存在.
to paoluo:我试试,估计不会有效果
因为count(*)会自动寻找一个主键
paoluo 2007-07-02
  • 打赏
  • 举报
回复
你用的應該是LEFT JOIN,而不是INNER JOIN吧。

將count(*)改為count(A.id)試下看
昵称被占用了 2007-07-02
  • 打赏
  • 举报
回复
确定没写错?

INNER JOIN ?
B.id IS NULL?

lee_wei 2007-07-02
  • 打赏
  • 举报
回复
我只是想如何能避免全扫B表

——————————
那就必须根据你的关联字段及查询字段创建索引,然后通过执行计划可以查看是否全表扫描了。

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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