{"id":8344,"date":"2021-02-09T17:31:22","date_gmt":"2021-02-09T16:31:22","guid":{"rendered":"https:\/\/orizonold.dwebs.dev\/demo_wp\/?p=8344"},"modified":"2023-10-03T09:00:04","modified_gmt":"2023-10-03T07:00:04","slug":"uso-de-hard-parse-vs-soft-parse-bbdd-oracle","status":"publish","type":"expertise","link":"https:\/\/orizon.es\/en\/expertise\/uso-de-hard-parse-vs-soft-parse-bbdd-oracle\/","title":{"rendered":"Uso de \u201cHard Parse\u201d vs \u201cSoft Parse\u201d BBDD Oracle"},"content":{"rendered":"<p>Detecci\u00f3n<\/p>\n<p>Tras lanzar una query en un entorno de BBDD Oracle, el primer paso del proceso es conocido como Parsing. En este paso divide la sentencia en sus distintos componentes para determinar qu\u00e9 tipo de sentencia se trata y realizar un chequeo tanto sint\u00e1ctico como sem\u00e1ntico de la misma. Una vez realizada esta comprobaci\u00f3n sin errores, se procede a buscar si dicha sentencia ya ha sido procesada por otra sesi\u00f3n, esto se realiza buscando dicha sentencia en la SGA de la instancia.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-13399 size-full\" src=\"https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/3.webp\" alt=\"\" width=\"878\" height=\"202\" srcset=\"https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/3.webp 878w, https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/3-300x69.webp 300w, https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/3-768x177.webp 768w\" sizes=\"(max-width: 878px) 100vw, 878px\" \/><\/p>\n<p>En caso de que la sentencia se encuentre ya procesada en la SGA, nos encontramos ante un \u00abSoft Parse\u00bb, la instancia utilizar\u00e1 el plan de ejecuci\u00f3n y acceso generado con anterioridad y proceder\u00e1 a buscar las filas afectadas por la sentencia.<\/p>\n<p>En el caso contrario, si la sentencia no ha sido procesada con anterioridad, nos encontramos ante un \u00abHard Parse\u00bb. La instancia de BBDD ha de generar un plan de ejecuci\u00f3n y acceso optimizado para dicha sentencia y, posteriormente, leer las filas afectadas. Este proceso de \u00abHard Parse\u00bb puede suponer un problema de rendimiento, ya que el consumo de CPU necesario es notablemente superior al de un \u00abSoft Parse\u00bb. Aunque como m\u00ednimo es necesario efectuar un \u00abHard Parse\u00bb por cada sentencia, el exceso de este aumentar\u00e1 notablemente el consumo de CPU de la sentencia y dificultar\u00e1 el an\u00e1lisis de posibles problemas de rendimiento, puesto que las estad\u00edsticas de ejecuci\u00f3n de sentencias que se pueden considerar iguales no se ver\u00e1n agrupadas.<\/p>\n<p>El exceso de \u00abHard Parsing\u00bb suele darse por el uso de valores constantes en los filtros de las sentencias. Al hacer uso de constantes, el Optimizador de Oracle interpretar\u00e1 cada sentencia que se quiera ejecutar como una sentencia nueva y tendr\u00e1 que ejecutar el proceso de parsing completo. Esta mala praxis se puede solventar por medio del utilizaci\u00f3n de \u00abBind Variables\u00bb, de este modo el optimizador interpreta que la sentencia contiene valores variables y puede considerar dos sentencias como iguales, pudiendo, as\u00ed, reutilizar planes ya generados y agrupar estad\u00edsticas de ejecuci\u00f3n.<\/p>\n<p><strong>Ejemplo y Resultados<\/strong><\/p>\n<p>A continuaci\u00f3n, mostramos un ejemplo, de una sentencia que har\u00e1 la b\u00fasqueda de los valores del 1 al 10 en la columna \u00abC1\u00bb de la tabla \u00abT1\u00bb:<\/p>\n<ul>\n<li><strong>Uso de valores constantes:<\/strong><\/li>\n<\/ul>\n<p><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SELECT * FROM T1 WHERE C1=1;<\/em><\/p>\n<p><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SELECT * FROM T1 WHERE C1=2;<\/em><\/p>\n<p><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u2026.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/em><\/p>\n<p><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SELECT * FROM T1 WHERE C1=10;<\/em><\/p>\n<p>En este caso, se puede observar que las sentencias son iguales, no obstante, el optimizador ha de realizar 10 \u00abHard Parses\u00bb, ya que no puede interpretar que tiene un valor variable y generar\u00e1 un plan de ejecuci\u00f3n para cada una de las ejecuciones y las estad\u00edsticas de ejecuci\u00f3n mostrar\u00e1n los valores separados lo que dificulta el seguimiento del rendimiento de la sentencia.<\/p>\n<ul>\n<li><strong>Uso de \u00abBind Variables\u00bb:<\/strong><\/li>\n<\/ul>\n<p><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SELECT * FROM T1 WHERE C1=:B1;<\/em><\/p>\n<p>En este caso, al hacer uso de \u00abBind Variables\u00bb, el optimizador sabe que el valor a buscar en C1 es variable y, por tanto, el plan generado se podr\u00e1 utilizar sin importar el valor que se busque de C1. Para nuestro ejemplo se efectuar\u00e1 un primer \u00abHard Parse\u00bb y el resto de las ejecuciones realizar\u00e1n un \u00abSoft Parse\u00bb. Adem\u00e1s, las estad\u00edsticas de ejecuci\u00f3n de esta sentencia se ver\u00e1n agrupadas lo que simplificar\u00e1 el seguimiento del impacto que tiene sobre la instancia.<\/p>\n<p>En el ejemplo desarrollado anteriormente, el elapsed por ejecuci\u00f3n es de 1.000ms con un consumo de CPU de 600ms para las ejecuciones que efect\u00faan \u201cHard Parse\u201d. En caso de hacer uso de \u201cBind Variables\u201d y poder realizar \u201cSoft Parses\u201d <strong>se estima una reducci\u00f3n de un 40% de uso de CPU y un 24% de elapsed por ejecuci\u00f3n<\/strong>. Se ha de contar que es necesario realizar un primer \u201cHard Parse\u201d aunque se haga uso de \u201cBind Variables\u201d, por lo que el elapsed total para las 10 ejecuciones del ejemplo se reduce de 10.000ms a 7.840ms y el consumo de CPU se ve reducido de 6.000ms a 3.840ms.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-13402 size-full\" src=\"https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/4.webp\" alt=\"\" width=\"477\" height=\"275\" srcset=\"https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/4.webp 477w, https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/4-300x173.webp 300w\" sizes=\"(max-width: 477px) 100vw, 477px\" \/><\/p>\n<p>En conclusi\u00f3n, si vamos a ejecutar de forma repetida una query que acceda a la o las mismas tablas en busca de valores distintos, siempre es recomendable hacer empleo de \u201cBind Variables\u201d. De este modo, el Optimizador de Oracle ser\u00e1 capaz de interpretar que se trata de sentencias iguales y podremos ahorrar el consumo de CPU que genera la creaci\u00f3n de un plan de ejecuci\u00f3n y acceso, reutilizando los ya creados con anterioridad.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uso de \u201cHard Parse\u201d vs \u201cSoft Parse\u201d BBDD Oracle<br \/>\nPermite encontrar mejoras sencillas para la sustituci\u00f3n de constantes por \u201cbind variables\u201d.<br \/>\nEl objetivo de la detecci\u00f3n del uso inadecuado de \u201cHard parse\u201d es la disminuci\u00f3n del consumo de recursos y la duraci\u00f3n sentencias implicada<\/p>\n","protected":false},"author":4,"featured_media":8360,"menu_order":0,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-8344","expertise","type-expertise","status-publish","format-standard","has-post-thumbnail","hentry"],"uagb_featured_image_src":{"full":["https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/ORACLE.webp",1024,560,false],"thumbnail":["https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/ORACLE-150x150.webp",150,150,true],"medium":["https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/ORACLE-300x164.webp",300,164,true],"medium_large":["https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/ORACLE-768x420.webp",768,420,true],"large":["https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/ORACLE.webp",1024,560,false],"1536x1536":["https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/ORACLE.webp",1024,560,false],"2048x2048":["https:\/\/orizon.es\/wp-content\/uploads\/2021\/02\/ORACLE.webp",1024,560,false]},"uagb_author_info":{"display_name":"horizon","author_link":"https:\/\/orizon.es\/en\/author\/maria\/"},"uagb_comment_info":0,"uagb_excerpt":"Uso de \u201cHard Parse\u201d vs \u201cSoft Parse\u201d BBDD Oracle Permite encontrar mejoras sencillas para la sustituci\u00f3n de constantes por \u201cbind variables\u201d. El objetivo de la detecci\u00f3n del uso inadecuado de \u201cHard parse\u201d es la disminuci\u00f3n del consumo de recursos y la duraci\u00f3n sentencias implicada","_links":{"self":[{"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/expertise\/8344","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/expertise"}],"about":[{"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/types\/expertise"}],"author":[{"embeddable":true,"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/users\/4"}],"version-history":[{"count":0,"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/expertise\/8344\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/media\/8360"}],"wp:attachment":[{"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/media?parent=8344"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}