UPDATE... WHERE EXISTS... 引起full table scan

张琪Samuel 2009-10-08 11:42:03
首先我并不是用SQL Server,而是一个基于Java的开源数据库HSQLDB,由于没有其他地方可以问SQL的问题,不得已贴到这里来,望见谅。

具体问题是这样的:

drop table a if exists;
create table a (col0 int);
create index ia on a (col0);
insert into a values (1);

drop table b if exists;
create table b (col0 int);
create index ib on b (col0);
insert into b values (1);

当我调用

explain plan for UPDATE a SET col0 = null WHERE EXISTS (SELECT col0 FROM b WHERE a.col0 = b.col0);

发现数据库对于a表采用了full table scan,但是在WHERE里面却是正确使用了索引。请问应该如何做才能避免对a表的full table scan?谢谢。
...全文
393 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuejie09242 2009-10-08
  • 打赏
  • 举报
回复
update a set col0=null from a,b where a.col0=b.col0
张琪Samuel 2009-10-08
  • 打赏
  • 举报
回复
谢谢各位热心帮助,不过HSQL只支持以下语法:

UPDATE tableName SET {columnName= {DEFAULT | expression} } [,...]
[WHERE expression]

请问还有什么方法么?
rucypli 2009-10-08
  • 打赏
  • 举报
回复
update a
set a.col0=null
from a,b
where a.col0=b.col0
黄_瓜 2009-10-08
  • 打赏
  • 举报
回复
帮顶
百年树人 2009-10-08
  • 打赏
  • 举报
回复
UPDATE a 
JOIN b on a.col0 = b.col0
SET a.col0 = null


水族杰纶 2009-10-08
  • 打赏
  • 举报
回复
--try
UPDATE a SET col0 = null from a WITH(INDEX=IDX_tb_a)
WHERE EXISTS (SELECT col0 FROM b WHERE a.col0 = b.col0 )

张琪Samuel 2009-10-08
  • 打赏
  • 举报
回复
还有一个想法,就是这样的WHERE EXISTS其实就是一种JOIN(哪位高人能帮我确认一下),即使有INDEX,最好情况也避免不了semi hash join时建哈希表时的全表检索。如果真是这样,那么我也认命了。看样子要从一个表中删除存在另一个表中的数据,这条路不是什么好方法……
张琪Samuel 2009-10-08
  • 打赏
  • 举报
回复
谢谢楼上,可惜这种语法也不被支持,毕竟是个开源的内存数据库,不能和SQL Server相提并论……换句话问,是不是如果只支持

UPDATE tableName SET {columnName= {DEFAULT | expression} } [,...]
[WHERE expression]

的话,根本就无法避免full table scan?

22,206

社区成员

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

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