我真的需要使用对数函数对超过400,000行执行update。不幸的是,SQL对数函数似乎不存在于sqlite中。有没有什么方法可以导出对数函数或导入LOG函数?
我知道的唯一的另一种方法是通过python命令O(n^2)。这种方法会花费太长的时间(我试过了,在我速度很慢的电脑上花了大约1.5个小时才通过6% )。
编辑:
我还发现了为什么花了这么长时间。数据库中的主键未标记为主键。所以我使用的代码如下:
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)
发布于 2013-01-28 04:41:10
没有内置的对数函数;您必须定义自己的函数。
如果您使用的是Python,则可以使用pysqlite和APSW模块。
发布于 2021-01-05 20:03:00
原来数学函数(包括对数)是在Sqlite中实现的,但在Ubuntu上的标准Sqlite编译中是禁用的。为了启用它们,您应该下载Sqlite源代码from here (“获取代码”),并按照说明进行编译(“编译”)。默认情况下,将启用必要的选项-DSQLITE_ENABLE_MATH_FUNCTIONS。编译后,您将在build目录中获得sqlite3可执行文件,该文件应作为本地文件运行:
$ ./sqlite3 <database-file>在编译之前,我建议安装readline,这样历史记录浏览(箭头)和自动完成就可以在Sqlite命令行中正常工作了。
sudo apt install libreadline-dev发布于 2013-01-28 04:44:35
是什么让你认为它会是O(n^2)?如果说有什么区别的话,那就是它应该是线性的:O(n)。
如果你使用自动提交模式,那么它会如此慢的唯一原因就是--这会导致SQLite在每次更新时都会将缓冲区刷新到磁盘。
如果您启动事务,然后使用SELECT / UPDATE循环,最后提交,您的更新应该非常快(假设您的对数函数不是很慢)。
https://stackoverflow.com/questions/14551884
复制相似问题