2017-08-08 3 views
0

Ich habe zwei Tabellen FACT_SALE und DIM_PRODUCT, die sowohl die Produktnamen als gemeinsam haben, und ich wollte die DIM_PRODUCT ‚s-ID als Fremdschlüssel einzustellen. DIM_PRODUCT wird mit den eindeutigen Namenwerten der Tabelle FACT_SALE erstellt.Mitglied wird und Update zu lange dauern

UPDATE FACT_SALE FS 
JOIN DIM_PRODUCT DP ON FS.PRODUCT_NAME = DP.NAME 
SET FS.PRODUCT_KEY = DP.ID 

Diese Abfrage, die ich geschrieben habe, läuft für immer und keine Änderungen werden auch in der DB reflektiert. Es gibt nur einhunderttausend Datensätze (100 000) in der FACT_SALE table. Aber wenn ich eine Select-Abfrage mit Joining zwei Tabelle ausführen, läuft es blitzschnell.

Kann ich wissen, was die Ursache für dieses Problem ist?

+1

Ihre Join-Bedingung ist im Textfeld, und ich vermute, dass dieses Feld nicht indiziert ist, Hinzufügen Index zum Feldnamen könnte viel schneller, so nur eine Test-Backup-Datenbank dann Index zu den Feldern hinzufügen FS.PRODUCT_NAME und DP.NAME testet dann Ihr Update. –

Antwort

3

Für diese Abfrage:

UPDATE FACT_SALE FS JOIN 
     DIM_PRODUCT DP 
     ON FS.PRODUCT_NAME = DP.NAME 
SET FS.PRODUCT_KEY = DP.ID ; 

Sie wollen einen Index für DIM_PRODUCT(NAME, ID):

CREATE INDEX IDX_DIM_PRODUCT_NAME_ID ON DIM_PRODUCT(NAME, ID); 
+0

Ich empfehle wirklich, Ihre Antworten zu lesen – Ali

+0

@Ali Ich genieße auch Gordons Arbeit ... immer eine gute Zeit auf Stack Overflow^^ –

+0

Danke funktioniert wie ein Charme. Wäre toll, wenn ich eine Ressourcenseite bekommen könnte, um zu wissen, warum dieser große Unterschied (wie 20-30x) in Select Join und Update Join ist. :). Wird das Update sehr viel komplexer durchgeführt? –

0
UPDATE FACT_SALE FS 
INNER JOIN DIM_PRODUCT DP ON FS.PRODUCT_NAME = DP.NAME 
SET FS.PRODUCT_KEY = DP.ID 

Zunächst einmal ersetzen mit INNER JOIN verbinden.

zweite Sache müssen Sie Index auf Spalte erstellen, die Sie ON Klausel in JOIN Zustand verwenden.

+2

'JOIN' würde hier in MySQL standardmäßig' INNER JOIN' verwenden. Auch von [dieser Frage] (https://stackoverflow.com/questions/6769941/do-mysql-update-queries-benefit-from-an-index) könnte ein Index für eine Join-Spalte das Update verletzen, anstatt es zu helfen . –

+0

@TimBiegeleisen Ja, ich verstehe. Es gibt eine Zeile ** Ein Index für die Where-Spalte wird die Aktualisierung beschleunigen und einige Einfügungen auswählen, aber verlangsamen. ** –

1

Haben Sie einen Index für eine der Join-Spalten FACT_SALE.PRODUCT_NAME oder DIM_PRODUCT.NAME? Wenn Sie Indizes in einer dieser Spalten haben, könnte dies die Aktualisierung verlangsamen, da der Index zusammen mit den Daten aktualisiert werden müsste.

Von this SO question würde ein Index nur Spalten in der WHERE Klausel profitieren. Aber da Sie keine WHERE-Klausel haben, könnte ein Index weh tun und nicht helfen.

Verwandte Themen