php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 11.06.2008, 22:45   #1 (permalink)
Erfahrener Benutzer
 
Registriert seit: 06.06.2008
Beiträge: 2.119
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein sehr geschätzer MenschWolla ist ein sehr geschätzer MenschWolla ist ein sehr geschätzer Mensch
Wolla eine Nachricht über ICQ schicken
Standard [Erledigt] Select über zwei Tabellen / Performanceproblem

Ich habe ein Performanceproblem und bin mir sicher, dass es hausgemacht ist, weiß aber nicht, wo ich ansetzen soll.

tab1: (ca. 300.000 Zeilen)

id int(10)
feld1 varchar (30)
sperre set 'ok,gesperrt'
(weitere 10 Felder)

Primary Key ist id, auf feld1 liegt ein Index.


tab2: (ca 1000 Zeilen)

feld2 varchar (30)

Index liegt auf feld2


Feld2 enthält solche Daten:
%text1%
%text2%
usw.

Die Aufgabe besteht darin, alle Zeilen in tab als 'gesperrt' zu markieren, wenn tab1.feld1 LIKE tab2.feld2 ist.

Ich kann nur mit phpmyadmin umgehen und habe dort folgenden SQL-Befehl eingegeben:

PHP-Code:
SELECT FROM tab1,tab2 WHERE feld1 LIKE feld2
mit der Idee, erstmal zu schaun ob es eine Treffermenge gibt, und dann das Statement so abzuändern:

PHP-Code:
UPDATE tab1,tab2 SET sperre='gesperrt' WHERE feld1 LIKE feld2
Bis zum Update kam ich allerdings nicht mehr, das Select-Statement habe ich nach 20 Min über die Taskliste gekillt.

Wo habe ich den Murks eingebaut?
Wolla ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 11.06.2008, 22:57   #2 (permalink)
Erfahrener Benutzer
 
Registriert seit: 07.06.2008
Beiträge: 564
PHP-Kenntnisse:
Fortgeschritten
Frank ist zur Zeit noch ein unbeschriebenes Blatt
Frank eine Nachricht über ICQ schicken Frank eine Nachricht über MSN schicken Frank eine Nachricht über Yahoo! schicken
Standard

Code:
UPDATE `tab1`, `tab2` SET `tab1`.`sperre` = 'gesperrt' WHERE `tab1`.`feild1` LIKE `tab2`.`field2`
Das sollte es eigentlich machen
__________________
Frank ist offline   Mit Zitat antworten
Alt 12.06.2008, 10:37   #3 (permalink)
Erfahrener Benutzer
 
Registriert seit: 06.06.2008
Beiträge: 2.119
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein sehr geschätzer MenschWolla ist ein sehr geschätzer MenschWolla ist ein sehr geschätzer Mensch
Wolla eine Nachricht über ICQ schicken
Standard

Danke für die Antwort.

Du hast zu meinem UPDATE eigentlich nur die Häkchen hinzugefügt, bringt das den erhofften Geschwindigkeitszuwachs?

Ich bin bei komplexen Updates immer so vorgegangen, dass ich die WHERE-Klausel erstmal mit einem SELECT * geprüft habe, und dann das "SELECT * FROM" durch "UPDATE" ersetzt und die SET-Statements eingebaut habe.

In diesem Fall findet das SELECT aber schon kein (schnelles) Ende, und ich will kein Update starten, das mit eine Woche lang den Server lahmlegt
Wolla ist offline   Mit Zitat antworten
Alt 12.06.2008, 15:19   #4 (permalink)
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 25.134
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Muß es zwingend LIKE sein? Meines Wissens ist das wesentlich lahmer als der normale '=' Operator. Die Backticks bringen wohl eher keine Performanceunterschiede...
__________________
--
„Eins ist Fakt: Gescannt wird nackt!“

Privatsphäre 2.0 - Nacktscanner mit Eyetracking.
Unser Flugzeug darf kein geschlechtsfreier Raum sein.
--
nikosch ist offline   Mit Zitat antworten
Alt 12.06.2008, 15:43   #5 (permalink)
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.034
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch77-new Beitrag anzeigen
Die Backticks bringen wohl eher keine Performanceunterschiede...
Ausserdem verleiten sie zu unsorgfältigem Programmieren und stören die Übersichtlichkeit.
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 12.06.2008, 15:48   #6 (permalink)
Ehemaliger Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 5.631
PHP-Kenntnisse:
Fortgeschritten
cycap wird schon bald berühmt werdencycap wird schon bald berühmt werden
Standard

Zitat:
Zitat von lazydog Beitrag anzeigen
Ausserdem verleiten sie zu unsorgfältigem Programmieren und stören die Übersichtlichkeit.
Also ich finde das ist wohl Ansichtssache und auch nur wenn ich eine Spalte `alter` nennen will, weil eben das Alter eines Dinges drin steht, dann programmiere ich ja nicht unsorgfältig.
__________________
1 && 1 macht 1 - Klingt komisch, ist aber so
cycap ist offline   Mit Zitat antworten
Alt 12.06.2008, 16:01   #7 (permalink)
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 25.134
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Zitat:
Ausserdem verleiten sie zu unsorgfältigem Programmieren und stören die Übersichtlichkeit.
Die Aussage würde ich auch gern näher erklärt sehen. Was meint denn "unsorgfältigem Programmieren" in diesem Zusammenhang? Und was ist hier unübersichtlich:
Code:
UPDATE 
  `tab1` , 
  `tab2` 
SET 
  `tab1`.`sperre` = 'gesperrt' 
WHERE 
  `tab1`.`field1` LIKE `tab2`.`field2`
__________________
--
„Eins ist Fakt: Gescannt wird nackt!“

Privatsphäre 2.0 - Nacktscanner mit Eyetracking.
Unser Flugzeug darf kein geschlechtsfreier Raum sein.
--
nikosch ist offline   Mit Zitat antworten
Alt 12.06.2008, 16:07   #8 (permalink)
Erfahrener Benutzer
 
Registriert seit: 06.06.2008
Beiträge: 2.119
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein sehr geschätzer MenschWolla ist ein sehr geschätzer MenschWolla ist ein sehr geschätzer Mensch
Wolla eine Nachricht über ICQ schicken
Standard

Zitat:
Feld2 enthält solche Daten:
%text1%
%text2%
usw.
Dewegen habe ich ein LIKE in der WHERE-Klausel. Ich hab das ganze unsinnigerweise aber mal so laufen lassen:

PHP-Code:
SELECT FROM tab1,tab2 WHERE feld1 feld2
Das dauert ca. 2 Min und bringt natürlich kein Ergebnis.

Ein Bekannter, der allerdings auch nicht weiterhelfen konnte sagte mir, dass wohl alle Zeilen der einen Tabelle mit allen Zeilen der anderen Tabelle verknüpft würden und dann erst die Vergleichsbedingung geprüft würde. Das würde bei meinem SQL-Statement bedeuten, dass ich um die 30 Mio Zeilen bilde.

Kann man das Ganze anders formulieren? Sonst bau ich mir per PHP eine Schleife durch alle Zeilen der kleinen Tabelle und such dann in der großen Tabelle rum - aber das kann ja nun wirklich nicht der Weisheit letzter Schluss sein.
Wolla ist offline   Mit Zitat antworten
Alt 12.06.2008, 16:10   #9 (permalink)
Ehemaliger Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 5.631
PHP-Kenntnisse:
Fortgeschritten
cycap wird schon bald berühmt werdencycap wird schon bald berühmt werden
Standard

guckst du im MySQL Manual unter JOIN und insbesondere der ON-Klausel
__________________
1 && 1 macht 1 - Klingt komisch, ist aber so
cycap ist offline   Mit Zitat antworten
Alt 12.06.2008, 16:38   #10 (permalink)
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.034
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch77-new Beitrag anzeigen
Die Aussage würde ich auch gern näher erklärt sehen. Was meint denn "unsorgfältigem Programmieren" in diesem Zusammenhang? Und was ist hier unübersichtlich:
Code:
UPDATE 
  `tab1` , 
  `tab2` 
SET 
  `tab1`.`sperre` = 'gesperrt' 
WHERE 
  `tab1`.`field1` LIKE `tab2`.`field2`
Natürlich ist das teilweise Ansichtsache
Code:
UPDATE
    tab1,
    tab2
SET
    tab1.sperre = 'gesperrt'
WHERE
    tab1.field1 LIKE tab2.field2
finde ich auf jeden Fall übersichtlicher und es gibt keine Verwechslungsgefahr mit Anführungszeichen. Reservierte Wörter sollte man vermeiden. Wenn du Backticks verwendest, merkst du nicht einmal mehr, dass du reservierte Wörter brauchst. Ausserdem (auch wenn das wahrscheinlich für die meisten hier nicht wesentlich ist) ist es nicht portabel.
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Kein Ergebnis bei SELECT (MySQL 4.1.9) dr.e. Datenbanken 4 15.06.2008 19:54
[Erledigt] Mysql Insert Select + Concat Hu5eL Datenbanken 14 10.06.2008 10:39
SELECT über zwei Tabellen KingCrunch Datenbanken 9 23.03.2007 04:01
select mit inhalten aus mehreren Tabellen wurtzel Datenbanken 6 02.12.2006 17:37
SELECT aus 2 Tabellen jens21 Datenbanken 3 30.08.2006 00:54
SELECT aus zwei "gleichen" Tabellen patr1k Datenbanken 2 05.07.2006 11:57
Select über zwei Tabellen danix-dj PHP Tipps 2006 11 22.05.2006 15:13
Select über 2 Tabellen MasterMind Datenbanken 11 08.04.2006 11:43
Select über mehrere tabellen Sclot Datenbanken 14 24.11.2005 16:56
SELECT * FROM 2 Tabellen - Problem Datenbanken 1 01.09.2005 16:30
SELECT über 4 Tabellen mit DISTINC PHP Tipps 2005 2 08.03.2005 19:50
[Erledigt] mehrere tabellen verknüpfen bei select Datenbanken 3 29.09.2004 11:00
INSERT INTO SELECT an mehrere Tabellen? Datenbanken 6 17.09.2004 16:57
2 mal select 1 form PHP-Fortgeschrittene 1 01.09.2004 20:13
[Erledigt] Join für Select Count(`id`)-Abfrage über 4 Tabellen Datenbanken 4 10.07.2004 18:32

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
select benchmark oracle statement

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:55 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum