Hallööchen!
Ich habe ein problem mit zwei Unterschiedlichen gleichen SQL-Abfragen. Die eine dauert wenige Sekunden die andere liegt im schnitt bei 15 Minuten.
Ich hoffe wirklich ihr könnt mir helfen.
Query 1:
SELECT count(*) AS Falsch, filialdaten_online.verlag_nr
FROM filialdaten_online
JOIN filialdaten_quelle
ON filialdaten_online.verlag_nr = filialdaten_quelle.verlag_gs
/* Hier beginnt die Suche nach möglichen Treffern */
WHERE produkt_id = 3
AND abfragedatum_id = 258
AND lieferdatum_id = 56
AND filialdaten_online.plz LIKE CONCAT(SUBSTR(filialdaten_quelle.plz, -CHAR_LENGTH(filialdaten_quelle.plz), 3), "%")
AND filialdaten_online.strasse LIKE CONCAT(SUBSTR(filialdaten_quelle.strasse , -CHAR_LENGTH(filialdaten_quelle.strasse),CHAR_LENGTH(filialdaten_quelle.strasse)- 3), "%")
AND filialdaten_online.hausnummer LIKE CONCAT("%", SUBSTR(filialdaten_quelle.hausnummer, -CHAR_LENGTH(filialdaten_quelle.hausnummer), 3), "%")
/* Hier ist die Suche der möglichen treffern beendet */
/* Jetzt beginnt das Filtern nach den Abweichenden. */
AND (
LTRIM(LCASE(filialdaten_online.bezeichnung)) != LTRIM(LCASE(filialdaten_quelle.bezeichnung))
OR LTRIM(filialdaten_online.plz) != LTRIM(filialdaten_quelle.plz)
OR LTRIM(LCASE(filialdaten_online.ort)) != LTRIM(LCASE(filialdaten_quelle.ort))
OR LTRIM(LCASE(filialdaten_online.strasse)) != LTRIM(LCASE(filialdaten_quelle.strasse))
OR LTRIM(filialdaten_online.hausnummer) != LTRIM(filialdaten_quelle.hausnummer)
OR LTRIM(REPLACE(`filialdaten_online`.`telefonnummer`, " ", "")) != LTRIM(REPLACE(CONCAT(filialdaten_quelle.vorwahl, filialdaten_quelle.telefonnummer), " ", ""))
OR LTRIM(LCASE(REPLACE(filialdaten_online.homepage, "http://", ""))) != LTRIM(LCASE(REPLACE(filialdaten_quelle.homepage, "http://", "")))
OR LTRIM(REPLACE(`filialdaten_online`.`faxnummer`, " ", "")) != LTRIM(REPLACE(CONCAT(filialdaten_quelle.vorwahl, filialdaten_quelle.faxnummer), " ", ""))
OR LTRIM(REPLACE(filialdaten_online.montag, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.montag, " - ", "-"))
OR LTRIM(REPLACE(filialdaten_online.dienstag, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.dienstag, " - ", "-"))
OR LTRIM(REPLACE(filialdaten_online.mittwoch, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.mittwoch, " - ", "-"))
OR LTRIM(REPLACE(filialdaten_online.donnerstag, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.donnerstag, " - ", "-"))
OR LTRIM(REPLACE(filialdaten_online.freitag, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.freitag, " - ", "-"))
OR LTRIM(REPLACE(filialdaten_online.samstag, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.samstag, " - ", "-"))
OR LTRIM(REPLACE(filialdaten_online.sonntag, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.sonntag, " - ", "-"))
)
AND filialdaten_quelle.id IN (SELECT filialdaten_quelle.id
FROM filialdaten_online
LEFT JOIN filialdaten_quelle
ON filialdaten_quelle.verlag_gs = filialdaten_online.verlag_nr
WHERE abfragedatum_id = 258
AND lieferdatum_id = 56
AND filialdaten_online.plz LIKE CONCAT(SUBSTR(filialdaten_quelle.plz, -CHAR_LENGTH(filialdaten_quelle.plz), 3), "%")
AND filialdaten_online.strasse LIKE CONCAT(SUBSTR(filialdaten_quelle.strasse , -CHAR_LENGTH(filialdaten_quelle.strasse),CHAR_LENGTH(filialdaten_quelle.strasse)- 3), "%")
AND filialdaten_online.hausnummer LIKE CONCAT("%", SUBSTR(filialdaten_quelle.hausnummer, -CHAR_LENGTH(filialdaten_quelle.hausnummer), 3), "%")
GROUP BY filialdaten_quelle.id having count(filialdaten_online.id) <= 1)
/* Ende des Filterns */
GROUP BY verlag_nr
Query 1 gibt mir eine Liste von Falschen Einträgen zurück diese werden dann pro Verlag_Nr zusammen gefasst und gezählt. Dieser Funktionier super. =)
Query 2:
SELECT count(*) AS Doppelt, filialdaten_online.verlag_nr
FROM filialdaten_online
JOIN filialdaten_quelle
ON filialdaten_online.verlag_nr = filialdaten_quelle.verlag_gs
WHERE produkt_id = 3
AND abfragedatum_id = 258
AND lieferdatum_id = 56
AND filialdaten_online.plz LIKE CONCAT(SUBSTR(filialdaten_quelle.plz, -CHAR_LENGTH(filialdaten_quelle.plz), 3), "%")
AND filialdaten_online.strasse LIKE CONCAT(SUBSTR(filialdaten_quelle.strasse , -CHAR_LENGTH(filialdaten_quelle.strasse),CHAR_LENGTH(filialdaten_quelle.strasse)- 3), "%")
AND filialdaten_online.hausnummer LIKE CONCAT("%", SUBSTR(filialdaten_quelle.hausnummer, -CHAR_LENGTH(filialdaten_quelle.hausnummer), 3), "%")
AND filialdaten_quelle.id IN(SELECT filialdaten_quelle.id
FROM filialdaten_online
LEFT JOIN filialdaten_quelle
ON filialdaten_quelle.verlag_gs = filialdaten_online.verlag_nr
WHERE abfragedatum_id = 258
AND lieferdatum_id = 56
AND filialdaten_online.plz LIKE CONCAT(SUBSTR(filialdaten_quelle.plz, -CHAR_LENGTH(filialdaten_quelle.plz), 3), "%")
AND filialdaten_online.strasse LIKE CONCAT(SUBSTR(filialdaten_quelle.strasse , -CHAR_LENGTH(filialdaten_quelle.strasse),CHAR_LENGTH(filialdaten_quelle.strasse)- 3), "%")
AND filialdaten_online.hausnummer LIKE CONCAT("%", SUBSTR(filialdaten_quelle.hausnummer, -CHAR_LENGTH(filialdaten_quelle.hausnummer), 3), "%")
GROUP BY filialdaten_quelle.id having count(filialdaten_online.id) > 1)
GROUP BY verlag_nr
Query 2 bereitet mir meine Kopfschmerzen , dieser ist kürzer und trotzdem benötigt er eine sehr unangemessene Zeit und ich weiß nicht warum.
Der Hauptunterschied liegt im Subquery das ich im Query1 “<= 1” und im Query2 “> 1” abfrage.
Query 1 hat ansonsten nur noch Prüfabfragen ob eine der Spalten von einem Prüfdatensatz abweicht.
Ich hoffe wirklich ihr könnt mir erklären warum der zweite Query soviel länger braucht und wie ich das beheben kann.
Liebe Grüße
Tilodon