Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Index bei StoredProcezure (https://www.delphipraxis.net/209355-index-bei-storedprocezure.html)

Dumpfbacke 25. Nov 2021 15:40

Datenbank: Firebird • Version: 2.5 • Zugriff über: FIREDAC

Index bei StoredProcezure
 
Hallo Ihr Experten,
leider hab ich ein weitere Problem und weiß nicht so recht wie ich es lösen soll. Ich habe eine extrem große Tabelle und möchte dort ein Bestimmtes Ergebnis haben. Ich muss hier leider Daten aus einen anderen Datenbank mit anzeigen. Somit muss ich das ganze in einer StoredProdedure machen da ich on externel benutzen möchte / muss. Hier funktioniert kein Index (lt. IBexpert) egal was ich mache. Ist das richtig so und habe Ihr hier einen Lösung bzw. hat Ihr so ein Problem schon mal gelöst ? Wenn ich den Select normal ausführe also in einer normalen Abfrage, so funktioniert es recht gut und das Ergebis ist nach 14 Sekunden auch schon da. Lt.IBExpert wird auch ein Index benutzt.

Tanja.

Frickler 25. Nov 2021 16:26

AW: Index bei StoredProcezure
 
Bei on external keine Select-Anweisung reinschreiben, sondern auch in der anderen Datenbank eine stored procedure erstellen, die die eigentliche Abfrage macht, und die dann per "on external" aufrufen.

TBx 25. Nov 2021 18:50

AW: Index bei StoredProcezure
 
Ich vermute, IBExpert analysiert das Statement schlicht nicht.
In Execute Statement kann prinzipiell jeder Müll drin stehen, das fällt einem erst zur Laufzeit auf die Füße.
Wenn der Index lt. Plananalyzer benutzt wird, wenn du das Statement direkt auf der Datenbank ausführst, wird das auch bei execute Statement so sein.

BerndS 25. Nov 2021 21:25

AW: Index bei StoredProcezure
 
Das kein Plan zum Extertal select abrufbar ist, könnte auch daran liegen, dass vom Server eine eigene Verbindung zur zweiten DB aufgebaut wird und dessen Plan ja nichts mit der primären Verbindung zu tun hat.

IBExpert 26. Nov 2021 07:14

AW: Index bei StoredProcezure
 
wenn du mit ibexpert-services-traceandaudit auf beiden datenbanken eine session offen hast,
würdest du auch sehen, was deine staements da so veranstalten.

lokal gibt es keinen weg, das remote ausgeführte statement sonst zu analysieren, weil
über die api die dafür erforderlichen Daten nicht wmitkommen, aber wie schon gesagt,
in trace and audit ist das meistens sogar besser, weil da auch aufgerufene trigger etc
erkennbar sind.

Dumpfbacke 26. Nov 2021 15:09

AW: Index bei StoredProcezure
 
Ich habe mich vermutlich etwas uneindeutig ausgedrückt. Zu dem Punkt on External bin ich noch nicht mal gekommen bis jetzt und hänge schon vorher fest. Ich erkläre es noch mal besser dann wird es klar.

Ich habe ein Tabelle mit 86 Mio Datensätze und dort möchte ich áls Ergebnis eine Menge zwischen 1500 - 2500 Datensätze habe. Vorerst einmal zum testen und wenn es mit dem on External funktioniert wird das Ergebnis zuschen 50 und 100 liegen da ich dann nocht mehr gruppieren kann / möchte. Es geht hier nur um zwei Felder der Tabelle. Mit dem Select (normal) dauert es 15 Sekunden bei 2244 Datensätze und das Ergebnis liegt vor. Auf den Felder liegt ein Index der auch genomen wird lt. IBExpert.

Delphi-Quellcode:
Select Feld1,Feld2 
From Tabelle
where Feld1 starting with 'ABC' and Feld2 starting with '123'
Group by Feld1,Feld2
Das ganze in einer Stored Prodcedue dauert sehr lange 51 Minuten

Delphi-Quellcode:
Select Feld1,Feld2 
From Stored_Tabelle
where Feld1 starting with 'ABC' and Feld2 starting with '123'
Group by Feld1,Feld2
Die Prozedure hierzu ist

Delphi-Quellcode:
for
  Select T1.Feld1, T1.Feld2
  From Tabelle T1
   into :VPSZ,Fachsz
  do
  suspend;
Beide Ergebnisse stimmen überein. Es kann doch hier nur so sein das hier kein Index benutzt wird oder ?

On Externel geht aber doch nur ein einer Stored Prodedure oder ?

Wenn jemnd auch einen anderen Ansatz hat immer her damit. Dei Daten liegen leider in drei verschiedenen Datenbanken

Tanja

TBx 26. Nov 2021 15:30

AW: Index bei StoredProcezure
 
Da stimmt Dein Ansatz nicht.
Du holst über die SP alle Datensätze und führst dann auf dem Ergebnis der SP ein Select durch.
Für das Ergebnis einer SP hast Du aber keinen Index.
Hol Dir über die SP nur die wirklich benötigten Datensätze aus der externen DB und gib das dann aus.

Delphi.Narium 26. Nov 2021 16:23

AW: Index bei StoredProcezure
 
Ich hätte statt
Delphi-Quellcode:
for
  Select T1.Feld1, T1.Feld2
  From Tabelle T1
   into :VPSZ,Fachsz
  do
  suspend;
eher
Delphi-Quellcode:
for
  Select T1.Feld1, T1.Feld2
  From Tabelle T1
  where T1.Feld1 starting with 'ABC' and T1.Feld2 starting with '123'
  Group by T1.Feld1, T1.Feld2 
   into :VPSZ,Fachsz
  do
  suspend;
erwartet. ABC und 123 könnte man dann ggfls. per Parameter an die Prozedur übergeben?

IBExpert 26. Nov 2021 16:42

AW: Index bei StoredProcezure
 
sende doch mal die kompletten metadaten deiner testtabelle (also mit create table und indizes usw, findest du in ibexpert auf der seite ddl

und dann noch den Inhalt der Seite Performanceanalyse in IBExpert beim sql editor (ggf als screenshot mit allen infos)

Dann kann man mehr sagen. so auf anhieb würde ich aber denke, das dabei ein kombinierter index über beide felder
ein ganz brauchbares ergebnis liefern sollte und keineswgs 51 minuten brauchen, das muss auch komplett ohne
indizes eine sehr lahm gurke sein oder eine sehr unglückliche Tabellendefinition (viele und zu lange
varchar/char felder zum beispiel).

Dumpfbacke 1. Dez 2021 17:17

AW: Index bei StoredProcezure
 
Es hat leider etwas länger gedauert. Ich habe mal nur die beiden benötigten Felder in eine extra Tabelle in eine extra Datenbak geschoben. Dann die beiden Felder aus der original Tabelle mit den Werten befüllt. Hier die gewünschten Daten.

Delphi-Quellcode:
SET SQL DIALECT 3;0



/******************************************************************************/
/****                                Tables                               ****/
/******************************************************************************/



CREATE TABLE TABELLE1 (
    FELD1  VARCHAR(25),
    FELD2  VARCHAR(4)
);




/******************************************************************************/
/****                               Indices                               ****/
/******************************************************************************/

CREATE INDEX TABELLE1_IDX1 ON TABELLE1 (FELD1, FELD2);


/******************************************************************************/
/****                              Privileges                             ****/
/******************************************************************************/
Die Procedure Feld1 ist ein VarChar25 und Feld2 ist ein Varschar4

Delphi-Quellcode:
begin
  /* Procedure Text */
  for
  Select TB.Feld1, TB.feld2
  From Tabelle1 TB
   into :Feld1,Feld2
  do
  suspend;
end
Die Abfrage auf die Tabelle selbst

Delphi-Quellcode:
Select Feld1,Feld2
from tabelle1
where Feld1 starting with 'A' and Feld2 starting with '7'
Group by Feld1, Feld2
Ergibt unter Performace Analysis
Delphi-Quellcode:
Plan
PLAN (TABELLE1 ORDER TABELLE1_IDX1 INDEX (TABELLE1_IDX1))

------ Performance info ------
Prepare time = 0ms
Execute time = 4s 968ms
Avg fetch time = 261,47 ms
Current memory = 12.261.872
Max memory = 133.414.344
Memory buffers = 1.024
Reads from disk to cache = 31.451
Writes from cache to disk = 0
Fetches from cache = 8.549.654
Die Abfrage auf die Procedure

Delphi-Quellcode:
Select Feld1,Feld2
from NEW_PROCEDURE
where Feld1 starting with 'A' and Feld2 starting with '7'
Group by Feld1, Feld2
Ergibt unter Performace Analysis

Delphi-Quellcode:
Plan
PLAN SORT ((TB NATURAL))

------ Performance info ------
Prepare time = 0ms
Execute time = 8m 56s 250ms
Avg fetch time = 28.223,68 ms
Current memory = 29.439.032
Max memory = 133.414.344
Memory buffers = 1.024
Reads from disk to cache = 680.390
Writes from cache to disk = 0
Fetches from cache = 174.652.879
Da ja hier die Tabelle nur noch zwei Felder hat geht es vermutlich etwas besser aber der Index wird hier einfach nicht genutzt. Wie gesagt ich habe hier eine Tabelle mit nur den zwei Felder angelegt und nur diese befüllt. Das ganze ich schon merkwürde und ich weiß nicht warum er hier keinen Index nehemen möchte.

Ja die Kiste ist nicht die schnellste aber für das was wir damit machen recht es uns noch aus. Werden wir irgendwann mal tauschen müssen.

Vielen Dank schon einmal für die Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz