SQLite 查询中的对数函数?

9 投票
5 回答
6113 浏览
提问于 2025-04-17 13:51

我真的需要对超过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
7

没有内置的对数函数;你需要自己定义一个函数。

如果你在使用Python,可以通过 pysqliteAPSW 这两个模块来实现。

撰写回答