BatchUpdateString.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. // Copyright (c) .NET Foundation. All rights reserved.
  2. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  3. using System.Linq;
  4. namespace PlatformBenchmarks
  5. {
  6. internal class BatchUpdateString
  7. {
  8. private const int MaxBatch = 500;
  9. public static DatabaseServer Database;
  10. internal static readonly string[] Ids = Enumerable.Range(0, MaxBatch).Select(i => $"@Id_{i}").ToArray();
  11. internal static readonly string[] Randoms = Enumerable.Range(0, MaxBatch).Select(i => $"@Random_{i}").ToArray();
  12. private static string[] _queries = new string[MaxBatch + 1];
  13. public static string Query(int batchSize)
  14. {
  15. if (_queries[batchSize] != null)
  16. {
  17. return _queries[batchSize];
  18. }
  19. var lastIndex = batchSize - 1;
  20. var sb = StringBuilderCache.Acquire();
  21. if (Database == DatabaseServer.PostgreSql)
  22. {
  23. sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ");
  24. Enumerable.Range(0, lastIndex).ToList().ForEach(i => sb.Append($"(@Id_{i}, @Random_{i}), "));
  25. sb.Append($"(@Id_{lastIndex}, @Random_{lastIndex}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id");
  26. }
  27. else
  28. {
  29. Enumerable.Range(0, batchSize).ToList().ForEach(i => sb.Append($"UPDATE world SET randomnumber = @Random_{i} WHERE id = @Id_{i};"));
  30. }
  31. return _queries[batchSize] = StringBuilderCache.GetStringAndRelease(sb);
  32. }
  33. }
  34. }