php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 22-06-2007, 18:19
hal45
 Newbie
Links : Onlinestatus : hal45 ist offline
Registriert seit: Apr 2005
Beiträge: 12
hal45 ist zur Zeit noch ein unbeschriebenes Blatt
Standard 250 000 Update-Statements

Hi,
vielleicht hat ja von euch jemand einen Tipp..
ich muss 250000 Update-Statements absetzen auf eine Tabelle.
Im Prinzip ganz simpel:
Update tabelle set jahr = 2001 where id = xy

id ist primärschlüssel, die spalte "jahr" integer.

Egal ob ich das per Console als Script lade oder über php versuche, jedesmal brauche ich schon zwei, drei Minuten nur für 100 Statements.

hat jemand eine Idee, wie ich das beschleunigen kann?

Gruß + danke
hal
Mit Zitat antworten
  #2 (permalink)  
Alt 22-06-2007, 18:36
ministry
 PHP Junior
Links : Onlinestatus : ministry ist offline
Registriert seit: Jun 2006
Ort: KI / KA
Beiträge: 965
ministry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wieso musst du das für jeden Datensatz einzeln machen?

UDPATE tabelle SET jahr = 2001
__________________
ich glaube
Mit Zitat antworten
  #3 (permalink)  
Alt 22-06-2007, 18:40
jghj
 Newbie
Links : Onlinestatus : jghj ist offline
Registriert seit: Jun 2007
Beiträge: 3
jghj ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo,

also ich kann dir warscheinlich hier nicht viel helfen weil ich mit dieser Problematik zum Glück noch nicht zu kämpfen hatte.

Aber die Frage wäre, ob es da möglich ist, dass du den gesamten String in einem überträgst und ausführen lässt (z.B. getrennt durch ';') oder ob es überhaupt nötig ist soviele Updates abzusetzen.

Ist das jetzt eine einmalige Aktion? Weil ich kann mir kaum vorstellen, dass 250000 Jahreszahlen regelmäßig in komplett andere Werte geändert werden.

Wenn die Werte auch nur irgendwie berechenbar sind, empfiehlt es sich natürlich, den SQL-Server das berechnen zu lassen:

update tbl set jahr = jahr + 1 ....

oder so ähnlich eben.
Mit Zitat antworten
  #4 (permalink)  
Alt 22-06-2007, 18:51
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Ich gehe jetzt mal davon aus, dass du zu jedem Eintrag eine individuelle Zahl speichern willst, sonst hättest du dieses Vorhaben sicher nicht.

Zitat:
Egal ob ich das per Console als Script lade oder über php versuche, jedesmal brauche ich schon zwei, drei Minuten nur für 100 Statements.
Das ist pervers! Eine so simple Query sollte nie im leben ein bis zwei Sekunden dauern. Auch nicht, wenn 100 Stück hintereinander folgen.

(Ich kenn genug hier im Forum, die Ihre Applikationen nach diesem Schema programmieren. )
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #5 (permalink)  
Alt 22-06-2007, 20:07
ArSeN
 Registrierter Benutzer
Links : Onlinestatus : ArSeN ist offline
Registriert seit: Feb 2006
Ort: Berlin
Beiträge: 1.052
ArSeN ist zur Zeit noch ein unbeschriebenes Blatt
ArSeN eine Nachricht über ICQ schicken ArSeN eine Nachricht über AIM schicken ArSeN eine Nachricht über Yahoo! schicken
Standard

Ganz sicher, dass die ID als Primärschlüssel indiziert ist? Kann ich mir ehrlichgesagt kaum vorstellen bei der Rechenleistung.
__________________
Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.
Mit Zitat antworten
  #6 (permalink)  
Alt 22-06-2007, 22:23
hal45
 Newbie
Links : Onlinestatus : hal45 ist offline
Registriert seit: Apr 2005
Beiträge: 12
hal45 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hier ist die Tabellen-Definition:

CREATE TABLE `abc`.`tabellei` (
`appln_id` int(11) NOT NULL default '0',
`person_id` int(11) NOT NULL default '0',
...
`jahr` int(10) unsigned NOT NULL,
PRIMARY KEY USING BTREE (`person_id`,`appln_id`),
KEY `ind_country` (`inv_cou`),
KEY `ind_vorname` (`inv_vorname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Da soll natürlich jeder Datensatz einen speziellen Wert bekommen, deshalb muss das für jeden Datensatz einzeln gemacht werden, das wurde in meinem ersten Posting vielleicht nicht deutlich genug...
Der Wert lässt sich auch nicht berechnen, sondern hängt mit der appln_id zusammen. Allerdings ist es eine einmalige Aktion.
Vielleicht ist auch noch wichtig, dass so ein Update mehrere Datensätze betreffen kann (weil die appln_id als Bestandteil des kombinierten Schlüssels mehrfach vorkommen kann.) Deshalb kann ich es auch nicht mit einem insert / Flat-File machen - zumindest hatte ich noch keine zündende Idee, wie ich das hinbekommen könnte ohne dass die anderen Daten futsch gehen.

Mir ist das auch unerklärlich, warum das so ewig dauert.

Ich sollte noch dazu sagen, ingesamt umfasst die Tabelle 560.000 Datensätze.

Gruß
hal

Geändert von hal45 (22-06-2007 um 22:38 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 22-06-2007, 23:40
ArSeN
 Registrierter Benutzer
Links : Onlinestatus : ArSeN ist offline
Registriert seit: Feb 2006
Ort: Berlin
Beiträge: 1.052
ArSeN ist zur Zeit noch ein unbeschriebenes Blatt
ArSeN eine Nachricht über ICQ schicken ArSeN eine Nachricht über AIM schicken ArSeN eine Nachricht über Yahoo! schicken
Standard

Ahja... da isses ja schonwieder bissel was anderes als am Anfang. Benutzt du denn beim Update stets person_id und appln_id? Wenn nicht würde ich da mal drüber nachdenken.
__________________
Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.
Mit Zitat antworten
  #8 (permalink)  
Alt 23-06-2007, 00:23
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

EXPLAIN SELECT jahr FROM tabelle WHERE id = x;
ANALYZE tabelle;
OPTIMIZE tabelle;
LOCK TABLES tabelle WRITE; ... UNLOCK TABLES;
START TRANSACTION; ... COMMIT;

Alles schon versucht?
Mit Zitat antworten
  #9 (permalink)  
Alt 23-06-2007, 01:33
hal45
 Newbie
Links : Onlinestatus : hal45 ist offline
Registriert seit: Apr 2005
Beiträge: 12
hal45 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,
also erstmal danke für eure Anregungen..
ich habs jetzt aber ganz anders gelöst. hab ne neue Tabelle gemacht und mir die werte mit select aus der anderen Tab jahreweise geholt und dann mit Insert into...select... jahreweise wieder eingefügt und da ging es ratzfatz (waren nur 5 verschiedene Jahre)...

@ArSeN: das versteh ich nicht ganz, wie du das meinst? Ich hab eim update nur auf appln_id zugegriffen, weil mir die person_id nicht bekannt ist und die ja auch unterschiedlich sein kann für ein update.. Meinst du, dass es deshalb solange gedauert hat, weil ich den key nur "halb" angegeben konnte und die andere Hälfte variabel war und somit mehrere Datensätze betroffen hat?

@onemorenerd:
alles hatte ich nicht ausprobiert, aber das eine oder andere ;-)

aber nu hab ich s ja und kann nun endlich ins Wochenende gehen.
Gruß + Dank
hal
Mit Zitat antworten
  #10 (permalink)  
Alt 23-06-2007, 02:42
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von hal45
@ArSeN: das versteh ich nicht ganz, wie du das meinst? Ich hab eim update nur auf appln_id zugegriffen, weil mir die person_id nicht bekannt ist und die ja auch unterschiedlich sein kann für ein update.. Meinst du, dass es deshalb solange gedauert hat, weil ich den key nur "halb" angegeben konnte und die andere Hälfte variabel war und somit mehrere Datensätze betroffen hat?
Nicht nur das, apple_id ist der hintere Teil vom index, demnach wird der index mit %<id> durchwühlt, was langsamer ist als <id>%, da die Struktur halt ein bin-Baum ist
Den Rest hab ich mir jetzt nicht angeschaut, ka ob es wirklich deshalb so langsam war~
Mit Zitat antworten
  #11 (permalink)  
Alt 23-06-2007, 04:27
prego
 PHP Senior
Links : Onlinestatus : prego ist offline
Registriert seit: May 2005
Ort: Herborn
Beiträge: 1.609
prego ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Mann kann das ganze auch in einer query machen... hab jetzt nicht jeden Beitrag gelesen, is ja schon spät

PHP-Code:
UPDATE tab SET jahr 2001 WHERE id IN(1,2,4,5,6,...) 
Evtl, wenn mann viele ID's hat, muss man die MAX_QUERY_LENGTH per SET heraufsetzen. Für nen mom geht das aber....

Nichtsdestotrotz halte ich es aber auch mit Tobiaz, das bei einer "vernünftigen" Tabellen Struktur das ganze kein Problem sein sollte...
Mit Zitat antworten
  #12 (permalink)  
Alt 23-06-2007, 13:50
ArSeN
 Registrierter Benutzer
Links : Onlinestatus : ArSeN ist offline
Registriert seit: Feb 2006
Ort: Berlin
Beiträge: 1.052
ArSeN ist zur Zeit noch ein unbeschriebenes Blatt
ArSeN eine Nachricht über ICQ schicken ArSeN eine Nachricht über AIM schicken ArSeN eine Nachricht über Yahoo! schicken
Standard

ghostgambler hats eigentlich schon gesagt: Ich meine damit, dass der ganze Index (Primärschlüssel) ein Binärbaum ist, und es daher auch nur wirklich sinnvoll ist, wenn du den kompletten Primärschlüssel im WHERE-Statement angibst. Dann sollte es wirklich um einiges schneller gehen.
__________________
Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.
Mit Zitat antworten
  #13 (permalink)  
Alt 29-06-2007, 10:54
hal45
 Newbie
Links : Onlinestatus : hal45 ist offline
Registriert seit: Apr 2005
Beiträge: 12
hal45 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

danke nochmal für eure Antworten...
das Problem war ja nur, dass mir eben nicht der gesamte Primärschlüssel bekannt war, sondern nur der eine Wert, deshalb konnte ich ihn auch nicht komplett angeben.

Und auch die Variante mit IN (...) ist bei 200.000 ids, die dann da hätten aufgelistet werden müssen, sicher auch nicht schneller - sofern man das überhaupt hingekriegt hätte.

Natürlich könnte man jetzt zu Recht argumentieren, wenn das Feld nur in Abhängigkeit zu einem Teil des Primärschlüssels steht, die Tabelle nicht mehr den Normalisierungsregeln entspricht, aber in dem Fall ging es nicht anders.

Gruß
hal
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

HeidiSQL - kostenloses MySQL front-end Editor für Windows ansehen HeidiSQL - kostenloses MySQL front-end Editor für Windows

HeidiSQL - ist ein Windows-Editor für die bekannt open Source Datenbank mySQL

10.12.2018 Berni | Kategorie: MYSQL/ Management
piwik Open-Source Webanalyse-Software ansehen piwik Open-Source Webanalyse-Software

piwik ist eine gute Alternative zu Google Analytics. Viele Features und ein modernes Erscheinungsbild mit aussagefähigen Statistiken in Echtzeit

10.12.2018 phpler | Kategorie: PHP/ Besucherzaehler
jQuery Mobile ansehen jQuery Mobile

Touch-Optimized Web Framework für Smartphones & Tablets

09.12.2018 phpler | Kategorie: AJAX/ Framework
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 23:42 Uhr.