Objective c 如何使用日期优化sqlite查询&;替代品?
我有一些sqlite查询正在减慢我的iPhone应用程序的速度 我在我的应用程序中重复了两种模式。第一个是substr:Objective c 如何使用日期优化sqlite查询&;替代品?,objective-c,iphone,performance,sqlite,Objective C,Iphone,Performance,Sqlite,我有一些sqlite查询正在减慢我的iPhone应用程序的速度 我在我的应用程序中重复了两种模式。第一个是substr: SELECT Id FROM [Table] WHERE UPPER(substr(Name,1,1))='A' ORDER BY Name" (这是字母表的市长级别。是联系人列表) 另一个是带有日期的复杂版本: SELECT Id,customerCode, case when DueDate>=datetime('now','-100 years') AND D
SELECT Id FROM [Table] WHERE UPPER(substr(Name,1,1))='A' ORDER BY Name"
(这是字母表的市长级别。是联系人列表)
另一个是带有日期的复杂版本:
SELECT Id,customerCode,
case
when DueDate>=datetime('now','-100 years') AND DueDate<=datetime('now','-1 days') then 'Past due'
when DueDate<datetime('now') then 'Today'
when DueDate>=datetime('now') AND DueDate<=datetime('now','15 days') then '15'
when DueDate>=datetime('now','16 days') AND DueDate<=datetime('now','30 days') then '30'
when DueDate>=datetime('now','31 days') AND DueDate<=datetime('now','45 days') then '45'
when DueDate>=datetime('now','46 days') AND DueDate<=datetime('now','60 days') then '60'
when DueDate>=datetime('now','61 days') AND DueDate<=datetime('now','90 days') then '90'
when DueDate>=datetime('now','91 days') then '> 90'
end As Key,
COUNT(*) As Total, TimeStamp
FROM debt
GROUP BY customerCode,
case
when DueDate>=datetime('now','-100 years') AND DueDate<=datetime('now','-1 days') then '-1'
when DueDate<datetime('now') then 'Today'
when DueDate>=datetime('now') AND DueDate<=datetime('now','15 days') then '15'
when DueDate>=datetime('now','16 days') AND DueDate<=datetime('now','30 days') then '30'
when DueDate>=datetime('now','31 days') AND DueDate<=datetime('now','45 days') then '45'
when DueDate>=datetime('now','46 days') AND DueDate<=datetime('now','60 days') then '60'
when DueDate>=datetime('now','61 days') AND DueDate<=datetime('now','90 days') then '90'
when DueDate>=datetime('now','91 days') then '> 90'
end
选择Id、客户代码、,
案例
当DueDate>=datetime('now','-100 years')、DueDate=datetime('now','-100 years')和DueDate时,我不知道性能比较如何,但有另一种编写第一个查询的方法
SELECT Id FROM [Table] WHERE Name LIKE "a%"
因为%匹配以a或a开头的任何字符串,后跟任意数量的字符
有关更多参考,请参阅
其次,我猜您在重复调用datetime时会受到性能影响。你能把它压缩成一个单一的数学运算,然后用简单的数学运算符比较几天内的差异吗?例如,自去年圣诞节以来的天数:
sqlite> select julianday('now') - julianday('2008-12-05');
212.743649386801
SQLite在内部以字符串的形式存储日期,因此每次调用datetime
时,它都必须完全解析日期字符串,等等。您不必重复该CASE
操作符两次——只需按客户代码分组,键就足够了。此外,正如@Mark所建议的,大小写
可能可以通过使用julianday中的差异来优化,而名称选择可以利用LIKE
默认情况下不区分大小写这一事实(只要您只需要ASCII字母——唉,sqlite中有一个记录在案的错误,即这种大小写不敏感在ASCII之外不能正常工作)。对于类似的查询,只需花费2秒。