2016-04-25 2 views
0

Ich habe Probleme beim Ausführen einer Einfügeabfrage auf 2 große Tabellen. Ein Tisch ist 67.000.000 und der andere ist 100.000. Ich versuche, einen LINKEN und einen RECHTEN Join an den 2 Tischen zu machen und die Ergebnisse in eine andere Tabelle zu bringen. Die Abfrage läuft perfekt auf kleineren Tabellen unter 1M Einträge. aber wenn man zu den höheren Einträgen kommt, bombardiert es. Ich bekomme diese Fehlermeldung:MySQL Einfügen von Ergebnissen der linken und rechten Join Ergebnisse in Speicherproblem

Incorrect key file for table 'C:\Windows\TEMP\#sql3838_2_6.MYI'; try to repair it 

Nach den Lösungen Online-Lesen sie sagen, den Speicher durch mysql verwendet zu erhöhen und es ist Schlüssel für die Indizierung. Ich habe das versucht und bekomme immer noch das gleiche Problem. Ich bin mir nicht sicher, ob es eine schlechte Konfiguration für mysql oder eine Bar geschriebene Abfrage ist.

Also ich bin wirklich auf der Suche nach einer Lösung zur Optimierung meiner Abfrage, so dass es mehr Speichereffizienz oder eine Änderung in my.config ist, um die Abfrage zu behandeln. Oder die Abfrage in 2 verschiedene Inserts aufteilen ??? Würde das helfen?

MySQL Query

INSERT INTO schema.orphan_results (_Doc_ID, Orphan_Entries, Entries_Table, Orphan_File) 
    SELECT C.A__Doc_ID, C.A_File, C.A_Table, C.B_File 
    FROM(SELECT A._Doc_ID AS A__Doc_ID, A.File AS A_File, A.Table AS A_Table, B.File AS B_File 
    FROM schema.Temp_Entries A 
    LEFT JOIN schema.temp_dir_scan B ON A.File = B.File 
    UNION SELECT A._Doc_ID as A__Doc_ID, A.File AS A_File, A.Table AS A_Table, B.File AS B_File 
    FROM schema.Temp_Entries A 
    RIGHT JOIN schema.temp_dir_scan B ON A.File = B.File) C 
WHERE C.A_File IS NULL OR C.B_File IS NULL 

Hier ist my.config für MySql

default-storage-engine=INNODB 
max_connections=800 
query_cache_size=186M 
table_cache=1520 
tmp_table_size=900M 
thread_cache_size=38 
myisam_max_sort_file_size=100G 
myisam_sort_buffer_size=268M 
key_buffer_size=1160M 
read_buffer_size=128K 
read_rnd_buffer_size=512K 
sort_buffer_size=512K 
innodb_additional_mem_pool_size=96M 
innodb_buffer_pool_size=563M 

My System

16 Gigs of Mem 
52 Gigs of Free disk space. 

Antwort

1

Die Fehlermeldung in der Regel ergibt sich aus niedrigen Festplattenspeicher, aber da 52gigs sollte genug (und ich nehme an, dass Ihr Dateisystem> 2GB-Dateien verarbeiten kann), könnte es etwas anderes sein.

Die folgende 2 Dinge sollten die erforderlichen temporären Raum zu begrenzen, arbeiten:

  • Sie sollten einen Index für temp_dir_scan.File und Temp_Entries.File erstellen.

  • Sie sollten "union all" anstelle von "union" verwenden (oder, wie Sie vorgeschlagen haben, die Abfrage aufteilen).

Und Sie könnten Ihren Code neu schreiben (noch, erstellen Sie den Index, bitte):

INSERT INTO schema.orphan_results (_Doc_ID, Orphan_Entries, Entries_Table, Orphan_File) 
SELECT A._Doc_ID, A.File, A.Table, null 
FROM schema.Temp_Entries A 
where not exists (select 1 from schema.temp_dir_scan B where A.File = B.File) 
-- or a.file is null -- you might need that if a.file can be null 

INSERT INTO schema.orphan_results (_Doc_ID, Orphan_Entries, Entries_Table, Orphan_File) 
select null, null, null, B.File 
from schema.temp_dir_scan B 
where not exists (select 1 from schema.Temp_Entries A where A.File = B.File) 

Seit UNION verfügt über eine integrierte in distinct (obwohl ich nicht sicher bin, wenn Sie sich bewusst sind), möchten Sie vielleicht select distinct A._Doc_ID ... verwenden, aber wenn Sie es nicht wirklich brauchen, nicht!

Verwandte Themen