BatchUpdateString.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. internal static readonly string[] Ids = Enumerable.Range(0, MaxBatch).Select(i => $"i{i}").ToArray();
  10. internal static readonly string[] Randoms = Enumerable.Range(0, MaxBatch).Select(i => $"r{i}").ToArray();
  11. internal static readonly string[] Jds = Enumerable.Range(0, MaxBatch).Select(i => $"j{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. /*
  22. sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ");
  23. Enumerable.Range(0, lastIndex).ToList().ForEach(i => sb.Append("(?::int,?::int),"));
  24. sb.Append("(?::int,?::int) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id");
  25. //sb.Append("(?::int,?::int)) AS temp(id, randomNumber) WHERE temp.id = world.id");
  26. */
  27. #if MYSQL
  28. for (int i = 0; i < batchSize; i++)
  29. {
  30. sb.Append("UPDATE world SET randomNumber=? WHERE id=?;");
  31. }
  32. #elif ADO
  33. /*
  34. sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ");
  35. Enumerable.Range(0, lastIndex).ToList().ForEach(i => sb.Append($"(@i{i}, @r{i}), "));
  36. sb.Append($"(@i{lastIndex}, @r{lastIndex}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id");
  37. */
  38. sb.Append("UPDATE world SET randomNumber=CASE id ");
  39. for (int i = 0; i < batchSize; i++)
  40. {
  41. sb.Append("WHEN @i" + i + " THEN @r" + i + " ");
  42. }
  43. sb.Append("ELSE randomnumber END WHERE id IN(");
  44. for (int i = 0; i < lastIndex; i++)
  45. {
  46. sb.Append("@j" + i + ",");
  47. }
  48. sb.Append("@j" + lastIndex + ")");
  49. #else
  50. sb.Append("UPDATE world SET randomNumber=CASE id ");
  51. for (int i = 0; i < batchSize; i++)
  52. {
  53. sb.Append("WHEN ? THEN ? ");
  54. }
  55. sb.Append("ELSE randomnumber END WHERE id IN(");
  56. for (int i = 0; i < lastIndex; i++)
  57. {
  58. sb.Append("?,");
  59. }
  60. sb.Append("?)");
  61. #endif
  62. return _queries[batchSize] = StringBuilderCache.GetStringAndRelease(sb);
  63. }
  64. }
  65. }