52 lines
2.1 KiB
C#
52 lines
2.1 KiB
C#
|
using System.Collections.Concurrent;
|
||
|
using System.Data;
|
||
|
using MesETL.Shared.Helper;
|
||
|
|
||
|
namespace Mesdb.Cli;
|
||
|
|
||
|
public static class BatchDbExtensions
|
||
|
{
|
||
|
public static async Task<IDictionary<string, IDictionary<string,long>>> CountDatabasesAsync(string connStr, IList<string> dbNames, CancellationToken cancellationToken = default)
|
||
|
{
|
||
|
var result = new ConcurrentDictionary<string, IDictionary<string,long>>();
|
||
|
var tables = await DatabaseHelper.QueryTableAsync(connStr,
|
||
|
$"""
|
||
|
SELECT TABLE_NAME FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = '{dbNames[0]}';
|
||
|
""");
|
||
|
|
||
|
await Parallel.ForEachAsync(dbNames, async (dbName, ct) =>
|
||
|
{
|
||
|
await Parallel.ForEachAsync(tables.Tables[0].Rows.Cast<DataRow>(), async (row, ct) =>
|
||
|
{
|
||
|
var tableName = row[0].ToString()!;
|
||
|
var count = (long)(await DatabaseHelper.QueryScalarAsync(connStr,
|
||
|
$"SELECT COUNT(1) FROM `{dbName}`.`{tableName}`;", ct))!;
|
||
|
result.AddOrUpdate(dbName, new ConcurrentDictionary<string, long>(), (db, dict) =>
|
||
|
{
|
||
|
dict.AddOrUpdate(tableName, count, (table, num) => num + count);
|
||
|
return dict;
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
public static async Task AnalyzeAllAsync(string connStr, IList<string> dbNames)
|
||
|
{
|
||
|
var tables = await DatabaseHelper.QueryTableAsync(connStr,
|
||
|
$"""
|
||
|
SELECT TABLE_NAME FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = '{dbNames[0]}';
|
||
|
""");
|
||
|
|
||
|
await Parallel.ForEachAsync(dbNames, async (dbName, ct) =>
|
||
|
{
|
||
|
await Parallel.ForEachAsync(tables.Tables[0].Rows.Cast<DataRow>(), async (row, ct) =>
|
||
|
{
|
||
|
var tableName = row[0].ToString()!;
|
||
|
var result = (await DatabaseHelper.QueryTableAsync(connStr,
|
||
|
$"ANALYZE TABLE `{dbName}`.`{tableName}`;", ct));
|
||
|
Console.WriteLine(string.Join('\t', result.Tables[0].Rows[0].ItemArray.Select(x => x.ToString())));
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
}
|