Index neu setzen

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

Antworten
haederli
Beiträge: 8
Registriert: Mi 10. Okt 2018, 13:20

Hallo zusammen
wie kann ich die Intex aller Tabellen neu setzen.

Was ich bis jetzt versucht habe und leider nicht geht

Code: Alles auswählen

execute block
AS
declare variable ix varchar(255);
begin
  for select rdb$indices.rdb$index_name   from rdb$indices
  into ix
  do
  execute statement 'SET STATISTICS INDEX '||ix ;
end
das ist der Fehler

Code: Alles auswählen

SQL Error [335544634] [42000]: Dynamic SQL Error; SQL error code = -104; Token unknown - line 1, column 1; begin [SQLState:42000, ISC error code:335544634]
SQL Error [335544634] [42000]: Dynamic SQL Error; SQL error code = -104; Token unknown - line 1, column 1; begin [SQLState:42000, ISC error code:335544634]
SQL Error [335544634] [42000]: Dynamic SQL Error; SQL error code = -104; Token unknown - line 1, column 1; begin [SQLState:42000, ISC error code:335544634]
SQL Error [335544634] [42000]: Dynamic SQL Error; SQL error code = -104; Token unknown - line 1, column 1; begin [SQLState:42000, ISC error code:335544634]
Dynamic SQL Error; SQL error code = -104; Token unknown - line 1, column 1; begin [SQLState:42000, ISC error code:335544634]
Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 1
begin

Wer hat schonmal die Index neu gesetzt?

Gruss & Danke
mclemens
Beiträge: 5
Registriert: Mo 16. Apr 2018, 11:05

Bitte mal folgende Procedure erstellen.


SET TERM ^ ;

create or alter procedure REINDEX
as
declare variable SQL varchar(200);
BEGIN
FOR
select rdb$index_name from rdb$indices
INTO :SQL
DO
BEGIN
SQL='SET STATISTICS INDEX '||SQL||';';
execute statement :sql;
END
END^

SET TERM ; ^


Danach bitte execute procedure REINDEX ausführen.
bfuerchau
Beiträge: 485
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Es fehlte nur der Doppelpunkt für Hostvariablen.

execute block
AS
declare variable ix varchar(255);
begin
for select rdb$indices.rdb$index_name from rdb$indices
into :ix
do
execute statement 'SET STATISTICS INDEX ' || :ix ;
end

Bei bestimmten Namen macht es u.U. Sinn in Anführungszeichen einzubetten:
execute statement 'SET STATISTICS INDEX "' || :ix || '"';
haederli
Beiträge: 8
Registriert: Mi 10. Okt 2018, 13:20

danke

ich verwende
Interbase Query, V 8.3.1.0
DBeaver V 5.1.0

mit Interbase Query kann ich die Procedur erstellen und ausführen.
die Index werden neu erstellt.

habe noch im Web gelsen, das der Index aktiviert werden muss, ist das so?
ALTER INDEX IDEX_NMAE ACTIVE;

wenn ja, kann man das in der Procedur hinzu fügen.

welchen Programm setzt Du ein, um auf die Firebird DB zu zugreifen?


Vielen, vielen Dank
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Hi,

der Index wird hierdurch nicht neu erstellt, sondern die Selektivitäten werden neu berechnet.
Damit der Index auch verwendet werden kann (z.B. durch den Optimizer), muss dieser aktiviert werden. Die Neuberechnung kann jedoch auch für abgeschaltete Indizes durchgeführt werden.

Gruß
Martin
Martin Köditz
it & synergy GmbH
haederli
Beiträge: 8
Registriert: Mi 10. Okt 2018, 13:20

danke für die Erklärung.

weden denn die Index nicht automatisch aktiviert?

und wie kann ich das in der Procedur einbauen?


Danke
Philip
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Wenn ein neuer Index neu erstellt wird, wird dieser auch aktiviert. Das ist der Standard.

Gruß
Martin
Martin Köditz
it & synergy GmbH
bfuerchau
Beiträge: 485
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Per "alter index bla inactive" wird ein Index deaktiviert und bei Inserts/Updates auch nicht mehr gepflegt. Es gibt bei Unique-Indizes dann auch keine Fehlermeldung.
Mit "alter index bla active" wird ein Index beim Commit neu erstellt.
Unique-Indizes werden dann auch bei Fehlern abgebrochen.

Für die Neuberechnung der Selektivität wird die Anweisung "set statistics bla" benötigt.
haederli
Beiträge: 8
Registriert: Mi 10. Okt 2018, 13:20

Vielen Dank an alle.

Ihr habt mir sehr geholfen.

Leider ohne Erfolg!
Der Zugriff auf die Firebird DB findet mitr OCL statt.

Es wird im Attribut nach NULL selektiert, ist ein Datumsfeld.

Code: Alles auswählen

.........   and (bold_id in (SELECT UserEintrag FROM Zusatzfeld WHERE MetaZusatzfeld=5136 and (WertDatum is NULL)))
Die Indexe wurden neu berchnet und auch aktiviert.
Aber die Abfrage wird nicht schneller verarbeitet.

nochmals danke an alle
Philip
bfuerchau
Beiträge: 485
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Woher weißt du das?
Statt eines where ... in (select ...) versuche mal einen

select .... from bla X
where exists (select * from bla Y where x.key = y.key and ....).
Der Exists sucht genau nach nur 1 Satz und ein Index über die Where-Klausel macht dann Sinn.
Das Probelm ist, dass es über NULL-Inhalte i.d.R. keinen Index gibt.
Antworten