提问人:Max.Lesnov 提问时间:11/17/2023 更新时间:11/18/2023 访问量:33
SQLite 分析 (sqlite_stat4)。System.Data.SQLite 与 Microsoft.Data.Sqlite
SQLite Analyze (sqlite_stat4). System.Data.SQLite vs Microsoft.Data.Sqlite
问:
我正在尝试执行 Sqlite 的命令。
但它仅适用于 .
它不适用于版本,没有错误,没有异常,只是什么也没发生。ANALYZE
System.Data.SQLite
Microsoft.Data.Sqlite
当您执行 ANALYZE 时 - 将创建新的系统表。
它帮助SQLite优化查询计划。https://www.sqlite.org/lang_analyze.htmlsqlite_stat4
如何使其适用于EntityFramework/Microsoft.Data.Sqlite?
// .NET 6
public class Program
{
public static void Main(string[] args)
{
SystemDataSQLite();
MicrosoftDataSqlite();
Console.WriteLine("End...");
Console.ReadLine();
}
private static void SystemDataSQLite()
{
// System.Data.SQLite version 1.0.118
string connectionString = PrepareNewDbConnectionString("SystemDataSQLite.db");
using SQLiteConnection connection = new SQLiteConnection(connectionString);
connection.Open();
using var command = connection.CreateCommand();
command.CommandText = "ANALYZE";
command.ExecuteNonQuery();
}
private static void MicrosoftDataSqlite()
{
// Microsoft.Data.Sqlite version 6.0.25
string connectionString = PrepareNewDbConnectionString("MicrosoftDataSqlite.db");
using SqliteConnection connection = new SqliteConnection(connectionString);
connection.Open();
using var command = connection.CreateCommand();
command.CommandText = "ANALYZE";
command.ExecuteNonQuery();
}
private static string PrepareNewDbConnectionString(string dbFile)
{
string baseDir = AppDomain.CurrentDomain.BaseDirectory;
var dir = Directory.CreateDirectory(baseDir + "db");
string filePath = dir.FullName + "\\" + dbFile;
if (File.Exists(filePath))
{
File.Delete(filePath);
}
return $@"Data Source={filePath};";
}
}
我使用 System.Data.SQLite 和 Microsoft.Data.Sqlite 创建示例。
答:
0赞
Shawn
11/18/2023
#1
仅当所使用的 sqlite 版本是使用定义的 SQLITE_ENABLE_STAT4
选项编译时,查询规划器才会创建并使用 sqlite_stat4
表。默认为未启用。ANALYZE
您正在测试的两个 C# 库可能包括使用不同选项构建的两个不同版本的 sqlite。
在同时运行两者后,您仍然应该看到一个sqlite_stat1
表;与使用 stat4 相比,它提供的关于表内容的详细统计信息更少。ANALYZE
评论
0赞
Max.Lesnov
11/18/2023
谢谢。是的,我看到了 stat1 表。我使用了命令 PRAGMA compile_options;在两个输出数据库文件(系统和 Microsoft)中。我看到ENABLE_STAT4已启用,并且两个列表相同。即使我使用“系统”连接到由“Microsoft”建立的数据库并执行 ANALYZE - 将创建 stat4 表。有趣的是,如果我使用“Microsoft”执行“ANALYZE blabla”,我将收到错误“blabla表不存在”。
0赞
Shawn
11/18/2023
在两个输出数据库文件中都使用了命令 PRAGMA compile_options;数据库无关紧要,sqlite库的版本很重要。您是否使用两个不同的库检查 C# 程序中的选项,或者在其他一些工具中检查选项(其中选项将是该工具的 sqlite 版本构建时使用的任何版本)?
0赞
Max.Lesnov
11/18/2023
是的,你是对的。我正在使用DB Browser for SQLite版本3.12.2。现在,我使用每个库测试了此命令以查看列表。Microsoft lib 没有ENABLE_STAT4选项(((( 谢谢你的帮助。
评论