Skip to content

Commit 499ee41

Browse files
committed
feat: query size of all indexes in one query
Refs #1500
1 parent f1d0eb6 commit 499ee41

2 files changed

Lines changed: 23 additions & 19 deletions

File tree

source/dbconnection.pas

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,8 @@ TDBConnection = class(TComponent)
548548
function UnescapeString(Text: String): String;
549549
function ExtractLiteral(var SQL: String; Prefix: String): String;
550550
function GetResults(SQL: String): TDBQuery;
551-
function GetCol(SQL: String; Column: Integer=0): TStringList;
551+
// Query one column and return as StringList. Creates Name/Value pairs if NameColumn is 0 or greater.
552+
function GetCol(SQL: String; ValueColumn: Integer=0; NameColumn: Integer=-1): TStringList;
552553
function GetVar(SQL: String; Column: Integer=0): String; overload;
553554
function GetVar(SQL: String; Column: String): String; overload;
554555
function Ping(Reconnect: Boolean): Boolean; virtual; abstract;
@@ -5527,16 +5528,20 @@ function TDBConnection.FindObject(DB, Obj: String): TDBObject;
55275528
end;
55285529

55295530

5530-
function TDBConnection.GetCol(SQL: String; Column: Integer=0): TStringList;
5531+
function TDBConnection.GetCol(SQL: String; ValueColumn: Integer=0; NameColumn: Integer=-1): TStringList;
55315532
var
55325533
Results: TDBQuery;
55335534
begin
55345535
Results := GetResults(SQL);
55355536
Result := TStringList.Create;
5536-
if Results.RecordCount > 0 then while not Results.Eof do begin
5537-
Result.Add(Results.Col(Column));
5538-
Results.Next;
5539-
end;
5537+
if Results.RecordCount > 0 then
5538+
while not Results.Eof do begin
5539+
if NameColumn < 0 then
5540+
Result.Add(Results.Col(ValueColumn))
5541+
else
5542+
Result.AddPair(Results.Col(NameColumn), Results.Col(ValueColumn));
5543+
Results.Next;
5544+
end;
55405545
FreeResults(Results);
55415546
end;
55425547

@@ -6177,6 +6182,7 @@ function TMySQLConnection.GetTableKeys(Table: TDBObject): TTableKeyList;
61776182
KeyQuery, ColQuery: TDBQuery;
61786183
NewKey: TTableKey;
61796184
SizeQuery: String;
6185+
SizeByIndex: TStringList;
61806186
begin
61816187
Result := TTableKeyList.Create(True);
61826188

@@ -6228,6 +6234,12 @@ function TMySQLConnection.GetTableKeys(Table: TDBObject): TTableKeyList;
62286234
end else begin
62296235

62306236
KeyQuery := GetResults('SHOW KEYS FROM '+QuoteIdent(Table.Name)+' FROM '+QuoteIdent(Table.Database));
6237+
SizeByIndex := nil;
6238+
if FSqlProvider.Has(qIndexSize) then try
6239+
SizeQuery := FSqlProvider.GetSql(qIndexSize, [EscapeString(Table.Database), EscapeString(Table.Name)]);
6240+
SizeByIndex := GetCol(SizeQuery, 1, 0);
6241+
except
6242+
end;
62316243
NewKey := nil;
62326244
while not KeyQuery.Eof do begin
62336245
if (not Assigned(NewKey)) or (NewKey.Name <> KeyQuery.Col('Key_name')) then begin
@@ -6256,17 +6268,9 @@ function TMySQLConnection.GetTableKeys(Table: TDBObject): TTableKeyList;
62566268
else if KeyQuery.ColumnExists('Ignored') then // mariadb 10.6
62576269
NewKey.Visible := SameText(KeyQuery.Col('Ignored'), 'NO');
62586270

6259-
if FSqlProvider.Has(qIndexSize) then begin
6260-
try
6261-
SizeQuery := FSqlProvider.GetSql(qIndexSize, [
6262-
EscapeString(Table.Database),
6263-
EscapeString(Table.Name),
6264-
EscapeString(NewKey.Name)
6265-
]);
6266-
NewKey.Size := StrToInt64Def(GetVar(SizeQuery), NewKey.Size);
6267-
except
6268-
end;
6269-
end;
6271+
if Assigned(SizeByIndex) then
6272+
NewKey.Size := StrToInt64Def(SizeByIndex.Values[NewKey.Name], NewKey.Size);
6273+
62706274
end;
62716275

62726276
if KeyQuery.ColumnExists('Expression') and (not KeyQuery.IsNull('Expression')) then begin

source/dbstructures.mysql.pas

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3430,9 +3430,9 @@ function TMySqlProvider.GetSql(AId: TQueryId): string;
34303430
);
34313431
qIndexSize: Result := IfThen(
34323432
(IsMySQL and (FServerVersion >= 50600)) or IsMariaDB,
3433-
'SELECT stat_value * @@innodb_page_size' +
3433+
'SELECT index_name, stat_value * @@innodb_page_size AS bytes' +
34343434
' FROM mysql.innodb_index_stats'+
3435-
' WHERE database_name=%s AND table_name=%s AND index_name=%s AND stat_name=''size''',
3435+
' WHERE database_name=%s AND table_name=%s AND stat_name=''size''',
34363436
''
34373437
);
34383438
else Result := inherited;

0 commit comments

Comments
 (0)