uwekeim icon

Performance MDB vs SQLite vs MS SQL CE vs MS SQL vs VistaDB

uwekeim | PRO | 02/05/16 12:32:12 PM UTC | 0 ⭐ | 996 👁️ | Never ⏰ | []
C# |

10.35 KB

|

None

|

0 👍

/

0 👎

#define KEEP_CONNECTION_OPEN
 
namespace PerformanceMdbVsSqlCe
{
    using System;
    using System.Data;
    using System.Data.OleDb;
    using System.Data.SqlClient;
    using System.Data.SqlServerCe;
    using System.Data.SQLite;
    using System.Diagnostics;
    using VistaDB.Provider;
 
    /*
    Performance comparisons (maybe somewhat naive) between:
 
        - SQL Server Express 2014 on the same local PC and local SSD drive as the test application.
        - SQL Server Express 2014 on a server in a gigabit LAN.
        - SQL Server Compact (CE) on the same local PC and local SSD drive as the test application.
        - Microsoft Access MDB/Jet on the same local PC and local SSD drive as the test application.
        - Microsoft SQLite on the same local PC and local SSD drive as the test application.
        - Microsoft VistaDB 5 on the same local PC and local SSD drive as the test application.
 
    See also:
 
        - http://pastebin.com/edit/NNJni52W - This file on Pastebin.
        - http://stackoverflow.com/a/35225563/107625 - My question/answer on Stack Overflow.
        - http://entwicklergate.de/t/125 - Posting in my German developer community.
 
        - http://uwe.co - My personal weblog :-)
    */
 
    internal static class Program
    {
        private const string Folder = @"C:\Users\ukeim\Dropbox\Beruf\Prog\PerformanceMdbVsSqlCe\PerformanceMdbVsSqlCe";
 
        private static readonly string SqlCeConnectionString = $@"DataSource=""{Folder}\test.sdf""";
        private static readonly string SqlServerLocaleConnectionString = $@"Server=W8-UWEKEIM\SQLEXPRESS2014;Database=Test;Integrated Security=True;";
        private static readonly string SqlServerNetworkConnectionString = $@"Server=ZETAS23\SQLEXPRESS2014;Database=Test;Integrated Security=True;";
        private static readonly string VistaDBConnectionString = $@"Data Source={Folder}\test.vdb5";
        private static readonly string SqliteConnectionString = $@"Data Source={Folder}\test.db";
 
        private static readonly string MdbConnectionString =
            $@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""{Folder}\test.mdb""";
 
        private static int _counter;
 
        private static void Main()
        {
#if KEEP_CONNECTION_OPEN
            connSqlCe.Open();
            connSqlLocale.Open();
            sqlNetworkConn.Open();
            mdbConn.Open();
            sqliteConn.Open();
            vistaDBConn.Open();
#endif
            /*
            File.Delete($@"{Folder}\test.sdf");
 
            createSqlCeDB();
            executeSqlCe(
                @"CREATE TABLE [Tabelle1] (
                    [ID] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
                    Name1 NVARCHAR(255),
                    Wert1 [int]
                )");
            */
 
            //executeSqlite(
            //    @"CREATE TABLE [Tabelle1] (
            //        [ID] INTEGER PRIMARY KEY AUTOINCREMENT,
            //        Name1 NVARCHAR(255),
            //        Wert1 [int]
            //    )");
 
            test1(1, @"DELETE FROM Tabelle1");
 
            test1(1, @"INSERT INTO Tabelle1 (Name1, Wert1) VALUES ({LOOPCTR}, '{LOOPCTR}')");
            test1(10, @"INSERT INTO Tabelle1 (Name1, Wert1) VALUES ({LOOPCTR}, '{LOOPCTR}')");
            test1(100, @"INSERT INTO Tabelle1 (Name1, Wert1) VALUES ({LOOPCTR}, '{LOOPCTR}')");
            test1(1000, @"INSERT INTO Tabelle1 (Name1, Wert1) VALUES ({LOOPCTR}, '{LOOPCTR}')");
 
            test1(1, @"SELECT * FROM Tabelle1");
            test1(10, @"SELECT * FROM Tabelle1");
            test1(100, @"SELECT * FROM Tabelle1");
            test1(1000, @"SELECT * FROM Tabelle1");
 
            test1(1, @"SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID ORDER BY a.ID");
            test1(10, @"SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID ORDER BY a.ID");
            test1(100, @"SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID ORDER BY a.ID");
            test1(1000, @"SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID ORDER BY a.ID");
 
            test1(1,
                @"SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID WHERE a.ID < 100 OR a.ID > 300 ORDER BY a.ID");
            test1(10,
                @"SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID WHERE a.ID < 100 OR a.ID > 300 ORDER BY a.ID");
            test1(100,
                @"SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID WHERE a.ID < 100 OR a.ID > 300 ORDER BY a.ID");
            test1(1000,
                @"SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID WHERE a.ID < 100 OR a.ID > 300 ORDER BY a.ID");
        }
 
        private static void test1(int rowCount, string sql)
        {
            var sw = new Stopwatch();
 
            // --
 
#if KEEP_CONNECTION_OPEN
            const string keep = @"keeping connection open";
#else
            const string keep = @"Closing connections";
#endif
 
            Console.WriteLine(@"{0}.: {1} x {2} ({3}):", ++_counter, rowCount, sql, keep);
 
            // --
 
            sw.Start();
            for (var i = 0; i < rowCount; i++)
            {
                executeSqlServerLocale(sql.Replace(@"{LOOPCTR}", i.ToString()));
            }
            sw.Stop();
 
            Console.WriteLine(@"- SQL Express local : {0}", sw.Elapsed);
 
            // --
 
            sw.Start();
            for (var i = 0; i < rowCount; i++)
            {
                executeSqlServerNetwork(sql.Replace(@"{LOOPCTR}", i.ToString()));
            }
            sw.Stop();
 
            Console.WriteLine(@"- SQL Express remote: {0}", sw.Elapsed);
 
            // --
 
            sw.Start();
            for (var i = 0; i < rowCount; i++)
            {
                executeSqlCe(sql.Replace(@"{LOOPCTR}", i.ToString()));
            }
            sw.Stop();
 
            Console.WriteLine(@"- SQL CE            : {0}", sw.Elapsed);
 
            // --
 
            sw.Start();
            for (var i = 0; i < rowCount; i++)
            {
                executeMdb(sql.Replace(@"{LOOPCTR}", i.ToString()));
            }
            sw.Stop();
 
            Console.WriteLine(@"- MS Access         : {0}", sw.Elapsed);
 
            // --
 
            sw.Start();
            for (var i = 0; i < rowCount; i++)
            {
                executeSqlite(sql.Replace(@"{LOOPCTR}", i.ToString()));
            }
            sw.Stop();
 
            Console.WriteLine(@"- SQLite            : {0}", sw.Elapsed);
 
            // --
 
            sw.Start();
            for (var i = 0; i < rowCount; i++)
            {
                executeVistaDB(sql.Replace(@"{LOOPCTR}", i.ToString()));
            }
            sw.Stop();
 
            Console.WriteLine(@"- VistaDB           : {0}", sw.Elapsed);
 
            // --
 
            Console.WriteLine();
        }
 
        private static void createSqlCeDB()
        {
            var en = new SqlCeEngine(SqlCeConnectionString);
            en.CreateDatabase();
        }
 
#if KEEP_CONNECTION_OPEN
        private static readonly SqlCeConnection connSqlCe = new SqlCeConnection(SqlCeConnectionString);
#endif
 
        private static DataTable executeSqlCe(string sql)
        {
#if !KEEP_CONNECTION_OPEN
            using (var connSqlCe = new SqlCeConnection(SqlCeConnectionString))
#endif
            using (var da = new SqlCeDataAdapter(sql, connSqlCe))
            {
                var table = new DataTable();
                da.Fill(table);
 
                return table;
            }
        }
 
#if KEEP_CONNECTION_OPEN
        private static readonly SqlConnection connSqlLocale = new SqlConnection(SqlServerLocaleConnectionString);
#endif
 
        private static DataTable executeSqlServerLocale(string sql)
        {
#if !KEEP_CONNECTION_OPEN
            using (var connSqlLocale = new SqlConnection(SqlServerLocaleConnectionString))
#endif
            using (var da = new SqlDataAdapter(sql, connSqlLocale))
            {
                var table = new DataTable();
                da.Fill(table);
 
                return table;
            }
        }
 
#if KEEP_CONNECTION_OPEN
        private static readonly SqlConnection sqlNetworkConn = new SqlConnection(SqlServerNetworkConnectionString);
#endif
 
        private static DataTable executeSqlServerNetwork(string sql)
        {
#if !KEEP_CONNECTION_OPEN
            using (var sqlNetworkConn = new SqlConnection(SqlServerNetworkConnectionString))
#endif
            using (var da = new SqlDataAdapter(sql, sqlNetworkConn))
            {
                var table = new DataTable();
                da.Fill(table);
 
                return table;
            }
        }
 
#if KEEP_CONNECTION_OPEN
        private static readonly VistaDBConnection vistaDBConn = new VistaDBConnection(VistaDBConnectionString);
#endif
 
        private static DataTable executeVistaDB(string sql)
        {
#if !KEEP_CONNECTION_OPEN
            using (var vistaDBConn = new VistaDBConnection(VistaDBConnectionString))
#endif
            using (var da = new VistaDBDataAdapter(sql, vistaDBConn))
            {
                var table = new DataTable();
                da.Fill(table);
 
                return table;
            }
        }
 
#if KEEP_CONNECTION_OPEN
        private static readonly OleDbConnection mdbConn = new OleDbConnection(MdbConnectionString);
#endif
 
        private static DataTable executeMdb(string sql)
        {
#if !KEEP_CONNECTION_OPEN
            using (var mdbConn = new OleDbConnection(MdbConnectionString))
#endif
            using (var da = new OleDbDataAdapter(sql, mdbConn))
            {
                var table = new DataTable();
                da.Fill(table);
 
                return table;
            }
        }
 
#if KEEP_CONNECTION_OPEN
        private static readonly SQLiteConnection sqliteConn = new SQLiteConnection(SqliteConnectionString);
#endif
 
        private static DataTable executeSqlite(string sql)
        {
#if !KEEP_CONNECTION_OPEN
            using (var sqliteConn = new SQLiteConnection(SqliteConnectionString))
#endif
            using (var da = new SQLiteDataAdapter(sql, sqliteConn))
            {
                var table = new DataTable();
                da.Fill(table);
 
                return table;
            }
        }
    }
}

Comments