xact_abort sqlserver sirve que para off sql sql-server tsql ado.net concurrency

sqlserver - set xact_abort on



CONFIGURAR NOCOUNT EN EL USO (12)

A riesgo de hacer las cosas más complicadas, aliento una regla ligeramente diferente a todas las que veo arriba:

  • Siempre establezca NOCOUNT ON en la parte superior de un proceso, antes de realizar cualquier trabajo en el proceso, pero también siempre SET NOCOUNT OFF nuevo, antes de devolver cualquier conjunto de registros del proceso almacenado.

Por lo tanto, "en general, manténgase en cuenta, excepto cuando esté devolviendo un conjunto de resultados". No conozco ninguna forma en que esto pueda romper cualquier código de cliente, significa que el código de cliente nunca necesita saber nada sobre los procedimientos internos, y no es particularmente oneroso.

Inspirado por esta pregunta donde hay diferentes vistas en SET NOCOUNT ...

¿Deberíamos usar SET NOCOUNT ON para SQL Server? ¿Si no, porque no?

Lo que hace Edición 6, el 22 de julio de 2011.

Suprime el mensaje "xx filas afectadas" después de cualquier DML. Este es un conjunto de resultados y cuando se envía, el cliente debe procesarlo. Es pequeño, pero medible (ver las respuestas a continuación)

Para los desencadenadores, etc., el cliente recibirá varias "filas xx afectadas" y esto causa todo tipo de errores para algunos ORM, MS Access, JPA, etc. (consulte las ediciones a continuación)

Fondo:

La mejor práctica general aceptada (pensé hasta que esta pregunta) es usar SET NOCOUNT ON en los activadores y procedimientos almacenados en SQL Server. Lo usamos en todas partes y un google rápido muestra un montón de MVP de SQL Server de acuerdo también.

MSDN dice que esto puede romper un .net SQLDataAdapter .

Ahora, esto significa para mí que el SQLDataAdapter está limitado a un procesamiento completamente simple de CRUD porque espera que el mensaje "n filas afectadas" coincida. Entonces, no puedo usar:

  • SI EXISTE para evitar duplicados (sin filas afectadas mensaje) Nota: usar con precaución
  • DONDE NO EXISTE (se esperan menos filas)
  • Filtrar las actualizaciones triviales (por ejemplo, ningún dato cambia realmente)
  • Haga cualquier acceso a la tabla antes (como el registro)
  • Ocultar complejidad o denormlización.
  • etc

En la pregunta marc_s (quién sabe sus cosas de SQL) dice que no lo use. Esto difiere de lo que pienso (y también me considero algo competente en SQL).

Es posible que me esté perdiendo algo (siéntase libre de señalar lo obvio), pero ¿qué piensan ustedes por ahí?

Nota: han pasado años desde que vi este error porque no uso SQLDataAdapter hoy en día.

Ediciones después de comentarios y preguntas:

Edit: Más pensamientos ...

Tenemos varios clientes: uno puede usar un C # SQLDataAdaptor, otro puede usar nHibernate desde Java. Estos pueden verse afectados de diferentes maneras con SET NOCOUNT ON .

Si considera los procedimientos almacenados como métodos, entonces es una mala forma (anti-patrón) asumir que algún procesamiento interno funciona de cierta manera para sus propios fines.

Edición 2: una pregunta de nHibernación que rompe el desencadenante , donde SET NOCOUNT ON no se puede configurar

(y no, no es un duplicado de this )

Edit 3: Sin embargo, más información, gracias a mi colega MVP

Edición 4: 13 de mayo de 2011.

Rompe Linq 2 SQL también cuando no se especifica?

Edición 5: 14 jun 2011

Rompe JPA, proc almacenado con variables de tabla: ¿JPA 2.0 admite las variables de tabla de SQL Server?

Edición 6: 15 ago 2011

La cuadrícula de datos "Editar filas" de SSMS requiere SET NOCOUNT ON: actualizar el activador con GROUP BY

Edición 7: 07 mar 2013

Más detalles en profundidad de @RemusRusanu:
SET SET NOCOUNT ON realmente hace que una diferencia de rendimiento sea tan grande


CONFIGURAR NOCOUNT ENCENDIDO; El código anterior detendrá el mensaje generado por el motor del servidor sql a la ventana de resultados pendiente después de la ejecución del comando DML / DDL.

¿Por qué lo hacemos? Como el motor del servidor SQL toma algún recurso para obtener el estado y generar el mensaje, se considera una sobrecarga del motor del servidor Sql. Así que configuramos el mensaje de no cuenta.


Con respecto a los factores desencadenantes de NHibernate, tuve esa experiencia de primera mano. Básicamente, cuando NH realiza una ACTUALIZACIÓN, espera cierto número de filas afectadas. Al agregar SET NOCOUNT ON a los desencadenantes, se obtiene la cantidad de filas que NH esperaba, solucionando así el problema. Así que sí, definitivamente recomendaría que lo desactives si usas NH.

En cuanto al uso en SPs, es una cuestión de preferencia personal. Siempre había desactivado el conteo de la fila, pero, de nuevo, no hay argumentos realmente sólidos de ninguna manera.

En una nota diferente, realmente debería considerar alejarse de la arquitectura basada en SP, entonces ni siquiera tendrá esta pregunta.


Me costó mucho investigar para encontrar cifras reales de referencia alrededor de NOCOUNT, por lo que pensé en compartir un breve resumen.

  • Si su procedimiento almacenado utiliza un cursor para realizar muchas operaciones muy rápidas sin resultados devueltos, tener NOCOUNT OFF puede demorar aproximadamente 10 veces más que tenerlo en ON. 1 Este es el peor escenario.
  • Si su procedimiento almacenado solo realiza una sola operación rápida sin resultados devueltos, la configuración de NOCOUNT ON dará como resultado un aumento de rendimiento de alrededor del 3%. 2 Esto sería coherente con un procedimiento típico de inserción o actualización.
  • Si su procedimiento almacenado devuelve resultados (es decir, usted SELECCIONA algo), la diferencia de rendimiento disminuirá proporcionalmente con el tamaño del conjunto de resultados.

No sé cómo probar SET NOCOUNT ON entre el cliente y SQL, así que probé un comportamiento similar para el otro comando SET "SET TRANSACTION AISLAMIENTO NIVEL LEÍDO NO CANTADO"

Envié un comando desde mi conexión cambiando el comportamiento predeterminado de SQL (LEER COMPROMETIDO), y se cambió para los siguientes comandos. Cuando cambié el nivel de AISLAMIENTO dentro de un procedimiento almacenado, no cambió el comportamiento de la conexión para el siguiente comando.

Conclusión actual,

  1. Cambiar la configuración dentro del procedimiento almacenado no cambia la configuración predeterminada de la conexión.
  2. Cambiar la configuración mediante el envío de comandos utilizando ADOCOnnection cambia el comportamiento predeterminado.

Creo que esto es relevante para otro comando SET como "SET NOCOUNT ON"


Ok, ahora he hecho mi investigación, aquí está el trato:

En el protocolo TDS, SET NOCOUNT ON solo guarda 9 bytes por consulta, mientras que el texto "SET NOCOUNT ON" es un total de 14 bytes. Solía ​​pensar que las 123 row(s) affected fueron devueltas del servidor en texto sin formato en un paquete de red separado, pero ese no es el caso. De hecho, es una estructura pequeña llamada DONE_IN_PROC incrustada en la respuesta. No es un paquete de red separado, por lo que no se desperdician viajes de ida y vuelta.

Creo que puedes mantener el comportamiento de conteo predeterminado casi siempre sin preocuparte por el rendimiento. Sin embargo, hay algunos casos en los que calcular el número de filas de antemano afectaría el rendimiento, como un cursor de sólo avance. En ese caso, NOCOUNT puede ser una necesidad. Aparte de eso, no hay absolutamente ninguna necesidad de seguir el lema "usar NOCOUNT siempre que sea posible".

Aquí hay un análisis muy detallado sobre la insignificancia de la configuración de SET NOCOUNT : http://daleburnett.com/2014/01/everything-ever-wanted-know-set-nocount/


Sé que es una pregunta bastante antigua. pero solo por actualizar

La mejor manera de usar "SET NOCOUNT ON" es colocarlo como una primera declaración en su SP y configurarlo en OFF nuevamente antes de la última instrucción SELECT.


Si está diciendo que también puede tener diferentes clientes, hay problemas con el ADO clásico si SET NOCOUNT no está activado.

Una experiencia que recibo con regularidad: si un procedimiento almacenado ejecuta una serie de sentencias (y, por lo tanto, se devuelven varios mensajes de "filas xxx afectadas"), ADO parece no manejar esto y emite el error "No se puede cambiar la propiedad ActiveConnection de un objeto Recordset que tiene un objeto Comando como su fuente ".

Así que, en general, abogo por activarlo a menos que haya una razón realmente buena para no hacerlo. Es posible que hayas encontrado la muy buena razón por la que necesito ir y leer más.


Supongo que hasta cierto punto es un problema de DBA vs. desarrollador.

Como desarrollador en su mayoría, diría que no lo use a menos que sea absolutamente positivo, ya que usarlo puede romper su código ADO.NET (como lo documenta Microsoft).

Y supongo que como DBA, estarías más del otro lado, úsalo siempre que sea posible, a menos que realmente debas evitar su uso.

Además, si sus desarrolladores alguna vez usan el "Registros afectados" que devuelve la ExecuteNonQuery método ExecuteNonQuery de ADO.NET, tiene problemas si todos usan SET NOCOUNT ON ya que, en este caso, ExecuteNonQuery siempre devolverá 0.

También vea la publicación del blog de Peter Bromberg y revise su posición.

Así que realmente se reduce a quién llega a establecer los estándares :-)

Bagazo


si (no establezca el conteo == apagado)

{entonces mantendrá datos de la cantidad de registros afectados, por lo tanto, reduce el rendimiento} de lo contrario {no rastreará el registro de cambios, por lo tanto, mejorará el rendimiento}}


SET NOCOUNT ON;

Esta línea de código se usa en SQL para no devolver las filas de números afectadas en la ejecución de la consulta. Si no requerimos la cantidad de filas afectadas, podemos usar esto ya que esto ayudaría a ahorrar el uso de la memoria y aumentar la ejecución de la consulta.


  • Cuando SET NOCOUNT está activado, el recuento (que indica el número de filas afectadas por una instrucción Transact-SQL) no se devuelve. Cuando SET NOCOUNT está DESACTIVADO, se devuelve el recuento. Se utiliza con cualquier instrucción SELECT, INSERT, UPDATE, DELETE.

  • La configuración de SET NOCOUNT se establece en el tiempo de ejecución o ejecución y no en el tiempo de análisis.

  • SET NOCOUNT ON mejora el rendimiento del procedimiento almacenado (SP).

  • Sintaxis: SET NOCOUNT {ON | APAGADO }

Ejemplo de SET NOCOUNT EN:

Ejemplo de SET NOCOUNT OFF: