这是什么更快
/ *删除用户树点* /
delete from tb_tree_points where user_guid=P_user_guid ;
/ *删除tb_user_setting * /
delete from tb_user_setting where user_guid=P_user_guid ;
或
delete from tb_tree_points as s left outer join tb_user_setting as u
on u.user_guid=s.user_guid
where u.user_guid=s.user_guid=P_user_guid ;
作为一个查询
答案 0 :(得分:1)
如果您不需要在单个事务中运行它们,则2个查询更好。如果它们在一个查询中,您将在两个表上保持锁定,同时删除两个表中的数据;在单独的查询版本中,您将释放第一个表上的锁,然后获取另一个表上的锁。
如果您对性能感兴趣,我假设您将使用更大的数据集执行此操作。如果数据集很小则没关系 - 正如你所说它们都需要同时进行。如果它很大,我会更感兴趣的是锁定表的时间。因此,我会在循环中运行查询,但有一些限制,以允许在执行操作时运行其他查询。同样,这取决于要求 - 您是否能够只删除一些记录。如果您必须删除单个原子事务中的所有内容,那么唯一的选择是将查询与实际大小的数据集进行比较,并查看是否存在相当大的差异。
答案 1 :(得分:0)
这是一个评论。第二个查询的正确格式更像是:
delete s, u
from tb_tree_points s left outer join
tb_user_setting u
on u.user_guid = s.user_guid
where u.user_guid = P_user_guid ;
假设两个表中都有user_guid
的索引,我希望这两个查询都具有可比性。使用join
版本可能会有更多的开销。它的优点是是单个语句,因此是单个事务(取决于存储引擎)。
双语句版本具有简单的优点。如果没有适当的索引(两个全表扫描而不是嵌套循环连接),它应该更快。而且,它是所有数据库都支持的标准SQL。