【问题标题】:Optimizing SQLite query to use one query优化 SQLite 查询以使用一个查询
【发布时间】:2014-09-09 07:11:44
【问题描述】:

问题描述

我正在编写使用数据库的应用程序,它从数据库中选择一些数据并在列表视图中将其显示给用户。从数据库中选择项目时,我必须遵守一些标准。

  1. 在数据库中,我保留一些位置(纬度和经度),选择物品时,我必须将我当前的位置和订单项目从近距离放到更远的地方。
  2. 在我的数据库中,我有 TOP 公司,这些公司必须始终排在列表的首位,与它们的位置(纬度和经度)无关

问题

所以我需要一些查询,它会一次以正确的顺序选择所有这些信息,因为目前我正在使用 3 个查询来做到这一点。

当前解决方案

这里是我用来选择我需要的所有信息的查询,目前我选择所有项目将它们添加到数组中,然后才根据距离在数组中对它们进行排序。

  1. 选择顶级公司

     select CompanyInfo._id, CompanyInfo.name_en, ContactInfo.telephones, ContactInfo.location, CompanyInfo.websites, ContactInfo.address_en, ContactInfo.location, ContactInfo.position, TopFirmsByCode.Level, ContactInfo.name_en from CompanyInfo, ContactInfo, TopFirmsByCode where CompanyInfo._id=TopFirmsByCode.RegNo AND CompanyInfo._id=ContactInfo._id AND TopFirmsByCode.Code = 452 order by TopFirmsByCode.Level ASC, CompanyInfo.rating_ordering_en ASC`
    
  2. 选择按距离排序的其余公司

     select CompanyInfo._id, CompanyInfo.name_en, ContactInfo.telephones,ContactInfo.location,CompanyInfo.websites,ContactInfo.address_en,ContactInfo.location, ContactInfo.position, ContactInfo.name_en from CompanyInfo, ContactInfo where CompanyInfo._id=ContactInfo._id AND CompanyInfo.category_codes LIKE %547% order by ContactInfo.location ASC
    

【问题讨论】:

  • 分析器显示什么?这真的是你的瓶颈所在吗?
  • @hd1 第一次显示项目需要近 7 秒,然后需要近 2 秒...,有时结果数超过 1000 我的应用程序崩溃:( 你能建议有什么办法解决这个问题?
  • @hd1 查询不像迭代结果集(并且可能对它们进行排序)以组成最终结果集那样成为瓶颈。构建一个按您想要的顺序返回您想要的结果的查询可以完全消除这种情况。
  • 是的,确实如此,但有更简单的方法可以实现这一点。我试图让 OP 想出一个比让他的 SQL 更复杂更直接的解决方案。
  • 通过the Android profiler运行你的代码,看看你的瓶颈在哪里,首先优化最高权重的代码。

标签: java android performance sqlite


【解决方案1】:

试试这个:

select CompanyInfo._id, CompanyInfo.name_en, ContactInfo.telephones, 
    ContactInfo.location, CompanyInfo.websites, ContactInfo.address_en,
    ContactInfo.position, ContactInfo.name_en, TopFirmsByCode.Level,
    (case when TopFirmsByCode.Code = 452 then 1 else 0 end) as isTopFirm
from CompanyInfo
join ContactInfo on (CompanyInfo._id=ContactInfo._id)
join TopFirmsByCode on (CompanyInfo._id=TopFirmsByCode.RegNo)  
where (TopFirmsByCode.Code=452 OR CompanyInfo.category_codes LIKE %547%)
order by isTopFirm DESC, TopFirmsByCode.Level ASC, CompanyInfo.rating_ordering_en ASC

【讨论】:

  • 这里的语法有问题(case when TopFirmsByCode.Code = 452 then 1 else 0) as isTopFirm 因为我不是原生的 SQL 查询,你能帮我纠正你的答案吗?
  • Error: near ")": syntax error <select CompanyInfo._id,
  • 好的,我发现你忘了把 END 放在 AS 之前,谢谢
  • 对不起,我会修复帖子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多