在基表中填充新id后插入

时间:2018-05-31 09:07:27

标签: database sqlite

我对这个问题有两个部分,如果你能回答,我会得到奖金。

问题#1 我有两个名为tbl和tbl_search的SQLITE表 其中tbl是普通表,tbl_search是FTS4表

让我们说我们在我的应用程序运行#0,应用程序运行并开始用数据填充tbl然后在最后,它复制从tbl到tbl_search的所有内容并完成工作但是,这来了具有增量运行的性能成本。对于增量运行(运行#1),到目前为止,我一直在删除并重新创建fts表,因为在正常复制期间,它也用于转储运行#0项,创建重复数据,此外在性能部分上花了很多钱。

在思考之后,我找到了4种解决这种情况的方法:

1)为tbl创建一个SQL触发器到tbl_search副本。

2)在每次运行中创建一个临时表,并将其数据复制到tbl_search以避免重复,然后将其删除

3)使用tbl的ID列中的唯一ID,找到丢失的ID,并仅复制到tbl_search的那些

4)创建另一个表,该表将具有最后运行的详细信息并使用它们将所有内容放在--AFTER Date列之后。让我们说最后一次运行在04-05-2018 9:40 PM结束,然后在那之后从tbl复制到tbl_search。

我发现选项#3在性能方面最有成效,并且想要去做,所以我该怎么做?下面是一个示例tbl供参考。

RUN#0

ID                    FILENAME                              LABEL_NUMBER
----------------------------------------------------------------------
1              C:/Test_Software/6.avi                          11
2              C:/Test_Software/6.avi                          10
3              C:/Test_Software/6.avi                          8
4              C:/Test_Software/6.avi                          6
5              C:/26.avi                                       10
6              C:/26.avi                                       8

RUN#1(增量)

    ID                    FILENAME                              LABEL_NUMBER
    ----------------------------------------------------------------------
    7              C:/Test_Software/36.avi                          51
    8              C:/Test_Software/556.avi                         30

我想运行如下的查询:

Select ID from tbl, If (ID not present in tbl_search) INSERT into tbl_search

奖金问题:在我分享的所有方法中,哪一种是我应该选择的最快最好的方法?请分享为什么和如何做,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我将自己回答这个问题,因为我现在做了足够的测试:

方法#1:SQL触发器

很好的方法,如果你没有循环来处理(嵌套循环) 痛苦的方法,如果你有一些万亿循环在一些东西可以被执行到表之前,因此,我不合格

方法#2:创建临时表

虽然这是一个很好的方法,但它不会给你任何性能提升  会有重复的效果。因此,不可取。

方法#3:使用ID

最好的方法是因为ID在表中被创建为唯一键,所以你可以简单地查询最后一个id,在某处存储id,然后比较从last_known id开始的另一个表。在这里获得了最佳的性能优势。

方法#4:创建另一个表 - 辅助表

Naah,浪费精力和资源。不推荐了。

希望这有助于SO老乡。

由于