diff --git a/Duplicati/Library/Main/Database/ExtensionMethods.cs b/Duplicati/Library/Main/Database/ExtensionMethods.cs
index dbb6fd58b..01bb7234a 100644
--- a/Duplicati/Library/Main/Database/ExtensionMethods.cs
+++ b/Duplicati/Library/Main/Database/ExtensionMethods.cs
@@ -147,7 +147,27 @@ namespace Duplicati.Library.Main.Database
con.Transaction = transaction;
return con;
}
-
+
+ /// Small helper method querying and returning a textual representation of the SQLite execution plan.
+ public static string GetSQLiteExecutionPlan(this System.Data.IDbCommand cmd)
+ {
+ var qpCmd = cmd.Connection.CreateCommand();
+ qpCmd.CommandText = "EXPLAIN QUERY PLAN " + cmd.CommandText;
+ qpCmd.Connection = cmd.Connection;
+ qpCmd.CommandType = cmd.CommandType;
+ qpCmd.Transaction = cmd.Transaction;
+
+ System.Data.DataTable dt = new System.Data.DataTable();
+ using (var rd = qpCmd.ExecuteReader())
+ dt.Load(rd);
+
+ string plan =
+ String.Join("\t", dt.Columns.Cast().Select(c => c.ColumnName).ToArray()) + "\n"
+ + string.Join("\n", dt.Rows.Cast().Select(r => String.Join("\t", r.ItemArray.Select(o => o == null ? "" : o.ToString()).ToArray())).ToArray());
+
+ return plan;
+ }
+
public static void DumpSQL(this System.Data.IDbConnection self, System.Data.IDbTransaction trans, string sql, params object[] parameters)
{
using (var c = self.CreateCommand())