Je dois obtenir des informations à partir de deux bases de données. L'un est un ORACLE et l'autre est un DB2. Dans mon programme (C#) j'obtiens dans la première étape les informations de base de mes objets de la base de données ORACLE. Dans la deuxième étape, je veux ajouter les informations qui sont enregistrées dans le DB2. La table dans DB2 a une clé primaire composite et je ne suis pas sûr de savoir quelle est la meilleure façon de demander ou s'il y a une alternative que je ne vois pas pour le moment.Demande SQL avec clé primaire composite
Par exemple: COLUMN1 et COLUMN2 sont la clé primaire composite.
Variante 1:
SELECT *
FROM (SELECT COLUMN1, COLUNN2, COLUMN3, ..., COLUMN1||'_'||COLUMN2 AS ID
FROM TABLE1) AS TEMP
WHERE ID='2011_123456'
OR ID='2011_987654'
Ici, je pense que l'inconvénient est que pour chaque ligne de la table la concaténation de chaîne est construit ainsi que la vitesse d'exécution est relativement lente parce que les colonnes de clé primaire sont indexées et le nouveau on n'est pas.
Variante 2:
SELECT COLUMN1, COLUMN2, COLUMN3, ..., COLUMN1||'_'||COLUMN2 AS ID
FROM TABLE1
WHERE (COLUMN1='2011' AND COLUMN2='123456')
OR (COLUMN1='2011' AND COLUMN2='987654')
Celui-ci est vraiment rapide, mais quand je reçois un SQL0954C d'exception (Pas assez de stockage est disponible dans le tas d'application pour traiter l'instruction).
Variante 3:
SELECT COLUMN1, COLUMN2, COLUMN3, ..., COLUMN1||'_'||COLUMN2 AS ID
FROM TABLE1
WHERE COLUMN1 IN ('2011')
AND COLUMN2 IN ('123456','987654')
Celui-ci est aussi lent par rapport à la variante 2.
Quelques chiffres plus Table1 a au moment environ. 600k lignes
J'ai essayé les variantes et a obtenu les temps d'exécution suivantes:
Pour 100 objets demandés:
Variante 1: 3900ms
Variante 2: 218ms
Pour 400 objets demandés:
Variante 1: 10983ms
Variante 2: 266ms
Pour 500 objets demandé:
Variante 1: 12796ms
V ariant 2: exception SQL0954C
Variante 3: 7061ms
Seulement en regardant les temps je préférerais la variante 2 mais il y a le problème avec l'exception.
Les bases de données ne sont pas sous mon contrôle et je n'ai que des droits SELECT. Que pensez-vous être le meilleur pour ce cas d'utilisation? Y a-t-il d'autres possibilités que je ne vois pas?
Cordialement,
pkoeppe
Si COLUMN_1 et COLUMN_2 contiennent des données purement numériques, pourquoi transmettez-vous les opérandes sous forme de chaînes? – APC
De même, où obtenez-vous les valeurs cibles pour COLUMN_1 et COLUMN_2? Êtes-vous vraiment en train d'assembler dynamiquement vos instructions SELECT? Que se passe-t-il vraiment ici? – APC
Les colonnes sont de type char. – pkoeppe