sqliteentity-frameworksystem.data.sqlitemicrosoft.data.sqlite

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


I am trying to execute ANALYZE command for Sqlite. But it works only for System.Data.SQLite. It does not work for Microsoft.Data.Sqlite version, no errors, no exceptions, just nothing happens.

When you execute ANALYZE - new system table will be created sqlite_stat4. It helps SQLite to optimize the query plan. https://www.sqlite.org/lang_analyze.html

How to make it work for 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};";
        }
    }

I create example with System.Data.SQLite and Microsoft.Data.Sqlite.


Solution

  • The sqlite_stat4 table is only created by ANALYZE and used by the query planner if the version of sqlite being used was compiled with the SQLITE_ENABLE_STAT4 option defined. It defaults to not being enabled.

    The two C# libraries you're testing likely include two different versions of sqlite built with different options.

    You should still be seeing a sqlite_stat1 table after running ANALYZE with both; it just has less detailed statistics about table contents than you get with stat4.