Avatar billede Rune1983 Ekspert
17. januar 2019 - 09:22 Der er 5 kommentarer og
1 løsning

Forespørgselshastighed på tværs af de databaser.

Hej Eksperten
Har arbejdet på at forbedre en søgefunktion i vores system. Selve søgning tog omkring 20 sek for at få opstillet data fra kaldet.
Havde en enkel JOIN i kaldet til at hente dato og status fra sidste rapport for det givne ID i Arkiv databasen.
Viste sig hvis jeg fjernede dette join fra kaldet. Så kom mit kald ned på ca. 0,5-1 sek. i stedet for 20 sek. (Det kan vi lide)
Lavede så et kald til Arkiv database for at hente de sidste data. Det bliver så et kald for hvert enkelt result fra første kald af.

Kan det virkelig passe man mister så meget hastighed på ens kald ved at flette to databaser sammen i et sql kald?
Avatar billede arne_v Ekspert
17. januar 2019 - 12:54 #1
Normalt ikke.

Er de felter der joines paa enten primaenoegle eller har et indeks paa sig?
Avatar billede Rune1983 Ekspert
17. januar 2019 - 12:59 #2
Min join ser sådan her ud.

LEFT JOIN (
SELECT ID, max(Dato_For_Eftersyn) AS 'DatoSidste', Status_rapport, Note_AfslutUdenService, Datostempel
FROM `DB-Eftersyn-Arkiv`.`eftersyn_sr_id`
GROUP BY ID
)SQL1
ON SQL1.ID = s.Produkt_ID
Avatar billede Rune1983 Ekspert
17. januar 2019 - 13:00 #3
Kolonne ID har index ... er ikke primærnøgle ... det er rapportnummeret
Avatar billede arne_v Ekspert
17. januar 2019 - 13:20 #4
Du skal have indeks paa (medmindre primaernoegle):

ID (join)
Produkt_ID (join)
Dato_For_Eftersyn (max)
Avatar billede Rune1983 Ekspert
17. januar 2019 - 14:13 #5
Det er lidt svært at forklare.
Tror problemet ligger i at den lille sub query trækker for mange rækker ud og undersøger hver enkel.
SELECT ID, max(Dato_For_Eftersyn) AS 'DatoSidste', Status_rapport, Note_AfslutUdenService, Datostempel
FROM `DB-Eftersyn-Arkiv`.`eftersyn_sr_id`
GROUP BY ID
(13500) rækker data

Så det bedre at undlade den og så lave et kald for hver række af første query.
SELECT ID, max(Dato_For_Eftersyn) AS 'DatoSidste', Status_rapport, Note_AfslutUdenService, Datostempel
FROM eftersyn_sr_id
WHERE ID = (ID fra første række)
(1) række data
Avatar billede Rune1983 Ekspert
18. januar 2019 - 09:48 #6
Opfølgning.

Taget udpluk af SQL sætning da den er meget lang med mange where conditions i bunden.

*************************
*************************
Kald der tog mega lang tid

SELECT
s.Produkt_ID,
...
SQL1.DatoSidste,
SQL1.Status_rapport,
SQL1.Note_AfslutUdenService,
SQL1.Datostempel

FROM ...

LEFT JOIN (
    SELECT ID, max(Dato_For_Eftersyn) AS 'DatoSidste', Status_rapport, Note_AfslutUdenService, Datostempel
    FROM `DB-Eftersyn-Arkiv`.`eftersyn_sr_id` GROUP BY ID
)SQL1
ON SQL1.ID = s.Produkt_ID
...
*************************
*************************

OMSKRIVES TIL

SELECT
s.Produkt_ID
,
...
,
(SELECT SQL1.Dato_For_Eftersyn
    FROM `DB-Eftersyn-Arkiv`.`eftersyn_sr_id` SQL1
    WHERE SQL1.ID = s.Produkt_ID
    GROUP BY SQL1.ID
    ORDER BY SQL1.Dato_For_Eftersyn DESC
) AS 'DatoSidste'
,
(SELECT SQL1.Status_rapport
    FROM `DB-Eftersyn-Arkiv`.`eftersyn_sr_id` SQL1
    WHERE SQL1.ID = s.Produkt_ID
    GROUP BY SQL1.ID
    ORDER BY SQL1.Dato_For_Eftersyn DESC
) AS 'Status_rapport'
,
(SELECT SQL1.Note_AfslutUdenService
    FROM `DB-Eftersyn-Arkiv`.`eftersyn_sr_id` SQL1
    WHERE SQL1.ID = s.Produkt_ID
    GROUP BY SQL1.ID
    ORDER BY SQL1.Dato_For_Eftersyn DESC
) AS 'Note_AfslutUdenService'
,
(SELECT SQL1.Datostempel
    FROM `DB-Eftersyn-Arkiv`.`eftersyn_sr_id` SQL1
    WHERE SQL1.ID = s.Produkt_ID
    GROUP BY SQL1.ID
    ORDER BY SQL1.Dato_For_Eftersyn DESC
) AS 'Datostempel'

FROM ...
...

*************************
*************************
Ved at omksirve den får jeg alt data ud i et træk som jo var mest optimalt. Og super hurtig udførelse.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester