Forums Neueste Beiträge
 

Abfrage optimieren - oder Alternative

26/01/2010 - 14:45 von Uwe Ricken | Report spam
Servus zusammen,

leider stehe ich gerade auf dem Schlauch und muss auch ehrlich gesagt
gestehen, dass Access SQL eindeutig . und unperformant ist.
Folgendes Szenario:

Ich habe eine Subquery, die eine UNION Query repràsentiert:

<UNION QUERY - qry_sys_ABA_Key>
SELECT Migration_Id
FROM tbl_app_ImportedRecords
WHERE
ImportLog_Id = fn_app_GetParameterValue("ImportLog_Id") AND
IsCustomer = "Y" AND
LEFT(Country_Code, 3) = "000" AND
ABAKey <> "0"

UNION

SELECT Migration_Id
FROM tbl_app_ImportedRecords
WHERE
ImportLog_Id = fn_app_GetParameterValue("ImportLog_Id") AND
IsBank = "Y" AND
LEFT(Country_Code, 3) = "000" AND
ABAKey <> "2"

UNION
...
</UNION>

Insgesamt ist diese Abfrage (für sich gesehen) schnell und auch ohne
Probleme. Das Resultat dieser Abfrage (ein einziges Attribut) verwende ich
nun in einer weteren Abfrage, um daraus die betreffenden Datensàtze zu
ermitteln. Dabei habe ich zwei Varianten ausprobiert:

Version 1:
SELECT <FeldListe>
FROM tbl_app_ImportedRecords AS r
WHERE r.Migration_Id IN (SELECT a.Migration_Id FROM qry_sys_ABA_Key_Check a)

Dauer der Abfrage: (ca. 30 - 60 Sekunden)

Version 2:
SELECT <FeldListe>
FROM tbl_app_ImportedRecords AS r INNER JOIN qry_sys_ABA_Key_Check a
ON (r.Migration_Id = a.Migration_Id)

Dauer der Abfrage: (ca. 2 Sekunden)

Das Problem, dass ich jetzt leider mit Version 2 habe...
Ich kann die Daten nicht bearbeiten :-(
Das ist aber zwingend erforderlich, da die Abfrage fehlerhafte Daten
ausgibt, die vom Benutzer bearbeitet werden MÜSSEN!

Wenn ich Version 1 in SQL Server ausführe, gibt es keine Unterschiede.
Einzige Idee, die ich gehabt habe:
- SubQuery in temporàre Tabelle umleiten und diese Tabelle joinen
- Nachteil: Backend blàht sich unnötig auf!

Jemand von Euch ev. noch einen sinnvollen Denkansatz.
Danke für Eure Unterstützung...

Uwe Ricken
db Berater GmbH
http://www.db-berater.de

MCTS: Microsoft SQL Server 2005
MCDBA: Microsoft SQL Server 2005
 

Lesen sie die antworten

#1 Josef Poetzl
26/01/2010 - 15:10 | Warnen spam
Hallo!

Uwe Ricken schrieb:
Ich habe eine Subquery, die eine UNION Query repràsentiert:

<UNION QUERY - qry_sys_ABA_Key>
SELECT Migration_Id
FROM tbl_app_ImportedRecords
WHERE
ImportLog_Id = fn_app_GetParameterValue("ImportLog_Id") AND
IsCustomer = "Y" AND
LEFT(Country_Code, 3) = "000" AND
ABAKey <> "0"

UNION

SELECT Migration_Id
FROM tbl_app_ImportedRecords
WHERE
ImportLog_Id = fn_app_GetParameterValue("ImportLog_Id") AND
IsBank = "Y" AND
LEFT(Country_Code, 3) = "000" AND
ABAKey <> "2"

UNION
...
</UNION>



Denn Sinn dieser Union verstehe ich nicht.
Wenn man die obigen 2 SQL-Anweisungen zusammenfasst ergibt sich:
| SELECT Migration_Id
| FROM tbl_app_ImportedRecords
| WHERE
| ImportLog_Id = fn_app_GetParameterValue("ImportLog_Id") AND
| IsCustomer = "Y" AND
| LEFT(Country_Code, 3) = "000" AND
| ABAKey >= ''

ABAKey darf also nur nicht NULL sein. ;)

BTW: das für LEFT(Country_Code, 3) = "000" kein Index verwendet werden
kann, muss ich für dich zwar nicht erwàhnen, ich mache es aber
trotzdem, da mich so etwas sogar dann stört, wenn es keinen Einfluss
auf die Auswertungsgeschwindigkeit hat. :-))

| Country_Code like "000*"
ist doch gleichbedeutend mit der Left-Variante, oder?

Insgesamt ist diese Abfrage (für sich gesehen) schnell und auch ohne
Probleme. Das Resultat dieser Abfrage (ein einziges Attribut) verwende ich
nun in einer weteren Abfrage, um daraus die betreffenden Datensàtze zu
ermitteln. Dabei habe ich zwei Varianten ausprobiert:

Version 1:
SELECT <FeldListe>
FROM tbl_app_ImportedRecords AS r
WHERE r.Migration_Id IN (SELECT a.Migration_Id FROM qry_sys_ABA_Key_Check a)
Dauer der Abfrage: (ca. 30 - 60 Sekunden)

Version 2:
SELECT <FeldListe>
FROM tbl_app_ImportedRecords AS r INNER JOIN qry_sys_ABA_Key_Check a
ON (r.Migration_Id = a.Migration_Id)

Dauer der Abfrage: (ca. 2 Sekunden)

Das Problem, dass ich jetzt leider mit Version 2 habe...
Ich kann die Daten nicht bearbeiten :-(



Du könntest eine Exists-Prüfung versuchen.
SELECT <FeldListe>
FROM tbl_app_ImportedRecords AS r
WHERE Exists (
SELECT * FROM qry_sys_ABA_Key_Check a
where r.Migration_Id = a.Migration_Id
)

Das wird aber vermutlich nur etwas bringen, wenn die Migration_Id in
die Select-Anweisungen durchgereicht werden kann. Was imo bei einer
Jet-Union nicht möglich ist.

mfg
Josef

EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/

Ähnliche fragen