在您将此问题标记为重复之前,请听我说!
我已经阅读过这里提出的关于如何提高性能的问题,例如,提一下提高SQLite的每秒INSERT性能?和什么是源码的非常大的数据库文件的性能特点?
我正在努力使sqlite工作的数据库文件大小为5千兆字节.相反,那里有人,即使数据库大小高达160 GB,他们声称sqlite对他们来说"很棒".我自己没有尝试过,但是从提出的问题来看,我想所有的基准测试都可能只用数据库中的表来完成.
我使用的数据库
- 20页左右的表
-表中有一半以上的15列
-每个15或那么列的表都有6/7的外键列-其中的几个表已经长大在一个月内拥有2700万条记录
我使用的开发机器是3 GHz四核机器,有4 GB RAM,但只需要3分钟就可以查询这些大表中的row_count.
我找不到任何方法来水平划分数据.我拥有的最佳镜头是将数据分成多个数据库文件,每个表一个.但在这种情况下,据我所知,外键列约束不能使用,所以我将不得不创建一个自足表(没有任何外键).
所以我的问题是
a)我是否使用错误的数据库进行工作?
b)你觉得我哪里出错了?
c)我还没有在外键上添加索引,但如果只是行计数查询需要四分钟,外键索引如何帮助我?
编辑提供更多信息,即使没有人要求它:)我使用SQLite版本3.7.9与system.data.sqlite.dll版本1.0.77.0
EDIT2:我认为我与160位演员的不同之处在于他们可以选择单独的唱片或小范围的唱片.但是我必须在表中加载所有2700万行,将它们与另一个表连接起来,按照用户的要求对记录进行分组并返回结果.有什么输入是为这些结果优化数据库的最佳方法.
我不能缓存先前查询的结果,因为它在我的情况下没有意义.点击缓存的可能性相当低.
我有一个包含数千个单独插入语句的.sql文件.这一切都需要永远.我试图找到一种更有效地做到这一点的方法.在python中,sqlite3库不能执行".read"或".import"之类的操作,但executecript对于那么多插入来说太慢了.
我安装了sqlite3.exe shell,希望使用".read"或".import"但我无法弄清楚如何使用它.在eclipse中通过django运行它不起作用,因为它期望数据库位于我的C驱动器的根目录,这似乎很愚蠢.通过命令行运行它不起作用,因为它找不到我的数据库文件(除非我做错了)
有小费吗?
谢谢!
即使对于事务,我也遇到了sqlite插入性能问题.我的Android应用程序从Web服务接收大约23.000行,我必须将它们插入到单个表中.
对Web服务进行分区,以便在每次向WS发出请求时收到大约2000行,并在事务中包装2000个插入.完成这些插入后,我将新请求发送到WS并再次使用新事务处理新的2000行.
一开始它工作正常.它每秒执行大量插入操作.但随着时间的推移变得越来越慢,最终每秒有4或3次插入,直到完成23000行.
表的大小有问题吗?当它变大时,插入变慢了?有没有办法改善大量数据的性能?
谢谢你的帮助.
我的问题直接来自这个问题,虽然我只对UPDATE感兴趣并且只对此感兴趣.
我有编写的应用程序中C/C++,这使得大量使用的SQLite,主要是SELECT/UPDATE,在一个非常频繁间隔(约20个查询每0.5至1秒)
我的数据库不大,此刻约有2500条记录,这里是表结构:
CREATE TABLE player (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(64) UNIQUE,
stats VARBINARY,
rules VARBINARY
);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我没有使用,transactions因为我正在改进代码并希望稳定而不是性能.
然后我通过仅执行10 update查询来测量我的数据库性能,以下(在不同值的循环中):
// 10 times execution of this
UPDATE player SET stats = ? WHERE (name = ?)
Run Code Online (Sandbox Code Playgroud)
其中stats一个JSON恰好是150个字符,name是5-10个字符.
没有交易,结果是不可接受的: - 大约1整秒(每个0.096)
随着交易,时间下降x7.5倍: - 约0.11 - 0.16秒(每个0.013)
我尝试删除数据库的大部分和/或重新排序/删除列,以查看是否有任何改变,但事实并非如此.即使数据库只包含100条记录(已测试),我也会得到上述数字.
然后我试着玩PRAGMA选项:
PRAGMA synchronous = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我在 R 中生成的向量作为新列添加到 sqlite 表中。为此,我想使用dplyr(dbplyr根据此处的这篇文章,我安装了最新的开发版本以及软件包)。我试过的:
library(dplyr)
library(DBI)
#creating initial database and table
dbcon <- dbConnect(RSQLite::SQLite(), "cars.db")
dbWriteTable(dbcon, name = "cars", value = cars)
cars_tbl <- dplyr::tbl(dbcon, "cars")
#new values which I want to add as a new column
new_values <- sample(c("A","B","C"), nrow(cars), replace = TRUE)
#attempt to add new values as column to the table in the database
cars_tbl %>% mutate(new_col = new_values) #not working
Run Code Online (Sandbox Code Playgroud)
实现这一目标的简单方法是什么(不一定使用 dplyr)?
我必须为大学编写一个非常简单的控制台程序,它必须测量输入所需的时间.
因此我clock()在前面和fgets()通话后使用.在我的Windows计算机上运行时,它工作得很好.然而,当我在我的朋友Mac-Book和Linux-PC上运行时,它给出了非常小的结果(只有几微秒的时间).
我在所有3 OS上尝试了以下代码:
#include <stdio.h>
#include <time.h>
#include <unistd.h>
void main()
{
clock_t t;
printf("Sleeping for a bit\n");
t = clock();
// Alternatively some fgets(...)
usleep(999999);
t = clock() - t;
printf("Processor time spent: %lf", ((double)t) / CLOCKS_PER_SEC);
}
Run Code Online (Sandbox Code Playgroud)
在Windows上,输出显示1秒(或使用时键入的时间fgets),另外两个操作系统显示的时间不超过0秒.
现在我的问题是为什么clock()在这些操作系统的实现上存在这样的差异.对于Windows来说,当线程处于休眠/等待状态时,时钟似乎仍在滴答作响,但对于Linux和Mac则不然?
编辑:感谢你们到目前为止的答案,所以这只是微软的错误实现.
有人可以回答我的上一个问题:
还有一种方法可以测量我想要使用C标准库在所有3个系统上测量的内容,因为它clock()似乎只在Windows上以这种方式工作吗?
foreach (var tour in Tours)
{
await DbInstance.InsertOrReplaceAsync(tour.Guide);
await DbInstance.InsertOrReplaceAsync(tour.Client);
}
Run Code Online (Sandbox Code Playgroud)
这个块需要6秒才能执行!?
我的旅游列表中只有 10 个旅游,而且数据库架构非常简单。这里有什么问题?
编辑(解决方案):
为了加快速度,请像这样包装多个事务:
await DbInstance.RunInTransactionAsync(connection =>
{
**YOUR FOR LOOP**
//example
connection.InsertAsync(tour.Guide);
});
Run Code Online (Sandbox Code Playgroud) 我有一个相对简单的例程,它查看媒体文件的数据库条目,计算宽度、高度和文件大小,并将它们写回到数据库中。
数据库是 SQLite,使用 System.Data.SQLite 库,处理约 4000 行。我将所有行加载到 ADO 表中,使用新值更新行/列,然后运行 adapter.Update(table); 在上面。
从数据库表加载数据集大约需要半秒,更新所有行的图像宽度/高度并从 FileInfo 获取文件长度可能需要 30 秒。美好的。
适配器.Update(表); 命令在附近某处运行需要 5 到 7 分钟。
这似乎太过分了。ID 是一个 PK INTEGER,因此 - 根据 SQLite 的文档,它本质上是索引的,但即便如此,我还是忍不住想,如果我为每个单独的更新运行单独的更新命令,这会完成得更快。
我曾认为 ADO/适配器的级别相对较低(无论如何与 ORM 相比),这种糟糕的性能让我感到惊讶。谁能解释一下为什么根据本地放置的 SQLite 数据库更新一批约 4000 条记录需要 5-7 分钟?
顺便说一句,是否有某种方法可以“窥视”ADO 如何处理这个问题?内部库逐步执行或...?
谢谢
public static int FillMediaSizes() {
// returns the count of records updated
int recordsAffected = 0;
DataTable table = new DataTable();
SQLiteDataAdapter adapter = new SQLiteDataAdapter();
using (SQLiteConnection conn = new SQLiteConnection(Globals.Config.dbAppNameConnectionString))
using (SQLiteCommand cmdSelect = new …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个数据库,我可以运行SQL语句而无需安装数据库服务器.即我只需要数据库文件和任何外部库就能选择/插入/更新数据库.
这是我的情况:
这是我的要求:
我相信这可以使用ADO或JET等MS Access*.mdb文件,但是,我想听听一些替代方案.请在答案中提供数据库和C++引擎/库.
我的优先事项是:
谢谢你们.
我正在开发一个用 C 编写的项目,该项目生成近 350k 的序列并保存在 sqlite 数据库中。对于每个序列,我必须在表中插入(或忽略)一个字符串,并更新其他表中的一行。
我尝试了这个“指南”,但无法达到每秒超过 30k 操作。
我正在使用每个 1M 操作的事务(插入和更新)并且 PRAGMA synchronous=OFF
我有什么选择来解决这个瓶颈?