Je passe des questions sur un oracle 10g avec JDBC (en utilisant les derniers pilotes et UCP comme DataSource) afin de récupérer des clobs (avg. 20k caractères). Cependant, la performance semble être assez mauvaise: la récupération par lots de 100 lobes prend 4 ans en moyenne. L'opération n'est également ni des I / O ni de la CPU ni de la CPU NORS-NEWNOY à juger de mes observations.
Ma configuration de test ressemble à ceci: p> J'ai expérimenté la taille de la récupération mais en aucun cas. Est-ce que je fais quelque chose de mal? Existe-t-il un moyen d'accélérer la récupération de Clob lors de l'utilisation de JDBC? P> P>
4 Réponses :
La taille totale de l'ensemble de résultats se situe dans les dix mille - mesurées sur la portée de l'ensemble de la récupération des coûts initiaux p> blockQuote>
Y a-t-il une commande par la requête? Les lignes 10K sont beaucoup beaucoup si elles doivent être triées. P>
En outre, la récupération de la PK n'est pas un test équitable par rapport à la récupération de l'ensemble du clob. Oracle stocke les rangées de table avec probablement beaucoup dans un bloc, mais chacun des clobs (s'ils sont> 4k) seront stockés hors ligne, chacun d'une série de blocs. Numériser la liste des PK va donc être rapide. De plus, il y a probablement un index sur la PK, alors Oracle peut simplement numériser rapidement les blocs d'index et même ne pas accéder à la table. P>
4 secondes semble un peu élevé, mais il est de 2 Mo qui doit être possible pour lire du disque et transporté sur le réseau à votre programme Java. Réseau pourrait être un problème. Si vous effectuez une trace SQL de la session, il vous indiquera exactement où le temps est dépensé (lecture de disque ou réseau). P>
Mon expérience passée d'utiliser des données de type Oracle LOB pour stocker de grandes données n'a pas été bonne. C'est bien quand il est de moins de 4 km puisqu'il le stocke localement comme Varchar2. Une fois de plus de 4k, vous commencez à voir la performance dégrader. Peut-être que les choses peuvent être améliorées depuis que je l'ai déjà essayée il y a quelques années, mais voici les choses que j'ai trouvées dans le passé pour votre information: P>
Comme les clients ont besoin d'obtenir des lobes via Oracle Server, vous pouvez envisager la situation intéressante suivante. P>
Vous avez mentionné 4s pour 100 lobes de AVG 20K, il est donc de 40 ms par lobes. N'oubliez pas que chaque LOB doit avoir à récupérer via une locature LOB séparée (ce n'est pas dans le résultat défini par défaut). C'est un aller-retour supplémentaire pour chaque lob, je suppose (je ne suis pas sûr à 100%, car il y a quelque temps) si tel est le cas, je suppose que ce sera au moins 5 ms plus de temps supplémentaire par tour de retour en série , droit? Si tel est le cas, votre performance est déjà d'abord limitée par des extrailles de lob séquentielles. Vous devriez pouvoir vérifier cela en suivant le temps passé dans l'exécution SQL VS LOB Content Fetking. Ou vous pouvez vérifier cela en excluant la colonne LOB comme suggéré par la réponse précédente dans le poteau, qui devrait vous dire si elle est liée à LOB. P>
bonne chance p>
Merci pour toutes les suggestions utiles. Bien qu'il soit signalé comme répondant au problème, ma réponse est qu'il ne semble y avoir aucune bonne solution. J'ai essayé d'utiliser des relevés parallèles, des caractéristiques de stockage différentes, Temp. tables et autres choses. L'opération semble ne pas être liée à une caractéristique visible via des traces ou d'expliquer des plans. Même la requête parallélique semble être sommaire lorsque des clobs sont impliqués. P>
Il y aurait sans aucun doute de meilleures options pour traiter avec de gros clobs (en particulier la compression) dans un environnement de 11 g mais guichet automatique. Je suis coincé avec 10g. P>
J'ai opté maintenant pour une étape supplémentaire à la base de données dans laquelle je préproduit les clobs dans une taille optimisée binaire brute. Dans les déploiements précédents, cela a toujours été une option très rapide et vaudra probablement la peine de maintenir un cache calculé hors ligne. Le cache sera invalidé et à la mise à jour à l'aide d'un processus persistant et de AQ jusqu'à ce que quelqu'un propose une meilleure idée. p>
On dirait une bonne solution de contournement comme si vous récupérez 100 rangées, vous paierez une addition aller-retour mais économisez 100 rounds, totalement vous économisez 100-1 = 99 voyages ronds. Mais comment l'avez-vous impliqué?
En récupérant uniquement les clobs + une clé pour les identifier plus tard et les écrire dans une boutique de valeur locale. J'ai utilisé Oracle Berkeley DB mais vous pouvez facilement utiliser SQLite ou Quelque chose d'autre que je suppose.
J'ai eu un problème similaire et j'ai trouvé les lobes JDBC faisant un appel réseau lors de l'accès aux LOBS.
AS du pilote Oracle 11.2G JDBC Vous pouvez utiliser une préfetchie.
Cet accès accéléré de 10 fois ... p>
Comment avez-vous déterminé que ce n'est pas lié au réseau? Vous parlez de la mise en place d'une nouvelle connexion JDBC (chère), de 2 Mo de données à lire à partir du disque, d'envoyer-la sur le réseau et de la surcharge de la requête (qui n'est pas spécifiée). Je ne sais pas si 4S est tout ce mauvais en fonction de la configuration de votre réseau et de la configuration de la base de données.
Clarification: Je mesure dans unités i> de 100 afin que la pénalité initiale de la connexion ne compte pas. Le débit de réseau total reste inférieur à 2Mbit / s, donc je suppose que ce n'est pas relié au réseau.
Combien de temps dure la requête réelle?
Environ 3 secondes. Je ne pense pas que la complexité de la requête a quelque chose à voir avec le débit, bien que (je n'utilise pas de first_rows i> indice ou quoi que ce soit ésotérique). La taille totale de l'ensemble de résultats se situe dans les dix mille - mesurées sur l'étendue de l'ensemble de la récupération des coûts initiaux (connexion JDBC, retour de requête) ne sont pas pertinentes.
Pouvez-vous essayer de mesurer la différence entre la récupération de la colonne de la CLOB et une colonne non indexée plus «normale», mais en utilisant les mêmes tables, des jointures et des clauses? Cela devrait vous donner un temps d'indication que le problème est causé par le clob ou l'accès à la ligne.
Il suffit de récupérer la clé primaire de la table contenant du clob prend environ 0,3 pour 10k rangées.
Avez-vous essayé de les sélectionner à l'aide de SQLPlus ou de toute autre application (Oracle SQL Developer?!). Est-ce que vous interrogez-vous prendre du temps. Avez-vous essayé `Expliquer le plan pour Select BigClob de ... '?