--
Has recibido este mensaje porque estás suscrito al grupo "AltNet-Hispano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a altnet-...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a altnet-hispan...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/altnet-hispano?hl=es.
Si hablamos de SQL Server, no hay diferencias de performance visible si la query es una sola.
--
Por otro lado; ese tema de que se pueden tocar los SPs en producción
me da escalofrios, como así también quien dijo que no usa sps por
miedo a que la gente los modifique..ya que si alguien puede modificar
un sp es probable que también puede modificar el nombre de una tabla.
El 12/06/11, Marcos Mellibovsky <mel...@gmail.com> escribió:
>> Blog de .Net y Gestión de proyectos <http://1poquitodtodo.blogspot.com/>
>> Blog de opinión social <http://unmalnacido.blogspot.com/>
>> Blog de World of Warcraft <http://historiasdesdeazeroth.blogspot.com/>
>> Blog de Tiro con Arco <http://litelllon.blogspot.com/>
--
Enviado desde mi dispositivo móvil
El 12/06/11, Marcos Mellibovsky <mel...@gmail.com> escribió:
>> Blog de .Net y Gestión de proyectos <http://1poquitodtodo.blogspot.com/>
>> Blog de opinión social <http://unmalnacido.blogspot.com/>
>> Blog de World of Warcraft <http://historiasdesdeazeroth.blogspot.com/>
>> Blog de Tiro con Arco <http://litelllon.blogspot.com/>
--
Coincido con esteban en que muchas a veces se pueden corregir cosas (lo he hecho unas cuantas veces) sin deplayar toda la app. Un ejemplo simple es por ejemplo, ponerle un order by a un query o algo asi de simple.
Asumo q unit tests corres en ambos casos, asi q no deberia ser ese un motivo principal para elegir uno u otro approach.
El 12 de junio de 2011 12:13, Daniel Cazzulino <dan...@cazzulino.com> escribió:
Asumo q unit tests corres en ambos casos, asi q no deberia ser ese un motivo principal para elegir uno u otro approach.
En los proyectos que tuve el lujo de ver que se tocan SPs en producción... puedo asegurarte que no había unit tests para eso
--
Bueno, esa es la historia señor Peix (tampoco voy a usar el nombre para no generar conflictos) y una cosas más, a mí tampoco me gusta que sea así, pero realmente no veo opción.
Hoy en día siempre se utilizan SPs y siempre son revisados los planes de ejecución y los índices utilizados por una persona (que vamos a llamarle DBA, la D es por el inglés Devil)
Ese es el esquema actual, es tan celoso el tema de la performance que se revisan las estadísticas de objetos de sql para detectar "elefantes" de consumo, también se monitorea el consumo de CPU y RAM del sqlserver y el acceso a disco, etc.
NOTE that this is a general look at stored procedures not regulated to a specific DBMS. Some DBMS (and even, different versions of the same DBMS!) may operate contrary to this, so you'll want to double-check with your target DBMS before assuming all of this still holds.
I've been a Sybase ASE, MySQL, and SQL Server DBA on-and off since for almost a decade (along with application development in C, PHP, PL/SQL, C#.NET, and Ruby). So, I have no particular axe to grind in this (sometimes) holy war.
The historical performance benefit of stored procs have generally been from the following (in no particular order):
- Pre-parsed SQL
- Pre-generated query execution plan
- Reduced network latency
Pre-parsed SQL -- similar benefits to compiled vs. interpreted code, except on a very micro level.
- Potential cache benefits
Still an advantage? Not very noticeable at all on the modern CPU, but if you are sending a single SQL statement that is VERY large eleventy-billion times a second, the parsing overhead can add up.
Pre-generated query execution plan. If you have many JOINs the permutations can grow quite unmanageable (modern optimizers have limits and cut-offs for performance reasons). It is not unknown for very complicated SQL to have distinct, measurable (I've seen a complicated query take 10+ seconds just to generate a plan, before we tweaked the DBMS) latencies due to the optimizer trying to figure out the "near best" execution plan. Stored procedures will, generally, store this in memory so you can avoid this overhead.
Still an advantage? Most DBMS' (the latest editions) will cache the query plans for INDIVIDUAL SQL statements, greatly reducing the performance differential between stored procs and ad hoc SQL. There are some caveats and cases in which this isn't the case, so you'll need to test on your target DBMS.
Also, more and more DBMS allow you to provide optimizer path plans (abstract query plans) to significantly reduce optimization time (for both ad hoc and stored procedure SQL!!).
WARNING Cached query plans are not a performance panacea. Occasionally the query plan that is generated is sub-optimal. For example, if you sendSELECT * FROM table WHERE id BETWEEN 1 AND 99999999, the DBMS may select a full-table scan instead of an index scan because you're grabbing every row in the table (so sayeth the statistics). If this is the cached version, then you can get poor performance when you later sendSELECT * FROM table WHERE id BETWEEN 1 AND 2. The reasoning behind this is outside the scope of this posting, but for further reading see:http://www.microsoft.com/technet/prodtechnol/sql/2005/frcqupln.mspx andhttp://msdn.microsoft.com/en-us/library/ms181055.aspx and http://www.simple-talk.com/sql/performance/execution-plan-basics/
"In summary, they determined that supplying anything other than the common values when a compile or recompile was performed resulted in the optimizer compiling and caching the query plan for that particular value. Yet, when that query plan was reused for subsequent executions of the same query for the common values (‘M’, ‘R’, or ‘T’), it resulted in sub-optimal performance. This sub-optimal performance problem existed until the query was recompiled. At that point, based on the @P1 parameter value supplied, the query might or might not have a performance problem."
Reduced network latency A) If you are running the same SQL over and over -- and the SQL adds up to many KB of code -- replacing that with a simple "exec foobar" can really add up. B) Stored procs can be used to move procedural code into the DBMS. This saves shuffling large amounts of data off to the client only to have it send a trickle of info back (or none at all!). Analogous to doing a JOIN in the DBMS vs. in your code (everyone's favorite WTF!)
Still an advantage? A) Modern 1Gb (and 10Gb and up!) Ethernet really make this negligible. B) Depends on how saturated your network is -- why shove several megabytes of data back and forth for no good reason?
Potential cache benefits Performing server-side transforms of data can potentially be faster if you have sufficient memory on the DBMS and the data you need is in memory of the server.
Still an advantage? Unless your app has shared memory access to DBMS data, the edge will always be to stored procs.
Of course, no discussion of Stored Procedure optimization would be complete without a discussion of parameterized and ad hoc SQL.
Parameterized / Prepared SQL
Kind of a cross between stored procedures and ad hoc SQL, they are embedded SQL statements in a host language that uses "parameters" for query values, e.g.:SELECT .. FROM yourtable WHERE foo = ? AND bar = ?These provide a more generalized version of a query that modern-day optimizers can use to cache (and re-use) the query execution plan, resulting in much of the performance benefit of stored procedures.
Ad Hoc SQL Just open a console window to your DBMS and type in a SQL statement. In the past, these were the "worst" performers (on average) since the DBMS had no way of pre-optimizing the queries as in the parameterized/stored proc method.
Still a disadvantage? Not necessarily. Most DBMS have the ability to "abstract" ad hoc SQL into parameterized versions -- thus more or less negating the difference between the two. Some do this implicitly or must be enabled with a command setting (SQL server: http://msdn.microsoft.com/en-us/library/ms175037.aspx , Oracle: http://www.praetoriate.com/oracle_tips_cursor_sharing.htm).
Lessons learned? Moore's law continues to march on and DBMS optimizers, with every release, get more sophisticated. Sure, you can place every single silly teeny SQL statement inside a stored proc, but just know that the programmers working on optimizers are very smart and are continually looking for ways to improve performance. Eventually (if it's not here already) ad hoc SQL performance will become indistinguishable (on average!) from stored procedure performance, so any sort of massive stored procedure use ** solely for "performance reasons"** sure sounds like premature optimization to me.
Anyway, I think if you avoid the edge cases and have fairly vanilla SQL, you won't notice a difference between ad hoc and stored procedures.
--
Leyendo la problemática de Leonardo, veo que las ventajas de los SP me parece que son mas de lado operativo, que técnicas.O sea, si un sistema sufre cambios muy seguido y es muy sensible al uso de indices y querys muy optimizadas, me parece un despropósito andar deployando la aplicación por cada prueba de tunning de query que se hace.Pero del lado de performance, en ese escenario no hay diferencias. El SQL Server guarda el plan de ejecución de las consultas pre parametrizadas.
--
Mi humilde opinión a esto… Como siempre, todo depende.
Si uno tiene una aplicación totalmente centrada a manejar datos y con alto volumen el lugar más eficiente va a ser siempre la base de datos por una cuestión lógica, si todo lo que hago nace a partir de información que tengo en la DB y muere también en la DB cualquier capa en el medio mete tiempos adicionales.
Yo tuve la experiencia de trabajar en una aplicación de alto volumen (una cartera de 400,000.- pólizas vigentes las cuales había que cobrar todos los meses mediante débitos, reintentos, etc.). Al haber metido la gran mayoría de las transacciones en la DB cuando tuve que hacer los procesos programar store procedures lograba tiempos de proceso muy bajos (5 minutos como mucho para generar todas las cuotas de la cartera incluyendo su respectiva cotización, tiempos similares en hacer los procesos de cobranzas que eran diarios).
En definitiva, si lo que necesitamos es performance y las ventanas que uno tiene de procesamiento son realmente bajas la implementación más eficiente va a estar en la base de datos (o haciendo cosas muy pegadas a la DB como TXT y BCP o SSIS). Luego, en estos escenarios como la herramienta de programación en la DB son las store procedure, me parece que aplica el mismo criterio que en cualquier otro lenguaje, mejor diseñado y modularizado estén mis store procedures, más fácil va a ser programar lo que tenga que hacer.
También me parece que todas las bases de datos siempre entendieron que deben ser el punto más eficiente de procesamiento, y por eso desde siempre podías subir funciones hechas en C o similar, y ahora tenes capacidad de subir lógicas en java o en .net según el producto. De esta forma podes montar lógicas de negocio como componentes en la base e invocarlas directamente desde una STP (nunca lo hice, esperaría nunca tener que necesitarlo, pero si realmente fuera crítica la performance, creo que sería una opción a evaluar).
Obviamente, si puedo elegir, prefiero un ORM y programar en C#, pero creo que hay una regla que siempre aplica y es que el código más eficiente, en general es el más difícil de mantener. Igualmente nunca note la diferencia entre ejecutar un store procedure o tirar un query, me parece que en ambos casos la diferencia siempre la vas a notar en el correcto modelado de tus tablas, índices y demás cuestiones que hacen a la consulta. En definitiva un query mal hecho sobre un modelo mal diseñado va a andar mal este donde esté, y ahí es donde realmente hay diferencia (hablamos de milisegundos a directamente colgar todos los usuarios).
En lo personal, me parece que es una cuestión de como uno enfoca el problema, por ejemplo si estamos haciendo algo intensivo y contando las milésimas, quizás una store procedure sea más eficiente, pero si realmente te interesa tanto el milisegundo, quizás la pregunta sería porque llamas tanto a esa store procedure, si es que no te conviene hacer otro enfoque… Por ejemplo, si tenes una iteración que llama mucho a una STP que inserta y hace varias cosas capaz que la solución es insertar en una tabla temporal y luego correr una única stp que pase a producción haciendo todo junto (en lugar de medir el tiempo de cada invocación, a mí siempre me dio resultado medir la forma de hacer la menor cantidad de invocaciones posibles). No sé si me explico, pero creo que en base de datos lo que más diferencia da es la forma es el diseño que le das a tu problema entendiendo que hay un cliente-servidor y no tanto el mecanismo especifico que estés usando.
Ah, y para ganar más amigos… No creo en los Devil BA, me parece que es gente que tiene responsabilidades que chocan con las responsabilidades que tiene el que desarrolla y su función a veces es ponerse en molesto, pero en mi experiencia con ellos, si uno entiende el objetivo del DBA y negocia con él la forma de acompañar dicho objetivo en tu solución, son unos aliados muy útiles a la hora de solucionar problemas o diseñar tus soluciones. Lo mismo aplica con infraestructura o incluso un sector de arquitectura de un cliente. Están para algo y uno tiene que buscar la forma de no generar un conflicto con ellos, nos guste o no, no dejan de ser un tipo de usuario de nuestro desarrollo que tienen sus requerimientos y pueden meter sus errores en el sistema.
Saludos
Leandro de los Santos
--
Mi humilde opinión a esto… Como siempre, todo depende.
--
Y si… En general la mejor solución siempre está a mitad de camino de todas las variables que tenes que considerar (o en el peso correcto de cada una, pero nunca las variables pesan cero). Eficiencia vs escalabilidad o mantenimiento del código, evolución del negocio, etc…
Hasta me atrevo a tirar un teorema… “El dolor de cabeza que tenes hoy es directamente proporcional a la performance que tiene el código que escribiste ayer”… Por suerte el hardware evoluciona, así que cada vez uno tiende a buscar menores dolores de cabeza.
De paso, el caso que comente son seguros de robo en cajero vendidos que venden los bancos. Costo fijo por segmento del cliente… Por el volumen, lo que hacía era calcular el costo de cada segmento de clientes en el Middle tier y por cada segmento disparaba una STP para generarle las cuotas. De esta forma me quedaba a “medio camino”, no era 100% en la db, la lógica de costo podría evolucionar en la capa de negocio y como el negocio es de volumen, siempre iba a poder tener un segmento importante de clientes al que le correspondiera dicho precio… Ahí es donde venía la optimización usando la DB (una invocación para un precio, muchos clientes con sus cuotas generadas).
Saludos
From: altnet-...@googlegroups.com [mailto:altnet-hisp...@googlegroups.com] On Behalf Of Carlos Peix
Sent: Monday, June 13, 2011 9:27 AM
To: altnet-...@googlegroups.com
Subject: Re: [altnet-hispano] Stored procedures o queries?
Hola Leandro,
--
Hola,Para que no se aburran en un sabado, tiro el siguiente, ya remañido, debate.Un miembro de esta comunidad, del cual no quiero decir el nombre (pero si el apellido: Micheloni), ha dicho que no negocia el uso de stored procedures agregando otros comentarios relacionados con rendimiento.Mi pregunta, para Leo pero tambien para los demas, es: tienen alguna correlacion reciente sobre el uso de stores procedures y la mejora de rendimiento en los queries?Para acotar el debate, me refiero al mismo query, ejecutado en el interior de un SP o directamente. Por supuesto, asumamos que la ejecucion directa esta bien hecha (en caso de multiples ejecuciones, y utiliza la version "prepared", etc).Gracias----------------------------------
Carlos Peix
--
Has recibido este mensaje porque estás suscrito al grupo "AltNet-Hispano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a altnet-...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a altnet-hispan...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/altnet-hispano?hl=es.
entonces si quiero auditar que las consultas aprovechen los índices + limitar permisos de ejecución por identidad, es conveniente usar SPs?
Usar IQueriable por todos lados es lo mismo que sql embebido, eso es claro, se hablo en varias VAN, volviendo a la raíz de mi comentario inicial, no veo entonces la ventaja de usar EQO si tengo que usar si o si SP, lo veo muy claro si uso una interfaz para esconder una consulta tipo Criteria, en en este caso no, si me pueden desasnar al respecto
--
"El problema de acceder directo con la identidad del usuario enCarlos, este escenario ya no es demasiado cierto en estos tiempos.
aplicaciones
Web es la escalabilidad, los pools de conexiones casi no sirven en
ese
escenario. "
ASP.NET por ejemplo no impersona a los usuarios por default y es muy
raro el caso en que necesites realmente impersonar, todo corre siempre
bajo el usuario configurado en el application pool de IIS por lo tanto
el conexion pool se sigue utilizando eficientemente.
"entonces si quiero auditar que las consultas aprovechen los índices + limitar permisos de ejecución por identidad, es conveniente usar SPs?"No necesitas apelar a los SP para verificar si los indices se están utilizando correctamente. Podes usar el profiler y capturar el plan de ejecución de cada query
seguro, la pregunta es si en caso que no usen los índices que me interesa qué puedo hacer, y si aquello que puedo hacer no termina siendo trabajo extra
Si esta bien, la unica manera que lleguen las credenciales a la base
de datos es si configuraste tu application de ASP.NET para que
impersone al usuario logueado (Identity impersonate=true) y que la
autenticacion sea por seguridad integrada. Con windows authentication
o integrada solo sin configurar impersonation, IIS nunca impersona el
working process con el usuario logueado y por ende las credenciales no
llegan a la base de datos.
--
Generalmente la autorzaciòn es a nivel de casos de usos, no de datos
ailados en un modelo (relacional) que rara vez tiene significado para
el usuario.
Me parecería hasta mas razonable manejar autorización a nivel de
documentos (mongodb etc..) que de tablas o sps.
Otro ejemplo absurdo es oracle que te deja definir pantallas dentro de
la bd en plsql..
El 19/06/11, Gustavo <mach...@gmail.com> escribió:
--
Enviado desde mi dispositivo móvil
¿En qué brillan las bases de datos relacionales? Una: en el manejo de conjuntos de datos. Nada procedural o de objetos mejora un simple
update articulos set precio = precio* 1.10
Si la seguridad de los datos que se pueden ver (sean o no dependientes
del caso de uso) se pone únicamente en la lógica de negocios (no digo
que esté bien o mal) y le quitamos esa responsabilidad a la DB también
empezamos a llegar al modelo en que la DB tampoco debería validar los
tipos de datos (cosa con la que en algunas épocas estoy de acuerdo y
otras no) yo he intercambiado opiniones sobre esto con gente de DB
sobre cuál es la responsabilidad de la DB, podemos cuestionar todo,
los check, las foreing keys, los tipos de datos, si queremos mantener
todo de una manera homogenia y controlada (control de versiones, etc)
me parece mucho mejor el enfoque "la DB es una bolsa donde simplemente
persisto los datos" porque como dijo Angel si la electricidad nunca se
cortase podríamos evitar las DB....
Si la seguridad de los datos que se pueden ver (sean o no dependientes
del caso de uso) se pone únicamente en la lógica de negocios (no digo
que esté bien o mal) y le quitamos esa responsabilidad a la DB también
empezamos a llegar al modelo en que la DB tampoco debería validar los
tipos de datos
David Lay M
Por favor disculpe faltas de ortografía o si el correo ha resultado muy brebe ya que he repondido desde mi movil.
Enviado desde mi BlackBerry de Movistar (http://www.movistar.com.ar)
Como se ve es un incidente del año pasado pero me he quedado con la inquietud porque pasa esta anomalia.
Y a como pueden ver no da timeout se ejecuta pero con demasiado tiempo
A alguno le habra dado algo similar?
--
Has recibido este mensaje porque estás suscrito al grupo "AltNet-Hispano" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a altnet-hispano+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a altnet-hispano@googlegroups.com.
Visita este grupo en https://groups.google.com/group/altnet-hispano.
--
SELECT req.session_id, start_time, req.status, command, blocking_session_id, percent_complete
, estimated_completion_time, req.cpu_time, req.total_elapsed_time, req.reads, req.writes, req.logical_reads
, wait_type, wait_time, last_wait_type, wait_resource, request_id, req.database_id, db.NAME AS base, USER_ID
, req.transaction_isolation_level, req.row_count, open_transaction_count, open_resultset_count, ses.HOST_NAME, ses.program_name, ses.login_name, ses.last_request_start_time
, query.text tsql
FROM sys.dm_exec_requests req LEFT JOIN sys.databases db ON req.database_id = db.database_id
LEFT JOIN sys.dm_exec_sessions ses ON req.session_id = ses.session_id
CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) AS query
WHERE req.session_id > 40 AND req.session_id <> @@SPID
Las pruebas fueron en 2 ambientes distintos? El query plan debería darte información dónde se va el consumo.Acordarse q equipos distintos pueden dar planes distintos x temas de índices, volúmenes de info guardada, etc. Nosotros en algún momento tuvimos q decirle a algunos sps que hagan recompile x cada ejecución porque el query plan q armaba algunas veces no era el más performante.Otra tuvimos q mejorar los subqueries o forzar un índice determinado.Si puedo ayudar a leer queryplan avísame x privado.SaludosJuan
El 10 ene. 2018 2:47 p. m., "Yesenia María Zapata Pulido" <zapatapul...@gmail.com> escribió:
Gabriel Osorio,--
Gracias por la respuesta y evalue los planes de ejecucion y a como mencionas creo que es problemas del servidor sin embargo en cuanto a tiempos la ejecucion del sp de 4 horas versus segundos es abismal y si hice un par de consultas para ver el estado de la memoria y curiosamente el consumo esta en la default y la virtual casi no se ocupa para nada mas bien por no decir que nada por eso tenia la duda si se podria configurar algo para que los sp pudieran ejecutarse mejor.
Poste por aca la respuesta porque en googlegroups no soy tan recurrente de hacer pregunas.
Y gracias por tu respuesta.
Saludos.
Has recibido este mensaje porque estás suscrito al grupo "AltNet-Hispano" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a altnet-hispan...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a altnet-...@googlegroups.com.