2017-04-06 1 views
1

En postgreSQL 9.5:file_fdw table étrangère et postgres_fdw table étrangère

J'ai une table étrangère nommée: sheetheight (créé par file_fdw) et une table étrangère nommée: dzlog (créé par postgres_fdw).

1- Pour se joindre à des tables étrangères J'ai requête suivante:

SELECT * from dzlog INNER JOIN sheetheight ON dzlog.ullid = sheetheight.ullid;

et les EXPLAIN ANALYZE retours en arrière ceci pour la requête ci-dessus:

------------------------------------------------- 
Hash Join (cost=111.66..13688.18 rows=20814 width=2180) (actual time=7670.872. 
.8527.844 rows=2499 loops=1) 
    Hash Cond: (sheetheight.ullid = dzlog.ullid) 
    -> Foreign Scan on sheetheight (cost=0.00..12968.10 rows=106741 width=150) 
(actual time=0.116..570.571 rows=223986 loops=1) 
     Foreign File: D:\code\sources\sheetHeight_20151025_221244_0000000004987 
6878996.csv 
     Foreign File Size: 18786370 
    -> Hash (cost=111.17..111.17 rows=39 width=2030) (actual time=7658.661..765 
8.661 rows=34107 loops=1) 
     Buckets: 2048 (originally 1024) Batches: 32 (originally 1) Memory Usa 
ge: 4082kB 
     -> Foreign Scan on dzlog (cost=100.00..111.17 rows=39 width=2030) (ac 
tual time=47.162..7578.990 rows=34107 loops=1) 
Planning time: 8.755 ms 
Execution time: 8530.917 ms 
(10 rows) 

La sortie de requête ont deux colonnes nommées ullid.

ullid, la date, la couleur, sheetid, dz0, DZ1, DZ2, DZ3, DZ4, DZ5, dz6, DZ7, ullid, sheetid, passer ...

2- Pour directe accès au fichier csv et à la table locale sql de l'application python, j'ai: J'ai fait la même requête en n'utilisant pas les FDW mais l'accès direct au fichier csv et à la table locale postgreSQL d'une application python utilisant Pandas merge dataframe. Cette liaison est cru rejoindre, je récupère d'abord le fichier csv puis chercher la table SQL en utilisant la bibliothèque de pandas géants de python, puis je fusionner les deux dataframes sur la base des colonnes communes

import pandas as pd 
def rawjoin(query,connection=psycopg2.connect("dbname='mydb' user='qfsa' host='localhost' password='123' port=5433")): 
query=("SELECT * FROM dzlog;") 
    firstTable= pd.read_csv('.\sources\sheetHeight_20151025_221244_000000000498768789.csv', delimiter=';', header=0) 
    secondTable =pd.read_sql(query,connection) 
    merged= pd.merge(firstTable, secondTable, on= 'ullid', how='inner') 
    return merged 

Le résultat est les données jointes cadre avec une colonne ullide.

Une idée pour cette différence? Je l'ai fait d'autres types de jointures et le résultat d'un accès RAW et l'accès FDW sont les mêmes, d'autres questions sont les suivantes:

q7=("SELECT dzlog.color FROM dzlog,sheetheight WHERE dzlog.ullid = sheetheight.ullid;") 
q8=("SELECT sheetheight.defectfound FROM dzlog, sheetheight WHERE dzlog.ullid = sheetheight.ullid;") 
q9=("SELECT dzlog.color, sheetheight.defectfound FROM dzlog, sheetheight WHERE dzlog.ullid= sheetheight.ullid;") 

Répondre

1

Je ne sais pas ce que votre deuxième exemple est le cas, il est donc difficile de dire. Quelle bibliothèque est utilisée? Génère-t-il du SQL ou la jointure est-elle effectuée dans l'application (ce qui est presque toujours une perte de performance)? Si cela entraîne une instruction SQL, quelle est l'instruction?

La première requête renvoie la colonne deux fois, parce que vous avez demandé à retourner toutes colonnes de toutes tables impliquées, et les deux tables ont cette colonne, la jointure des forces de l'état d'être égaux.

Vous pouvez écrire une instruction SQL qui va afficher la colonne une seule fois comme ceci:

SELECT * 
FROM dzlog 
    JOIN sheetheight 
     USING (ullid); 

Cela ressemble étonnament le code dans votre deuxième exemple, non?

+0

Oui, la requête était le problème. votre requête est la bonne. – User193452