微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

选择查询以选择表中的连续行多次

如何解决选择查询以选择表中的连续行多次

我有多个表,并且在Android Room数据库中的每个表中都有超过10万条记录,并且使用MVVM模式。

每个表都有两列,一个id(主键)和一个String列。

要求:以多个间隔选择连续的行,其中间隔长度已为已知。

说明:由于某些后台计算,假设我有一个200的间隔,其中间隔从300开始,以500结尾。我需要在每2K条记录通过之后选择这200(500-300 = 200)行桌子。因此,在这种情况下,查询应在下面编写的模式中选择200行

前2K条记录的行从300到500,

第二个2K记录的行从2300到2500,

在第2个2K记录中,行从4300到4500开始

直到表末尾。

目前,由于我知道间隔,因此我正在像这样安排查询

s1和e1是300和500,

s2和e2是2300和2500,

s3和e3是4300和4500,依此类推

 @Query("SELECT * FROM CATEGORY_TABLE WHERE (id BETWEEN :s1 AND :e1 ) OR (id BETWEEN :s2 AND :e2 ) OR (id BETWEEN :s3 AND :e3 ) OR (id BETWEEN :s4 AND :e4 ) OR (id BETWEEN :s5 AND :e5 ) " +
            "OR (id BETWEEN :s6 AND :e6 ) OR (id BETWEEN :s7 AND :e7 ) OR (id BETWEEN :s8 AND :e8 ) OR (id BETWEEN :s9 AND :e9 ) OR (id BETWEEN :s10 AND :e10 ) OR" +
            " (id BETWEEN :s11 AND :e11 ) OR (id BETWEEN :s12 AND :e12 ) OR (id BETWEEN :s13 AND :e13 ) OR (id BETWEEN :s14 AND :e14 ) OR (id BETWEEN :s15 AND :e15 ) OR " +
            "(id BETWEEN :s16 AND :e16 ) OR (id BETWEEN :s17 AND :e17 ) OR (id BETWEEN :s18 AND :e18 ) OR (id BETWEEN :s19 AND :e19 ) OR (id BETWEEN :s20 AND :e20 ) OR " +
            "(id BETWEEN :s21 AND :e21 ) OR (id BETWEEN :s22 AND :e22 ) OR (id BETWEEN :s23 AND :e23 ) OR (id BETWEEN :s24 AND :e24 ) OR (id BETWEEN :s25 AND :e25 ) OR " +
            "(id BETWEEN :s26 AND :e26 ) OR (id BETWEEN :s27 AND :e27 ) OR (id BETWEEN :s28 AND :e28 ) OR (id BETWEEN :s29 AND :e29 ) OR (id BETWEEN :s30 AND :e30 ) OR " +
            "(id BETWEEN :s31 AND :e31 ) OR (id BETWEEN :s32 AND :e32 ) OR (id BETWEEN :s33 AND :e33 ) OR (id BETWEEN :s34 AND :e34 ) OR (id BETWEEN :s35 AND :e35 ) OR " +
            "(id BETWEEN :s36 AND :e36 ) OR (id BETWEEN :s37 AND :e37 ) OR (id BETWEEN :s38 AND :e38 ) OR (id BETWEEN :s39 AND :e39 ) OR (id BETWEEN :s40 AND :e40 )"+ 
"(id BETWEEN :s41 AND :e41 ) OR (id BETWEEN :s42 AND :e42 ) OR (id BETWEEN :s43 AND :e43 ) OR (id BETWEEN :s44 AND :e44 ) OR (id BETWEEN :s45 AND :e45 ) OR " +
 "(id BETWEEN :s46 AND :e46 ) OR (id BETWEEN :s47 AND :e47 ) OR (id BETWEEN :s48 AND :e48 ) OR (id BETWEEN :s49 AND :e49 ) OR (id BETWEEN :s50 AND :e50 )");
    List<Category> getCategorySpecificRows(int s1,int e1,int s2,int e2,int s3,int e3,int s4,int e4,int s5,int e5,int s6,int e6,int s7,int e7,int s8,int e8,int s9,int e9,int s10,int e10,int s11,int e11,int s12,int e12,int s13,int e13,int s14,int e14,int s15,int e15,int s16,int e16,int s17,int e17,int s18,int e18,int s19,int e19,int s20,int e20,int s21,int e21,int s22,int e22,int s23,int e23,int s24,int e24,int s25,int e25,int s26,int e26,int s27,int e27,int s28,int e28,int s29,int e29,int s30,int e30,int s31,int e31,int s32,int e32,int s33,int e33,int s34,int e34,int s35,int e35,int s36,int e36,int s37,int e37,int s38,int e38,int s39,int e39,int s40,int e40,int s41,int e41,int s42,int e42,int s43,int e43,int e44,int s45,int e45,int s46,int e46,int s47,int e47,int s48,int e48,int s49,int e49,int s50,int e50);

并使用此BETWEEN 50次来遍历100K个记录表。它可以正常工作,但性能不佳。大约500毫秒-1500毫秒将这些数据发送回存储库。为了使此数据获取时间效率更高,编写此查询的更好方法应该是什么。

解决方法

第一个2K记录的行从300到500开始,第二个2K记录的行从2300到2500,第三个2K记录的行从4300到4500开始,同样直到表结尾。

您可以使用人工关节!模块在这里很方便:

Item.find().populate('brandId');

这使查询的编写更短,但是效率可能仍然是一个问题。无论如何,每2000行要选择300行就可能需要进行全面扫描。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。