9
votes

Problèmes de performance avec JDBC

Je suis actuellement confronté à un problème dans lequel une requête SQL spécifique prend environ 30 secondes pour émettre depuis mon application Java, mais dans la question,
Requête lente en Java par JDBC mais pas Dans d'autres systèmes (TOAD) , il est suggéré que l'utilisation d'une installation préparée liée aux variables Java pourrait rendre la requête exécutée de loin plus lente que dans le client SQL (TOAD dans ce cas), car Oracle se confondre de quels index à utilisation. Cela pourrait-il être un problème avec une estabilité de préparation sans paramètres? P>

Que pourrait-il être le problème? P>

La requête ressemble à quelque chose comme p> xxx pré>

où la vue_ est une vue complexe contenant des agrégations de tables et d'autres vues complexes. La requête est exécutée comme une estabilité préparée mais sans aucun paramètre. Il ne semble pas faire la différence si nous utilisons une déclaration préparée ou simplement des déclarations simples. P>

Étant donné que le plan d'exécution est assez énorme, je ne peux pas publier tout si c'est ici, mais la différence correspondante semble être : P>

UNION-ALL 
TABLE ACCESS BY INDEX ROWID GVC_WH.PLAYER_FACT_DAILY TABLE 38 2657 236.120 2429 30 20544658 2428 
INDEX RANGE SCAN GVC_WH.PK_AGG_PLAYER INDEX (UNIQUE) 37 2657 16 1 638743 16 


8 commentaires

Pouvez-vous obtenir et poster les plans de requête pour les deux cas? Et juste pour la clarté, êtes-vous cohérent de la façon dont vous mesurez la performance? Il est quelque peu courant de mesurer accidentellement le temps lorsque SQL Developer renvoie la première rangée par rapport à l'heure que votre code Java récupère la dernière ligne qui peut être sensiblement différente.


Je commencerais en examinant le plan d'exécution (via dbms_xplan.display curseur) généré par chaque méthode (TOAD vs. Java). Cela devrait vous dire si la base de données traite les requêtes différemment. Si tel est le cas, prenez une attention particulière à la section des prédicats, car cela vous donnera probablement des indices sur la raison pour laquelle (par ex. La conversion de type de données implicite se produit à partir de la version Java et provoquant Oracle de ne pas pouvoir utiliser un index)


Voir aussi Stackoverflow.com/Questtions/3976184/...


Spécifiez-vous le paramètre de date de date dans votre appel TO_Date? Je pense que le motif par défaut dépend de vos paramètres locaux et peut être différent du code Java ou du crapaud.


Cela fait-il une différence si vous divisez vos requêtes dans Sélectionnez Get_Time_ID (TO_Date ('2010-10-10', 'AAAYY-MM-DD')) à partir de Dual puis transmettez-le dans un Déclaration avec ... où time_id =?


Hej! Avez-vous eu plus de choses à ce sujet? Je vois le même problème, où une requête de SQLDEveloper (probablement à l'aide d'un mince pilote JDBC) prend 0,7 seconde et la même requête de mon serveur d'applications prend 30 secondes ou plus.


KARLP: Non Désolé, nous n'avons pas encore eu de plus en détail. L'entrepôt a été restructuré avant d'avoir eu la chance de le résoudre.


Et je suis passé à une autre entreprise il y a environ un an ...


3 Réponses :


1
votes

Il est très possible que vous frappiez peut-être des problèmes de pic variable de liaison en raison des prédicats étant transmis. Essayez d'exécuter la requête avec les éléments suivants pour confirmer (c.-à-d. Temps d'exécution cohérents)

alter session set “_optim_peek_user_binds”=false;


2 commentaires

Quelles variables parlez-vous? Comme je l'ai dit, la déclaration préparée est sans paramètres. La différence de performance est également des ordres de grandeur pour récupérer uniquement une seule ligne. Les statistiques sont à jour.


Selon la valeur du paramètre Cursor_Sharing Oracle peut forcer les variables de liaison sur les relevés. télécharger.oracle.com/docs/cd/b19306_01/ Server.102 / B14237 / ...



2
votes

Je voudrais essayer d'exécuter un Trace sur la base de données tout en utilisant l'application.

Ensuite, vous devriez être capable de voir la requête étant exécutée et le plan d'exécution réel. Cela vous montrera exactement ce qui se passe, c'est-à-dire qu'il s'agisse de ramasser les index ou non.


0 commentaires

0
votes

Vérifiez que quelqu'un n'a pas défini la propriété oracle.jdbc.defaultnchar = true

Ceci est parfois fait pour résoudre les problèmes Unicode, mais cela signifie que toutes les colonnes sont traitées comme nvarchars. Si vous avez un index sur une colonne Varcharne, il ne sera pas utilisé car Oracle doit utiliser une fonction pour convertir le codage du personnage.


0 commentaires