Nombre d'instruction maximum d'un bloc d'éxecution [Oracle] - SQL/NoSQL - Programmation
Marsh Posté le 12-07-2004 à 15:05:30
Sous Oracle 7, PL/SQL 2.0, la limite était de 64 Ko pour une procédure stockée ou un package. Mais attention :
- cette limite dépend du client. Ces 64 Ko sont valables pour un client Windows, pour Linux je sais pas
- cette limite de 64 Ko comprend le source + la représentation de la compilation de ce source. Ce qui fait qu'un source de 10 Ko peut très bien dépasser cette limite
Marsh Posté le 12-07-2004 à 15:10:32
Harkonnen a écrit : Sous Oracle 7, PL/SQL 2.0, la limite était de 64 Ko pour une procédure stockée ou un package. Mais attention : |
Merci
Comment je fais pour calculer la taille de la représentation de la compilation de mon source ?
EDIT: t'aurais un lien à ce sujet ?
ça a évolué dans Oracle 8i ou 9i ?
Marsh Posté le 12-07-2004 à 15:13:36
Peu importe sa taille (c'est ce qu'ils appellent le "parse tree" dans ton article), la requête qu'ils te donnent te permet de calculer la taille totale du paquet, source + représentation comprise. Il te reste qu'à vérifier que ça ne dépasse pas 64 Ko
Marsh Posté le 12-07-2004 à 15:22:47
La requête me renvoit 3 valeurs: SOURCE_SIZE, PARSED_SIZE et CODE_SIZE C'est lequel qui ne doit pas dépasser 64Ko ?
P.S. tu pourrais répondre à mon précédent edit stp ?
Marsh Posté le 12-07-2004 à 15:28:05
à mon avis, ce lien devrait répondre à toutes tes questions
http://members.fortunecity.com/dpa [...] ons_8i.htm
Marsh Posté le 12-07-2004 à 15:39:57
Harkonnen a écrit : à mon avis, ce lien devrait répondre à toutes tes questions |
Merci , je sais ce qu'il me reste à faire maintenant:
Marsh Posté le 12-07-2004 à 15:43:39
mareek a écrit : Merci , je sais ce qu'il me reste à faire maintenant: |
j'aimerais bien connaitre la limite de taille sous SQL Server tiens
Marsh Posté le 12-07-2004 à 15:47:18
Harkonnen a écrit : j'aimerais bien connaitre la limite de taille sous SQL Server tiens |
Perso, je m'en fous un peu, je n'ai pas besoin d'avoir recours à de tels bricolages pour avoir des perfs décentes sous SQL Server.
Marsh Posté le 12-07-2004 à 15:48:10
c'est clair... au niveau perfs y'a pas photo entre Oracle et SQL Server
Marsh Posté le 12-07-2004 à 16:10:21
/me se demande vraiment comment il va faire ...
Marsh Posté le 12-07-2004 à 17:12:11
j'y arrives pas
Marsh Posté le 12-07-2004 à 18:05:09
Marsh Posté le 12-07-2004 à 18:22:43
Harkonnen a écrit : à mon avis, ce lien devrait répondre à toutes tes questions |
t'aurais pas la même page pour Oracle 9i, j'ai l'impression que les limitations ne sont plus les mêmes
EDIT: D'après mes tests, la taille limite de mon bloc d'execution (qui lance n fois ma procedure stockée de test) semble aux alentours de 100Ko, ce qui me ferait penser que la taille maximale d'un programme est de 128Ko.
Marsh Posté le 13-07-2004 à 16:49:45
Bon, je m'en suis sorti en limitant la taille (le nombre de caractères en fait) de mon bloc BEGIN ... END; à 50Ko. J'espère que ça marchera sur les bases des clients
Marsh Posté le 13-07-2004 à 16:54:18
Hélas, je n'ai pas l'équivalent pour Oracle 9i, et je te parle même pas de 10g
Mais c'est pas impossible que la taille maximale ait augmenté, dans mon ex boite on avait reçu un commercial de chez Oracle, et on pestait justement contre la limitation des procédures à 64 Ko (on travaillait sur 7 et 8i), et à l'époque, il nous avait assuré, plaquettes à l'appui, que cette taille serait augmentée dans 9i, donc tous les espoirs sont permis
Marsh Posté le 13-07-2004 à 16:55:05
mareek a écrit : Bon, je m'en suis sorti en limitant la taille (le nombre de caractères en fait) de mon bloc BEGIN ... END; à 50Ko. J'espère que ça marchera sur les bases des clients |
Sinon je suppose qu'écrire un fichier texte et lancer un bon gros sql loader est complètement hors de propos...?
Marsh Posté le 13-07-2004 à 16:56:52
Harkonnen a écrit : Hélas, je n'ai pas l'équivalent pour Oracle 9i, et je te parle même pas de 10g |
Vu que la plupart des clients ont 8i (ici on a 9i), je crois que je vais baisser ma limite de taille .
Au fait, c'est une limitation du client ou du Serveur ?
Marsh Posté le 13-07-2004 à 16:57:19
skeye a écrit : Sinon je suppose qu'écrire un fichier texte et lancer un bon gros sql loader est complètement hors de propos...? |
ben j'aurais toujours cette limite à la con
Marsh Posté le 13-07-2004 à 16:59:56
mareek a écrit : ben j'aurais toujours cette limite à la con |
Euh j'en sais rien, ça dépend comment sqlloader fait ça, mais je suppose qu'il sait se démerder pour la contourner tout seul comme un grand!
Marsh Posté le 13-07-2004 à 17:00:35
mareek a écrit : |
Du client, en fait sur la 7 (et probablement sur 8i), ça vient du fait que Windows est incapable de gérer des blocs de plus de 64 Ko (explication made in Oracle à l'époque)
Marsh Posté le 13-07-2004 à 17:05:30
Harkonnen a écrit : Du client, en fait sur la 7 (et probablement sur 8i), ça vient du fait que Windows est incapable de gérer des blocs de plus de 64 Ko (explication made in Oracle à l'époque) |
Ils ne savent vraiment pas quoi inventer pour avoir des excuses les commerciaux d'Oracle
Marsh Posté le 13-07-2004 à 17:15:23
skeye a écrit : Euh j'en sais rien, ça dépend comment sqlloader fait ça, mais je suppose qu'il sait se démerder pour la contourner tout seul comme un grand! |
Je vois pas pourquoi SQL loader contournerait cette limitation alors que les autres n'y arrivent pas
Ou alors il execute les instructions une par une ce que je ne veux pas car c'est trop lent.
Marsh Posté le 13-07-2004 à 17:19:00
mareek a écrit : Je vois pas pourquoi SQL loader contournerait cette limitation alors que les autres n'y arrivent pas |
http://www.orafaq.com/faqloadr.htm
Citation : |
Ca peut être sympa ça non?
Marsh Posté le 13-07-2004 à 17:23:00
skeye a écrit : http://www.orafaq.com/faqloadr.htm
|
Le truc de bourrin
Bon, je garde ça sous le coude au cas où
Marsh Posté le 13-07-2004 à 17:23:38
mareek a écrit : Le truc de bourrin |
Ah ben toi qui voulais de la perf, ça devrait pas être trop mauvais ça...
Marsh Posté le 13-07-2004 à 17:24:53
mareek a écrit : Le truc de bourrin |
+1
Marsh Posté le 13-07-2004 à 17:26:43
Heureusement que les petits jeunes sont là pour te montrer les choses avant que tu embauches, toi!
Marsh Posté le 13-07-2004 à 17:31:04
skeye a écrit : Heureusement que les petits jeunes sont là pour te montrer les choses avant que tu embauches, toi!:o |
j'ai jamais utilisé SQL*Loader, au boulot on codait directement par SQL*NET
Marsh Posté le 13-07-2004 à 17:32:19
Harkonnen a écrit : j'ai jamais utilisé SQL*Loader, au boulot on codait directement par SQL*NET |
...et après on vient gueuler que ça marche pas...
Bon ok j'ai rien dit, j'ai découvert ça ya 2 semaines...:lol:
Marsh Posté le 13-07-2004 à 17:35:16
skeye a écrit : Ah ben toi qui voulais de la perf, ça devrait pas être trop mauvais ça... |
Le problème, c'est que si tu as une merde dans tes fichiers, tu bousilles ta base en moins de 2
Marsh Posté le 13-07-2004 à 17:37:37
mareek a écrit : Le problème, c'est que si tu as une merde dans tes fichiers, tu bousilles ta base en moins de 2 |
ah ben oui...mieux vaut être sûr du contenu de tes fichiers, là...
Ici on utilise sql*loader pour charger un fichier dans un table temporaire, et ensuite on a un traitement qui teste la cohérence et insère dans la bonne table, et surtout nous sort les erreurs éventuelles.
Marsh Posté le 13-07-2004 à 17:48:44
skeye a écrit : ah ben oui...mieux vaut être sûr du contenu de tes fichiers, là... |
Et malgré tout ce traitement, c'est quand même plus rapide qune insertion classique ?
Marsh Posté le 13-07-2004 à 17:50:28
mareek a écrit : Et malgré tout ce traitement, c'est quand même plus rapide qune insertion classique ? |
Aucune idée, je peux pas bencher, j'ai pas le code de ce qui se passe après avoir lancé le sql*loader.
Mais comme je te disais j'insère sans trop de problèmes 20/30000 enregistrements d'un coup sans que cela pose de problème...
Marsh Posté le 13-07-2004 à 17:51:16
skeye a écrit : Aucune idée, je peux pas bencher, j'ai pas le code de ce qui se passe après avoir lancé le sql*loader. |
ça prend combien de temps ? c'est quoi comme serveur ?
Marsh Posté le 13-07-2004 à 17:55:54
mareek a écrit : ça prend combien de temps ? c'est quoi comme serveur ? |
Le tout (sql*loader + traitements qui suivent) prend à vue de nez (très difficile à contrôler dans le contexte dans lequel je l'utilise) 3 à 4 minutes, sur une base en prod avec des traitements assez lourds régulièrement lancés dessus...
Bref, je peux pas vraiment te filer de chiffres fiables, je contrôle trop peu de ce qui se passe.
Marsh Posté le 13-07-2004 à 18:00:22
et pour le serveur c'est une machine assez costaud...un HP DS25, si mes souvenirs sont bons.
Marsh Posté le 13-07-2004 à 18:00:51
OK, merci quand même
(tiens, j'ai aussi envie de cracher sur Transact-SQL maintenant )
Marsh Posté le 13-07-2004 à 18:06:25
mareek a écrit : |
t'aurais pas été emmerdé comme ça avec SQL Server
Marsh Posté le 13-07-2004 à 18:10:45
Harkonnen a écrit : t'aurais pas été emmerdé comme ça avec SQL Server |
Je ne crache pas sur les SGBD sans raison, ce con de transact-SQL n'accepte pas qu'une fonction (un Convert par ex.) soit passée en paramètre d'une procedure stockée. Vachement pratique pour passer des dates à une procedure stockée
Marsh Posté le 12-07-2004 à 14:56:48
Comme je l'ai déjà expliqué dans mon précédent topic, je dois insérer un grand nombre d'enregistrement dans une base de données Oracle via les ADO. Après moult tests, la méthode la plus rapide est d'appeller n fois une procedure stockée (qui fait un seul insert) dans un bloc d'execution BEGIN ... END . Le problème, c'est que le nombre d'instructions dans un bloc PL/SQL est limité et que je ne connais pas la méthode pour calculer cette limite.
Tout ce que j'ai trouvé c'est ça:
Yes, the max size is not an explicit byte limit, but related to the parse tree that is created when you compile the code. You can run the following select statement to query the size of an existing package or procedure:
SQL> select * from dba_object_size where name = 'procedure_name';
http://www.orafaq.com/faqplsql.htm#BLKSIZE
J'ai lancé la requete dans TOAD mais je ne sais pas quoi faire des données qu'il me renvoit, ça reste assez flou (de plus cette requête ne fonctionne que pour un user avec des droits d'administrateur).
Si quelqu'un peut m'aider, je crois que je vais craquer
Merci d'avance
Message édité par mareek le 12-07-2004 à 15:03:19
---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack