2012-09-03 5 views
0

J'ai une déclaration comme ci-dessousCréer une table de jointure interne extrêmement lent

CREATE TABLE INPUT_OUTPUT 
SELECT T1_C1,.....,T1_C300, T1_PID from T1 
    INNER JOIN (SELECT T2_C1,T2_C2,T2_PID FROM T2) as RESPONSE ON T1.T1_PID=RESPONSE.T2_PID 

qui est en cours d'exécution extrêmement lent - pendant 5 heures maintenant. Les deux tables ont environ 4 millions de lignes et quelques centaines de colonnes. J'ai une machine ubuntu-linux à 8 cœurs et 64 gb de RAM et en utilisant le top je peux voir que 3gb n'est même pas utilisé par le processus mysql sur un seul noyau, bien que son utilisation soit toujours à 100%. C'est bouleversant que tous les cœurs ne soient pas utilisés.

Je veux créer la table beaucoup plus rapidement que cela.

Dois-je utiliser

CREATE TABLE INPUT_OUTPUT LIKE T1 

INPUT_OUTPUT alter en ajoutant les colonnes supplémentaires pour celles qui sont pertinentes en T2, puis le remplir? Je ne suis pas sûr de la syntaxe pour le faire et si cela conduira à une accélération.

+0

Je suis confus: la sous-requête n'a pas de colonne PID. –

+0

@ Keith: Typo, corrigé. – Yoda

+0

HPC n'a rien à voir avec les requêtes SQL lentes - étiquette HPC supprimée. –

Répondre

0

Est-ce que T1_PID a un index? Si c'est le cas, cela devrait fonctionner rapidement. Exécutez un EXPLAIN de la partie SELECT de votre requête et voyez ce qu'il dit.

Cela dit, je ne comprends pas pourquoi vous avez besoin de la sous-requête. Quel est le problème:

CREATE TABLE INPUT_OUTPUT 
SELECT T1_C1,.....,T1_C300, T1_PID, T2_C1, T2_C2, T2_PID 
FROM T1 INNER JOIN T2 ON T1.T1_PID=T2.T2_PID 

En utilisant cette dernière devrait fonctionner si soitT1 ou T2 a un indice PID.

+0

Merci pour l'indexment, je vais essayer. Il semble que j'ai juste besoin d'un PID CREATE INDEX sur T1 (T1_PID). Mes tables sont si énormes et je vais les chercher (je souhaite les charger dans la mémoire) en utilisant R. Je veux juste rejoindre sur les parties nécessaires de T1 et T2. – Yoda

Questions connexes