tag:blogger.com,1999:blog-4063906708258638821.post7596419103284392758..comments2022-12-27T09:54:27.671-03:00Comments on El Blog de Leonardo Horikian: ¿Tunear en base al COSTO del plan de ejecución?Leonardo Horikianhttp://www.blogger.com/profile/15192319884550377591noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-4063906708258638821.post-91495406237418273772009-09-01T23:59:25.398-03:002009-09-01T23:59:25.398-03:00Hola Silvina,
Tu pregunta va referida a cuándo co...Hola Silvina,<br /><br />Tu pregunta va referida a cuándo conviene utilizar cursores implicitos (SELECT...INTO / FOR...LOOP) y cuándo conviene utilizar cursores explicitos (cursor).<br />La verdad que este tema es para hablarlo bastante, pero voy a tratar de ser lo más claro y resumido que sea posible.<br /><br />CURSORES IMPLÍCITOS:<br />--------------------<br /><br />Con ésta clase de cursores, PL/SQL hace la mayoría del trabajo por nosotros ya que no tenemos que abrir, cerrar, declarar ni hacer un fetch explícitamente con un cursor implícito.<br /><br />Tendríamos que utilizar ésta clase de cursores si...<br /><br />1) Cuando estamos leyendo al menos un registro de la consulta.<br />2) Cuando estamos leyendo un número limitado de registros.<br /><br />CURSORES EXPLÍCITOS:<br />--------------------<br /><br />Con ésta clase de cursores, PL/SQL nos deja que hagamos todo el trabajo nosotros. Tenemos que abrir, cerrar, declarar, fetchear los registros y por sobre todo, controlar un cursor explícito.<br /><br />RESUMEN:<br />--------<br /><br />Si tenemos que hacer un fetch de un sólo registro, deberíamos utilizar cursores implícitos (SELECT...INTO). No sólo ganamos performance, sino que también, ganamos el código extra que PL/SQL agrega internamente que nos ayuda a protegernos para que no nos olvidemos datos, o datos que por algún motivo tienen más registros de lo esperado.<br />Si estamos procesando pocos registros, los cursores implícitos (FOR...LOOP) son excelentes ya que hace sencilla la programación, reduce el código a programar y por sobre todo, nos ayuda a evitar errores que muchas veces suceden al utilizar cursores explícitos.<br />Si estamos procesando cientos de registros o más, nos conviene utilizar cursores explícitos con la cláusula BULK COLLECT y LIMIT. Por otro lado, si estamos utilizando SQL dinámicos (que nunca aconsejo utilizarlos a no ser que sea estrictamente necesario), no podemos utilizar cursores implícitos, si o si, tenemos que utilizar cursores explícitos.<br /><br />SaludosLeonardo Horikianhttps://www.blogger.com/profile/15192319884550377591noreply@blogger.comtag:blogger.com,1999:blog-4063906708258638821.post-20819204662349000392009-09-01T10:33:04.397-03:002009-09-01T10:33:04.397-03:00Hola Leonardo,
mi nombre es Silvina, y antes que n...Hola Leonardo,<br />mi nombre es Silvina, y antes que nada quiero felicitarte por tu blog, me fue muy util, me ayudo a resolver algunas dudas.<br />Y quisiera hacerte una consulta sobre performance.<br />Cuando se realiza una consulta para recuperar un registro de una tabla, conviene usar un SELECT...INTO o un cursor???<br />Y me gustaria que me comentaras porque es mas conveniente uno que otro.<br /><br />Muchas gracias.<br />Silvina.Unknownhttps://www.blogger.com/profile/02037288799555420716noreply@blogger.comtag:blogger.com,1999:blog-4063906708258638821.post-61581995822617368522008-09-16T16:30:00.000-03:002008-09-16T16:30:00.000-03:00Hola Erika,El error SP2-0618 es debido a que el us...Hola Erika,<BR/><BR/>El error SP2-0618 es debido a que el usuario que está ejecutando el AUTOTRACE no tiene granteado el rol PLUSTRACE...<BR/><BR/>SELECT grantee, <BR/>FROM dba_role_privs<BR/>WHERE granted_role = 'PLUSTRACE';<BR/><BR/>SaludosLeonardo Horikianhttps://www.blogger.com/profile/15192319884550377591noreply@blogger.comtag:blogger.com,1999:blog-4063906708258638821.post-11668372008062848162008-06-11T05:33:00.000-03:002008-06-11T05:33:00.000-03:00Hola Leonardo:Me llamo Puri Ruiz. Llevo años traba...Hola Leonardo:<BR/>Me llamo Puri Ruiz. Llevo años trabajando con Oracle, desarrollando pl/sql, tu blog me parece fántástico actualmente estoy empezando a introducirme en el tuning y la información que transmites me parece clara y organizada, la seguiré detalladamente.<BR/>Un saludo, Puri RuizAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-4063906708258638821.post-73360186511276528392008-05-28T10:38:00.000-03:002008-05-28T10:38:00.000-03:00Hola Leandro,Paso a explicarte. El índice que crea...Hola Leandro,<BR/><BR/>Paso a explicarte. El índice que creaste vos, seguramente es un índice del tipo B*Tree (en tu caso un índice único). Supongamos que creaste éste índice:<BR/><BR/>CREATE UNIQUE INDEX id_uq ON t(id);<BR/><BR/>Si por ejemplo, ahora ejecutas:<BR/><BR/>SELECT 'test' FROM t WHERE id = 100;<BR/><BR/>Para encontrar el ID 100, Oracle comienza leyendo la estructure del árbol del índice B*Tree. Empieza por el nodo root, luego navega por el nodo branch y finalmente lee los registros necesarios en los nodos leaf (son los nodos que contienen los registros indexados).<BR/>Por cada vez que Oracle lee un nodo/bloque, se realiza un LIO. <BR/>En el ejemplo que muestro, la consulta realiza 3 LIO's porque accede a 3 nodos para encontrar el ID 100. <BR/>Si por el contrario, ejecutamos ésta consulta:<BR/><BR/>SELECT nombre FROM t WHERE id = 100;<BR/><BR/>Estariamos realizando 4 LIO's porque la columna "nombre" no es parte del índice, por lo cual, tenemos que realizar 1 LIO adicional para ir a buscar a la tabla el valor de esa columna.<BR/><BR/>La siguiente consulta puede ayudarte un poco más a entender el árbol del índice B*Tree:<BR/><BR/>SELECT blevel, blevel+1 height, leaf_blocks<BR/>FROM dba_indexes<BR/>WHERE index_name = 'ID_UQ';<BR/><BR/>BLEVEL = Este número representa el nivel del nodo root más el nodo branch.<BR/>HEIGHT = Este número representa la altura total del árbol del índice.<BR/>LEAF_BLOCKS = Este número representa la cantidad de nodos leaf del árbol del índice.<BR/><BR/>Saludos.Leonardo Horikianhttps://www.blogger.com/profile/15192319884550377591noreply@blogger.comtag:blogger.com,1999:blog-4063906708258638821.post-55540692903525998622008-05-27T16:18:00.000-03:002008-05-27T16:18:00.000-03:00Leonardo:Muy bueno tu blog, mi monbre es Leandro.T...Leonardo:<BR/><BR/>Muy bueno tu blog, mi monbre es Leandro.<BR/><BR/>Te queria preguntar algo:<BR/><BR/>Al agregarle un indice unico, el plan de ejecucion arrojo 3 LIO's.<BR/>Me podes explicar por que son 3 las lecturas? y no 2. No deberia ser una lectura para el indice y otra para obtener el valor donde apunta el indice?<BR/><BR/>Saludos.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-4063906708258638821.post-18846809847082808652008-04-17T18:07:00.000-03:002008-04-17T18:07:00.000-03:00Hola Leonardo.Me llamo Erika, mexicana y estoy ini...Hola Leonardo.<BR/><BR/>Me llamo Erika, mexicana y estoy iniciandome en esto de tunear y mi problema es con una consulta que consume mucha memoria en su ejecución y pues leyendo tu artículo estaba cayendo yo también en checar el COSTO, pero al querer ver las estadisticas me sale un error y no se como resolverlo..me puedes ayudar por favor. El error es el siguiente:<BR/>SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled<BR/>SP2-0611: Error enabling STATISTICS report<BR/><BR/>Otra cosa, me podrías también orientar acerca de que son los LIO's.<BR/><BR/>En verdad agradezco tu ayuda y te felicito por tu blog.Erikahttps://www.blogger.com/profile/12547216133500531425noreply@blogger.comtag:blogger.com,1999:blog-4063906708258638821.post-11902748970419453872008-04-17T16:36:00.000-03:002008-04-17T16:36:00.000-03:00hola leonardo.Me llamo Erika, mexicana y debo conf...hola leonardo.<BR/><BR/>Me llamo Erika, mexicana y debo confesar que estoy iniciando a tunear mis consultas y tu blog me ha parecido de lo más interesante además de ilustrativo..mi duda es que al momento de querer visualizar las estadisticas para ver el valor de los I/O lógicos me marca el siguiente error<BR/><BR/>SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled<BR/>SP2-0611: Error enabling STATISTICS report<BR/><BR/>También me gustaría me explicaras un poco más que son los LIO's.<BR/><BR/>En verdad te agradezco el tiempo que te des para contestarme y te felicito por tu blog.Erikahttps://www.blogger.com/profile/12547216133500531425noreply@blogger.com