Browse Source

aspnetcore: pg single update statement for mw/raw and mvc/raw (#4700)

* aspcore: add platform multiple queries

* Add missing console output

* tweak postgresql connectionstring

* aspnetcore: pg single update statement for mw/raw and mvc/raw
n-stefan 6 years ago
parent
commit
edaa5223c6

+ 16 - 4
frameworks/CSharp/aspnetcore/Benchmarks/Data/BatchUpdateString.cs

@@ -1,6 +1,7 @@
 // Copyright (c) .NET Foundation. All rights reserved. 
 // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. 
 
+using Benchmarks.Configuration;
 using System.Collections.Generic;
 using System.Linq;
 using System.Runtime.CompilerServices;
@@ -11,6 +12,7 @@ namespace Benchmarks.Data
     {
         private const int MaxBatch = 500;
         private static string[] _queries = new string[MaxBatch];
+        private static DatabaseServer _databaseServer;
 
         public static IList<BatchUpdateString> Strings { get; } =
             Enumerable.Range(0, MaxBatch)
@@ -30,18 +32,28 @@ namespace Benchmarks.Data
         private string CreateQuery(int batchSize)
         {
             var sb = StringBuilderCache.Acquire();
-            foreach (var q in Enumerable.Range(0, batchSize + 1)
-                .Select(i => $"UPDATE world SET randomnumber = @Random_{i} WHERE id = @Id_{i};"))
+            if (_databaseServer == DatabaseServer.PostgreSql)
             {
-                sb.Append(q);
+                sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ");
+                Enumerable.Range(0, batchSize).Select(i => sb.Append($"(@Id_{i}, @Random_{i}), ")).ToList();
+                sb.Append($"(@Id_{batchSize}, @Random_{batchSize}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id");
+            }
+            else
+            {
+                foreach (var q in Enumerable.Range(0, batchSize + 1)
+                    .Select(i => $"UPDATE world SET randomnumber = @Random_{i} WHERE id = @Id_{i};"))
+                {
+                    sb.Append(q);
+                }
             }
             var query = sb.ToString();
             _queries[batchSize] = query;
             return query;
         }
 
-        public static void Initalize()
+        public static void Initialize(DatabaseServer databaseServer)
         {
+            _databaseServer = databaseServer;
             Observe(Strings[0].UpdateQuery);
             Observe(Strings[4].UpdateQuery);
             Observe(Strings[9].UpdateQuery);

+ 1 - 1
frameworks/CSharp/aspnetcore/Benchmarks/Startup.cs

@@ -94,7 +94,7 @@ namespace Benchmarks
 
             if (Scenarios.Any("Update"))
             {
-                BatchUpdateString.Initalize();
+                BatchUpdateString.Initialize(appSettings.Database);
             }
 
             if (Scenarios.Any("Fortunes"))