Skip to content

Commit c5201eb

Browse files
committed
feat: query size of all indexes in one query
Refs #1500
1 parent 48a93d2 commit c5201eb

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
@@ -540,7 +540,8 @@ TDBConnection = class(TComponent)
540540
function UnescapeString(Text: String): String;
541541
function ExtractLiteral(var SQL: String; Prefix: String): String;
542542
function GetResults(SQL: String): TDBQuery;
543-
function GetCol(SQL: String; Column: Integer=0): TStringList;
543+
// Query one column and return as StringList. Creates Name/Value pairs if NameColumn is 0 or greater.
544+
function GetCol(SQL: String; ValueColumn: Integer=0; NameColumn: Integer=-1): TStringList;
544545
function GetVar(SQL: String; Column: Integer=0): String; overload;
545546
function GetVar(SQL: String; Column: String): String; overload;
546547
function Ping(Reconnect: Boolean): Boolean; virtual; abstract;
@@ -5359,16 +5360,20 @@ function TDBConnection.FindObject(DB, Obj: String): TDBObject;
53595360
end;
53605361

53615362

5362-
function TDBConnection.GetCol(SQL: String; Column: Integer=0): TStringList;
5363+
function TDBConnection.GetCol(SQL: String; ValueColumn: Integer=0; NameColumn: Integer=-1): TStringList;
53635364
var
53645365
Results: TDBQuery;
53655366
begin
53665367
Results := GetResults(SQL);
53675368
Result := TStringList.Create;
5368-
if Results.RecordCount > 0 then while not Results.Eof do begin
5369-
Result.Add(Results.Col(Column));
5370-
Results.Next;
5371-
end;
5369+
if Results.RecordCount > 0 then
5370+
while not Results.Eof do begin
5371+
if NameColumn < 0 then
5372+
Result.Add(Results.Col(ValueColumn))
5373+
else
5374+
Result.AddPair(Results.Col(NameColumn), Results.Col(ValueColumn));
5375+
Results.Next;
5376+
end;
53725377
FreeResults(Results);
53735378
end;
53745379

@@ -6019,6 +6024,7 @@ function TMySQLConnection.GetTableKeys(Table: TDBObject): TTableKeyList;
60196024
KeyQuery, ColQuery: TDBQuery;
60206025
NewKey: TTableKey;
60216026
SizeQuery: String;
6027+
SizeByIndex: TStringList;
60226028
begin
60236029
Result := TTableKeyList.Create(True);
60246030

@@ -6070,6 +6076,12 @@ function TMySQLConnection.GetTableKeys(Table: TDBObject): TTableKeyList;
60706076
end else begin
60716077

60726078
KeyQuery := GetResults('SHOW KEYS FROM '+QuoteIdent(Table.Name)+' FROM '+QuoteIdent(Table.Database));
6079+
SizeByIndex := nil;
6080+
if FSqlProvider.Has(qIndexSize) then try
6081+
SizeQuery := FSqlProvider.GetSql(qIndexSize, [EscapeString(Table.Database), EscapeString(Table.Name)]);
6082+
SizeByIndex := GetCol(SizeQuery, 1, 0);
6083+
except
6084+
end;
60736085
NewKey := nil;
60746086
while not KeyQuery.Eof do begin
60756087
if (not Assigned(NewKey)) or (NewKey.Name <> KeyQuery.Col('Key_name')) then begin
@@ -6098,17 +6110,9 @@ function TMySQLConnection.GetTableKeys(Table: TDBObject): TTableKeyList;
60986110
else if KeyQuery.ColumnExists('Ignored') then // mariadb 10.6
60996111
NewKey.Visible := SameText(KeyQuery.Col('Ignored'), 'NO');
61006112

6101-
if FSqlProvider.Has(qIndexSize) then begin
6102-
try
6103-
SizeQuery := FSqlProvider.GetSql(qIndexSize, [
6104-
EscapeString(Table.Database),
6105-
EscapeString(Table.Name),
6106-
EscapeString(NewKey.Name)
6107-
]);
6108-
NewKey.Size := StrToInt64Def(GetVar(SizeQuery), NewKey.Size);
6109-
except
6110-
end;
6111-
end;
6113+
if Assigned(SizeByIndex) then
6114+
NewKey.Size := StrToInt64Def(SizeByIndex.Values[NewKey.Name], NewKey.Size);
6115+
61126116
end;
61136117

61146118
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
@@ -3436,9 +3436,9 @@ function TMySqlProvider.GetSql(AId: TQueryId): string;
34363436
);
34373437
qIndexSize: Result := IfThen(
34383438
(IsMySQL and (FServerVersion >= 50600)) or IsMariaDB,
3439-
'SELECT stat_value * @@innodb_page_size' +
3439+
'SELECT index_name, stat_value * @@innodb_page_size AS bytes' +
34403440
' FROM mysql.innodb_index_stats'+
3441-
' WHERE database_name=%s AND table_name=%s AND index_name=%s AND stat_name=''size''',
3441+
' WHERE database_name=%s AND table_name=%s AND stat_name=''size''',
34423442
''
34433443
);
34443444
else Result := inherited;

0 commit comments

Comments
 (0)