我对这个问题有两个部分,如果你能回答,我会得到奖金。
问题#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
奖金问题:在我分享的所有方法中,哪一种是我应该选择的最快最好的方法?请分享为什么和如何做,我将不胜感激。
答案 0 :(得分:0)
我将自己回答这个问题,因为我现在做了足够的测试:
方法#1:SQL触发器
很好的方法,如果你没有循环来处理(嵌套循环) 痛苦的方法,如果你有一些万亿循环在一些东西可以被执行到表之前,因此,我不合格
方法#2:创建临时表
虽然这是一个很好的方法,但它不会给你任何性能提升 会有重复的效果。因此,不可取。
方法#3:使用ID
最好的方法是因为ID在表中被创建为唯一键,所以你可以简单地查询最后一个id,在某处存储id,然后比较从last_known id开始的另一个表。在这里获得了最佳的性能优势。
方法#4:创建另一个表 - 辅助表
Naah,浪费精力和资源。不推荐了。
希望这有助于SO老乡。
由于