2016-09-16 381 views
0

我有通知表(非常大的表),我需要用下面的场景你的帮助最佳SQL解决方案?

1选择用户ID的所有通知
2-在notification_log表中插入这些通知 3-中删除所有这些通知通知表

我的想法:

1在通知表创建标志列,并创建更新触发器在它做在上面的场景步骤2和3。

抽奖背上:触发共谋O(n)和我总是选择散装的通知,所以这将是不好听的性能

2 - 创建简单的SQL过程做上述情况下

Draw Backs:如果该脚本的步骤未能完成整个过程,将会回滚

如果能够帮助我优化这一点,该怎么办?

在此先感谢

+0

您可以只有两个单独的查询,第一个选择所有未登录到日志的通知,第二个删除日志中的所有通知。至少你这样使用索引来表现。此外,它永远不会删除它已有的任何东西。 –

回答

1

没有太多,可能会失败INSERT ... SELECT ...; DELETE ...;,所以我肯定会与存储过程中去。

此外,还有一些选项,使整个过程更快(临时删除索引和约束,等等),但是这不是你问:-)

+0

我的目标是提高性能,但如何在没有索引的情况下过程更快? –

+1

因为INSERT和DELETE会创建重建索引的需要。如果您一次移动大量数据,可能会更好地删除索引,移动数据并重新创建索引。数据操作本身将变得更快。 –

+1

'INSERT'和'DELETE'创建'更新'索引的需要。在重建大表上的索引时,可能会比在几千个字段中更新索引更多的开销! – deroby

0

我想你应该用简单的程序走的。

以下是您应遵循的步骤。

1)在通知表中的user_id上创建索引。 2)用光标写程序。 3)收集游标中的所有user_id并迭代。 4)从光标中的user_id通知中选择所有行。 5)在notification_log表中插入这些行。 6)从通知栏中删除插入的列。

注意: - 在成功执行过程后,不要在notification_log表上添加任何外键或索引,然后添加所需的外键和索引。