SQLite 分析 (sqlite_stat4)。System.Data.SQLite 与 Microsoft.Data.Sqlite

SQLite Analyze (sqlite_stat4). System.Data.SQLite vs Microsoft.Data.Sqlite

提问人:Max.Lesnov 提问时间:11/17/2023 更新时间:11/18/2023 访问量:33

问:

我正在尝试执行 Sqlite 的命令。 但它仅适用于 . 它不适用于版本,没有错误,没有异常,只是什么也没发生。ANALYZESystem.Data.SQLiteMicrosoft.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 创建示例。

SQLite 实体框架 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选项(((( 谢谢你的帮助。