如何将sqlite数据库文件的大小增加一倍



我想对大尺寸(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;

最新更新