我想对大尺寸(200 MB以上)的Sqlite文件进行一些测试。我有一些相对较小的文件(10MB),但我想测试较大的文件。
有没有什么快速的方法/工具可以通过复制这些Sqlite文件表中的数据来增加它们的大小?
或者,有没有任何网站可以免费为我提供巨大的Sqlite文件供下载?
谢谢。
如果你想测试大型数据库,你可以生成并插入假数据。有像Bogus这样的工具可以帮助你。
这里有一个c#中的例子,它创建了一个带有Orders表的数据库,并使用false生成1000万个订单:
using Bogus;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BogusSample
{
public class Order
{
public int OrderId { get; set; }
public int CustomerId { get; set; }
public int EmployeeId { get; set; }
public DateTime OrderDate { get; set; }
public Decimal OrderTotal { get; set; }
}
class Program
{
static void Main(string[] args)
{
var watch = Stopwatch.StartNew();
int tenMillion = 10 * 1000 * 1000;
int orderId = 1;
var orderFaker = new Faker<Order>()
.StrictMode(true)
.RuleFor(x => x.OrderId, f => orderId++)
.RuleFor(x => x.CustomerId, f => f.Random.Number(1, 2000))
.RuleFor(x => x.EmployeeId, f => f.Random.Number(1, 100))
.RuleFor(x => x.OrderDate, f => f.Date.Recent(400))
.RuleFor(x => x.OrderTotal, f => f.Finance.Amount(10, 1000, 2));
using (var cn = RecreateDatabase())
using (var cmd = CreateInsertCommand(cn))
using (var tx = cn.BeginTransaction())
{
foreach (Order fakeOrder in orderFaker.Generate(tenMillion))
{
cmd.Parameters["@OrderId"].Value = fakeOrder.OrderId;
cmd.Parameters["@CustomerId"].Value = fakeOrder.CustomerId;
cmd.Parameters["@EmployeeId"].Value = fakeOrder.EmployeeId;
cmd.Parameters["@OrderDate"].Value = fakeOrder.OrderDate;
cmd.Parameters["@OrderTotal"].Value = fakeOrder.OrderTotal;
cmd.ExecuteNonQuery();
}
tx.Commit();
}
Console.WriteLine("Elapsed Time: {0}", watch.Elapsed);
}
static SQLiteCommand CreateInsertCommand(SQLiteConnection cn)
{
var insertCommandText = @"
INSERT INTO Orders VALUES(@OrderId, @CustomerId, @EmployeeId, @OrderDate, @OrderTotal)
";
var cmd = new SQLiteCommand(insertCommandText, cn);
cmd.Parameters.Add("@OrderId", DbType.Int32);
cmd.Parameters.Add("@CustomerId", DbType.Int32);
cmd.Parameters.Add("@EmployeeId", DbType.Int32);
cmd.Parameters.Add("@OrderDate", DbType.DateTime);
cmd.Parameters.Add("@OrderTotal", DbType.Decimal);
return cmd;
}
static SQLiteConnection RecreateDatabase()
{
var dataBasePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Orders.db");
if (File.Exists(dataBasePath)) File.Delete(dataBasePath);
var cn = new SQLiteConnection(string.Format("Data Source="{0}"", dataBasePath));
var createTableCommandText = @"
CREATE TABLE orders
(
OrderId INTEGER PRIMARY KEY,
CustomerId INT NOT NULL,
EmployeeId INT NOT NULL,
OrderDate DATETIME NOT NULL,
OrderTotal NUMERIC(19, 2)
)
";
using (var cmd = new SQLiteCommand(createTableCommandText, cn))
{
cn.Open();
cmd.ExecuteNonQuery();
}
return cn;
}
}
}
在我的笔记本电脑中插入这些行大约花了30分钟(每秒5500行)。数据库文件大小约为512 Mb。
您可以在不使用任何外部工具的情况下创建大型交叉产品。这是16行的示例:
CREATE TABLE DIGITS (D INTEGER);
INSERT INTO DIGITS VALUES (0);
INSERT INTO DIGITS VALUES (1);
CREATE TABLE PROD (A INTEGER, B INTEGER, C INTEGER, D INTEGER);
INSERT INTO PROD SELECT d1.D, d2.D, d3.D, d4.D FROM DIGITS d1, DIGITS d2, DIGITS d3, DIGITS d4;
您应该更改prod表中的列数,以适应所需的表大小。
要复制表中的所有数据,请将其所有数据插入自身:
INSERT INTO MyTable(a, b, c) SELECT a, b, c FROM MyTable;
如果您有一个自动递增的ID,只需将其排除在列列表之外即可自动获取新值。如果您有其他主键,则必须通过适当地修改原始值来强制它获得唯一值,例如:
INSERT INTO MyTable(id, b, c) SELECT id + 1000000, b, c FROM MyTable;