Salut les utilisateurs de JMP. Lors de l'utilisation de JMP Query Builder, nous avons une réponse rapide pour les serveurs SQL utilisant "ODBC Driver 11 for SQL Server", mais une réponse lente sur certains serveurs Oracle utilisant "Oracle in OraClient11g", de l'ordre de 2 à 3 minutes.Nous avons découvert par accident que cela fonctionnait très bien en utilisant l'argument Custom SQL() dans la fonction New SQL Query() dans le script, au lieu d'utiliser le script généré à partir de JMP Query Builder.
Quelqu'un d'autre a-t-il vu une réponse lente d'Oracle ODBC ?
Une partie du problème, si je comprends bien, est que notre compte de connexion pour cette base de données Oracle ne permet pas d'afficher certaines tables dans certains schémas sur le serveur, de sorte que le générateur de requêtes prend du temps lors du premier chargement pour les contourner. Vous ne pourrez peut-être pas répliquer si votre accès à la base de données inclut tous les schémas et tables. La soumission directe de SQL personnalisé contourne cette analyse des schémas et des tables ?
Dans l'exemple ci-dessous, en utilisant Query Builder, des colonnes sélectionnées et un filtre. Il a fallu 147 secondes pour exécuter un million de lignes. Maintenant, à partir de Query Builder, sélectionnez le SQL dans l'onglet SQL ou utilisez l'élément de menu "Convertir en SQL personnalisé" et copiez le SQL personnalisé (ou exécutez la requête à partir de la fenêtre SQL personnalisé) et collez-le comme argument pour Personnalisé SQL(), et cela n'a pris que 7 à 8 secondes pour un million de lignes.
// this is the JSL script generated by JMP Query Builder and saved to the datatable
// takes ~ 147 seconds to run
t1 = Tick Seconds();
New SQL Query(
Version( 130 ),
Connection(mycon),
QueryName( "Test1_147s" ),
Select(
Column( "X1", "t1" ),
Column( "X2", "t1" ),
Column( "X3", "t1" ),
Column( "X4", "t1" ),
Column(
"LAST_UPDATE_DATE",
"t1",
Numeric Format( "m/d/y h:m:s", "0", "NO", "" )
)
),
From( Table( "MY_DATABASE_TABLE", Schema( "SCHEMA" ), Alias( "t1" ) ) ),
Where(EQ(Column( "X2", "t1" ),"AAAA",UI( Comparison( Base( "Categorical" ) ) )))
) << Run foreground;
t2 = Tick Seconds();
t2-t1; // 147 seconds
// Now just copy the SQL code and put into the CustomSQL argument
// takes ~ 8 seconds to run
t1 = Tick Seconds();
New SQL Query(
Connection(mycon),
QueryName( "Test2_8s" ),
CustomSQL(
"SELECT t1.X1, t1.X2, t1.X3, t1.X4,
t1.LAST_UPDATE_DATE
FROM SCHEMA.MY_DATABASE_TABLE t1
WHERE ( ( ( t1.X2 = 'AAAA' ) ) )"
)
) << Run foreground;
t2 = Tick Seconds();
t2-t1; // 8 seconds
Pour nos meilleures pratiques JMP Query Builder, vous devrez maintenant montrer comment exécuter et enregistrer la requête et la table de données à partir de la fenêtre SQL personnalisé pour les bases de données Oracle.
Merci pour les données de performances. Il semble que vous ayez une solution.
Il sera intéressant de voir si JMP a quelques idées ou suggestions à partager.
Merci pour ces conseils ! J'ai fait d'autres tests.
Je vois l'effet d'un deuxième appel à la base de données Oracle, mais je vois toujours l'ordre de grandeur de la différence entre les deux techniques JSL. Je n'ai qu'à me déconnecter de JMP14 pour tester cela. Si j'exécute le test sur le schéma lent, la première fois que Custom SQL() prend 0,4 seconde. Si je répète des exécutions du script Custom SQL() dans la session en cours de JMP, il est réduit à 0,06 seconde.Mais cela n'aide pas pour le code standard de Query Builder, prend 120 secondes quoi qu'il arrive. Je crois que le changement de 0,4 à 0,06 entre le 1er et le 2ème appel à la base de données Oracle, s'il se produit pour le schéma lent, est dans le bruit des tests de répétition toujours autour de ~ 120 secondes.
J'ai également testé un schéma "rapide". La première exécution de SQL personnalisé est également d'environ 0,4 s, puis réduit à 0,06 seconde pour les appels suivants dans la session active. Pour le code Query Builder standard, le premier appel dure 1,2 s, les appels suivants dans la session JMP active sont réduits à 0,8 s.
À partir de ces tests, voir une réduction d'environ 0,3 s pour un appel répété à la base de données Oracle car il rappelle une dernière requête quel que soit le schéma pour Custom SQL(), mais ne la voit pas dans le schéma "lent" à l'aide du script Query Builder style.
Ici, nous n'aimons pas la méthode Open Database/Close Database (nous craignons de suspendre une base de données ouverte), nous préférons utiliser le Query Builder, mais nous devrons utiliser la méthode Custom SQL() et capturer le code SQL du Query Builder interface utilisateur.
Ce ne sont que quelques commentaires d'expérience:
- Oracle rappelle une dernière requête, donc souvent le deuxième appel est plus rapide que le premier. Pour tester cela, fermez votre connexion et déconnectez-vous de votre système (vous avez donc un nouvel ID utilisateur système), puis exécutez seul votre deuxième requête et obtenez le temps de performance. Vérifiez s'il est moins proche de 8 secondes ou beaucoup plus grand ou proche de 147 secondes.
- Les experts JMP devront vérifier ce qui se passe réellement, mais il semble que JMP ait créé la table puis exécuté les instructions de requête dans la première nouvelle requête SQL(). Et éventuellement la deuxième nouvelle requête SQL(), JMP envoie simplement l'instruction sql à la base de données et renvoie les résultats.
- Lorsque j'exécute la même requête ou une requête similaire sur des jours différents, j'aime utiliser Query Builder pour créer et tester la requête.Ensuite, j'obtiens le SQL et j'écris mon script pour utiliser Open Database( "chaîne de connexion", "querystring", "tablename");
Bonne chance!