SQLite 查询中的对数函数?
我真的需要对超过40万行的数据进行一次更新
,而且还要用到对数函数。可惜的是,sqlite里似乎没有SQL的对数函数。我想知道有没有办法自己算出对数函数或者导入LOG
函数。
我知道的另一种方法是通过Python来实现,但这个方法的效率很低,复杂度是O(n^2)。这样做会花费太多时间(我试过,结果在我那台慢电脑上处理6%就花了大约1.5小时)。
补充:
我还发现了为什么会花那么长时间。数据库里的主键没有标记为主键。所以我用的代码是:
for row in database:
...calculations for the row...
...sql update for the specific row which follows:...
for search_row in database:
if search_row[id] = row[id]:
...update values here...
效率极低... O(n^2)
5 个回答
1
你为什么觉得它会是 O(n^2)
呢?其实应该是线性的:O(n)
。
如果你使用自动提交模式,几乎就是唯一导致它这么慢的原因——这样会让SQLite在每次更新时都把数据写入磁盘。
如果你先开始一个事务,然后在里面进行选择和更新,最后再提交,这样你的更新应该会非常快(前提是你的对数函数不是特别慢)。
4
其实,数学函数(包括对数函数)在Sqlite中是有实现的,但在Ubuntu的标准Sqlite版本中是禁用的。如果你想启用这些功能,你需要从这里下载Sqlite的源代码(找到“获取代码”),然后按照说明进行编译(找到“编译”)。在编译时,必要的选项-DSQLITE_ENABLE_MATH_FUNCTIONS会默认启用。编译完成后,你会在构建目录中得到一个sqlite3
的可执行文件,你需要将它作为本地文件运行:
$ ./sqlite3 <database-file>
在编译之前,我建议你先安装readline
,这样在Sqlite命令行中使用历史记录浏览(用箭头键)和自动补全功能时才能正常工作。
sudo apt install libreadline-dev