tag:blogger.com,1999:blog-26801181.post114626350234965876..comments2023-10-18T20:16:44.581+02:00Comments on Programación PL/SQL: Puesta a punto de sentencias SQL (Tuning PLSQL 1)JLPMhttp://www.blogger.com/profile/00891045835734721638noreply@blogger.comBlogger10125tag:blogger.com,1999:blog-26801181.post-17157850763642873492011-06-11T17:13:40.137+02:002011-06-11T17:13:40.137+02:00Hola Latosso, el optimizador de la base de datos O...Hola Latosso, el optimizador de la base de datos Oracle empleará un plan de ejecución un otro dependiendo de los valores que tomen los parámetros. Si alguno es nulo simplemente eliminará esa condición del WHERE.JLPMhttps://www.blogger.com/profile/00891045835734721638noreply@blogger.comtag:blogger.com,1999:blog-26801181.post-91101317432579553832011-06-06T19:23:21.805+02:002011-06-06T19:23:21.805+02:00Antes que nada una felicitacion por tu blog, tiene...Antes que nada una felicitacion por tu blog, tiene muchos tips utiles.<br />Ahora mi duda<br />Me podrias explicar cuando afecta al performance consulta que en el where tengan :<br />AND campo1 = NVL(:P_parametro1,campo1 )<br />AND campo2 = NVL(:P_parametro2,campo2 )<br /><br />Y si afecta cual seria el mejor metodo para optimizar cuando se tenga la necesida de este tipo de consultas.<br /><br />Saludos y Gracias.Latossohttps://www.blogger.com/profile/02193850317621167265noreply@blogger.comtag:blogger.com,1999:blog-26801181.post-50767726912394728462011-05-04T16:35:26.521+02:002011-05-04T16:35:26.521+02:00Hola Jesús,
Mejorar el rendimiento de una sentenc...Hola Jesús,<br /><br />Mejorar el rendimiento de una sentencia PL/SQL sin conocer el entorno que la rodea es complicado. El rendimiento debe mejorar con sólo crear los índices adecuados. <br /><br />De todas formas a bote pronto se me ocurre que el rendimiento debe mejorar dividiendo la sentencia en dos SELECT:<br /><br />SELECT SUM(a.t_doc)<br />INTO t_ingresos<br />FROM movs_almacen_item a<br />WHERE a.t_cod IN (101, 103)<br />AND a.idorganizacion = 1002<br />AND estado = 0<br />AND to_char(fecha_movimiento,'yyyymm') = wperiodo<br />AND idbienser = tc1.idbienser;<br /><br />SELECT SUM(a.t_doc)<br />INTO t_salidas<br />FROM movs_almacen_item a<br />WHERE a.t_cod = 102<br />AND a.idorganizacion = 1002<br />AND estado = 0<br />AND to_char(fecha_movimiento,'yyyymm') = wperiodo<br />AND idbienser = tc1.idbienser;JLPMhttps://www.blogger.com/profile/00891045835734721638noreply@blogger.comtag:blogger.com,1999:blog-26801181.post-72175545404268283072011-05-03T19:29:23.320+02:002011-05-03T19:29:23.320+02:00Hola Pepelu
quisiera que me ayudes con este select...Hola Pepelu<br />quisiera que me ayudes con este select para hacerlo mas rapida su consulta de mi db ya que esta muy lenta<br />Ejem:<br /> select<br /> nvl(sum(decode(a.t_doc,101,a.cantidad,0))+sum(decode(a.t_doc,103,a.cantidad,0)),0)<br /> ,nvl(sum(decode(a.t_doc,102,a.cantidad,0)),0)<br /> into t_ingresos, t_salidas<br /> from movs_almacen_item a<br /> where a.idorganizacion = 1002<br /> and estado = 0<br /> and to_char(fecha_movimiento,'yyyymm') = wperiodo<br /> and idbienser = tc1.idbienser;<br />Gracias por tu ayudaAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-26801181.post-2048320258335171102008-04-07T19:44:00.000+02:002008-04-07T19:44:00.000+02:00Primero intentaría modificar la consulta utilizand...Primero intentaría modificar la consulta utilizando en todos los <I>OR</I> alguna columna pura (sin función) sobre la que existiese un índice (<I>first_name</I> o <I>last_name</I>) para ver si de alguna manera me valen los resultados entregados.<BR/><BR/>Si necesitas algún <I>OR</I> donde ambos <I>AND</I> utilicen funciones sobre campos de la tabla, entonces yo añadiría nuevas columnas a la tabla cuyo contenido sean los valores de las funciones y luego crearía índices para las parejas de datos que comparas en los diferentes <I>OR</I>.<BR/><BR/>No es una solución muy "limpia" pero es la única forma en la que puedes evitar el <I>full scan</I>.<BR/><BR/>Ten en cuenta que a lo mejor el optimizador no es lo suficientemente inteligente para aplicar un índice diferente a cada <I>OR</I>, pero lo que si puedes hacer es dividir la consulta en varias, una para cada <I>OR</I>, y posteriormente utilizar el comando <I>UNION</I> para unirlas, de esta manera el optimizador podrá usar diferentes índices.<BR/><BR/>Creo que si tienes más dudas lo mejor es que usemos el email (pepelublog[arroba]gmail[punto]com).JLPMhttps://www.blogger.com/profile/00891045835734721638noreply@blogger.comtag:blogger.com,1999:blog-26801181.post-77042852887644298692008-04-07T18:52:00.000+02:002008-04-07T18:52:00.000+02:00hola nuevamente pepelu.Gracias x haber contestado ...hola nuevamente pepelu.<BR/><BR/>Gracias x haber contestado a mi pregunta y pues realmente tienes razón ya que no fuí del todo explicita en lo que te quería preguntar.<BR/><BR/>Mi consulta la estoy realizando sobre una sola tabla y mi objetivo es utilizarla en un procedimiento para obtener de acuerdo a un nombre tecleado los registros que más se le parezcan a dicho nombre. La consulta es la siguiente:<BR/><BR/>SELECT /*+first_rows*/ /*+ INDEX(CYT_USUARIO_IDX1) */ UPPER (FIRST_NAME), UPPER(LAST_NAME), UPPER (SECOND_LAST_NAME), OPRID FROM CYT_USUARIOS<BR/>WHERE FIRST_NAME = nombres_aux<BR/>AND LAST_NAME = paterno_aux<BR/>OR SUBSTR(FIRST_NAME,1,4) = SUBSTR(nombres_aux,1,4)<BR/>AND SUBSTR(LAST_NAME,1,4) = SUBSTR(paterno_aux,1,4)<BR/>OR SUBSTR(FIRST_NAME,1,1) = DECODE(instr(nombres_aux,' '),0,'',SUBSTR(nombres_aux,(INSTR(nombres_aux,' ')+1),1))<BR/>AND SUBSTR(LAST_NAME,1,4) = SUBSTR(paterno_aux,1,4)<BR/>OR SUBSTR(FIRST_NAME,(INSTR(FIRST_NAME,' ')+1),1) = SUBSTR(nombres_aux,1,1)<BR/>AND LAST_NAME = paterno_aux<BR/>OR SOUNDEX(FIRST_NAME) = SOUNDEX(nombres_aux)<BR/>AND SOUNDEX(LAST_NAME) = SOUNDEX(paterno_aux)<BR/><BR/>El problema que tengo es de concurrencia ya que como te comente la utilizo en un procedimiento y hay ocasiones que es utilizado hasta por 10 personas.<BR/><BR/>La he analizado mediante el explain plan y cuando utilizo el substr o el soundex hace un full table y aumenta el costo.<BR/><BR/>Espero haber sido explicita y de antemano agradezco tu respuesta y te felicito por tu blogg, esta super chido y no sabes la gran ayuda que aportas a los no tan expertos como tuErikahttps://www.blogger.com/profile/12547216133500531425noreply@blogger.comtag:blogger.com,1999:blog-26801181.post-11343627488471804492008-04-05T13:45:00.000+02:002008-04-05T13:45:00.000+02:00Marel,Tu pregunta no resulta sencillo de contestar...Marel,<BR/><BR/>Tu pregunta no resulta sencillo de contestar con los datos que aportas. <BR/><BR/>Si estas enlazando dos tablas y para enlazarlas necesitas utilizar una función sin poder utilizar ningún índice, entonces podrías crear un índice de tipo función, o bien crear una columna con el resultado de la función, crear un índice sobre dicha columna y después enlazar las tablas utilizando esa columna.<BR/><BR/>En cuanto a los índices de tipo función sólo sé que existen pero nunca los he utilizado. Aquí te dejo un ejemplo:<BR/><BR/>CREATE INDEX nombre_mayuscula<BR/>ON tabla_nombres (UPPER(nombre));<BR/><BR/>Este tipo de índices requieren que el parámetro QUERY_REWRITE_ENABLED este puesto a TRUE.JLPMhttps://www.blogger.com/profile/00891045835734721638noreply@blogger.comtag:blogger.com,1999:blog-26801181.post-24198316442154732632008-04-05T01:21:00.000+02:002008-04-05T01:21:00.000+02:00hola.como puede reducir el costo de una sentencia ...hola.<BR/><BR/>como puede reducir el costo de una sentencia si en el where utilizo un substr o un soundexErikahttps://www.blogger.com/profile/12547216133500531425noreply@blogger.comtag:blogger.com,1999:blog-26801181.post-86740977070890015922007-08-16T18:27:00.000+02:002007-08-16T18:27:00.000+02:00Gracias Evilblues.El order de las tablas en el FRO...Gracias Evilblues.<BR/><BR/>El order de las tablas en el <I>FROM</I> es importante cuando se utiliza el <I>hint ORDERED</I> (SELECT /*+ ORDERED */), en cuyo caso el optimizador intentará unir las tablas siguiendo el orden en que aparecen las tablas en el <I>FROM</I>. Esta es una de las formas más utilizadas a la hora de optimizar una sentencia SQL o PL/SQL.<BR/><BR/>Si no se utiliza este <I>hint</I> entonces el optimizador utilizará el orden que tenga un coste menor (si estamos utilizando el optimizador basado en costes) o el que tenga una menor prioridad (si utilizamos el <A HREF="http://www.plsql.biz/2007/07/el-optimizador-plsql-basado-en-normas.html" REL="nofollow">optimizador SQL basado en normas</A>). En este caso, el orden de las tablas en el <I>FROM</I> sólo influiría si existiesen dos planes de ejecución con el mismo coste o la misma prioridad, en cuyo caso el optimizador Oracle eligiría el que más se aproxime al orden del <I>FROM</I>.<BR/><BR/>En el ejemplo que propones el orden no es importante, el optimizador accederá primero a la tabla empleados buscando los empleados que se apellidan Martínez y luego procederá a unir dichos registros con la tabla departamento.JLPMhttps://www.blogger.com/profile/00891045835734721638noreply@blogger.comtag:blogger.com,1999:blog-26801181.post-6010813494676862322007-08-07T14:43:00.000+02:002007-08-07T14:43:00.000+02:00Buenas,buen blog el tuyo,eso lo primeroen el caso ...Buenas,<BR/><BR/>buen blog el tuyo,eso lo primero<BR/><BR/>en el caso de que en el FROM hubiese dos tablas y estas se unieran de forma correcta...el orden de las tablas en el FROM influye en algo? y el orden de las condiciones del WHERE?<BR/><BR/>Por ej,<BR/><BR/>FROM empleados e , departamento d<BR/>WHERE e.apellidos='martinez'<BR/>e.id_dept = d.dept_id ;<BR/><BR/>es mejor poner el "e.id_dept = d.dept_id" antes del e.apellidos='martinez'?<BR/><BR/>es que tengo esta duda y no se si haras un "SQL TUNING 2 " o algo asi jeje<BR/><BR/>saludos!Unknownhttps://www.blogger.com/profile/15178498873721132609noreply@blogger.com