estoy procesar un formulario que tiene un montón de campos para un usuario que está editando un registro existente. el usuario puede haber cambiado solo un campo, y normalmente haría una consulta de actualización que establece los valores de todos los campos, aunque la mayoría de ellos no cambian. podría hacer algún tipo de seguimiento para ver qué campos realmente han cambiado, y solo actualizar los pocos que sí lo hicieron. ¿Hay una diferencia de rendimiento entre actualizar todos los campos en un registro vs solo el que cambió? ¿Hay otras razones para ir con cualquiera de los métodos? el método de escopeta es bastante fácil ...(Mi) el rendimiento de SQL: actualización de un campo frente a muchos campos unneccesary
Respuesta
yo diría que depende de lo siguiente:
- El tamaño de los datos que se está procesados
- La ubicación del servidor de base de datos relativa a la aplicación
- El tiempo necesario para completar todas las comprobaciones para el cambio de datos
Si va a transferir grandes cantidades de datos y/o la conexión es remota, entonces debe hacer algunas pruebas para ver si puede mejorar el rendimiento mediante el seguimiento de los cambios. De lo contrario, probablemente encontrará que es insignificante suponiendo que un registro está siendo manipulado.
Por supuesto, habría algunos gastos generales en la actualización de varios campos, pero la sobrecarga será menor en comparación con el costo de mantener el estado de los campos cambiados. Si esta es una tabla, no me preocuparía actualizar las columnas de forma selectiva según el estado de su formulario.
Además, puede ser útil examinar un marco de base de datos como Hibernate para abstraer algunos de estos detalles.
Me gustaría ir por el método de escopeta y es fácil de entender e implementar. El golpe de rendimiento debe ser inaceptable.
Si usted está hablando de una cantidad razonable de datos (por ejemplo, 1 kb +), entonces la optimización podría valer la pena. Si esta declaración/tabla se está ejecutando/actualizando frecuentemente (varias veces por segundo?), Por múltiples usuarios, etc., puede valer la pena optimizarla.
ya debe tener una copia de los datos originales, por lo que averiguar lo que ha cambiado no es un gran problema, y tampoco lo es el cambio de la instrucción de actualización para dar cabida a sólo rellene los campos modificados.
lo que no puede ser una mala idea, pero a menos que usted está mirando para ahorrar ancho de banda, o siente que necesita para mejorar el rendimiento, no es probable que sea necesario.
yo diría que ir a por la escopeta, pero realmente depende de muchas cosas y el uso que tiene en el PP.
- ¿Un usuario o millones de usuarios concurrentes?
- ¿Son los campos pequeños o hay campos de texto/blob grandes también?
- ¿La aplicación donde se llena el formulario se encuentra cerca de la base de datos o a través de una red o la web?
Hay que tener en cuenta que el UPDATE
tendrá que no sólo almacenar el nuevo (incluso los no modificados) Los campos en la tabla sino también:
- de verificación de claves foráneas actualización
- todos los índices en los campos actualizados
En todos los casos, sin embargo, puede implementar de la manera más fácil y probar cualquier problema de rendimiento para que sea seguro.
En realidad, es posible que pierda rendimiento solo actualizando campos individuales. Si está utilizando declaraciones preparadas, entonces la base de datos ya compiló el plan de consulta para actualizar todos los campos. Si comienza a actualizar campos aleatorios, tendrá que analizar la consulta cada vez que actualice, perdiendo el beneficio de las declaraciones preparadas. No estoy seguro de cuánto efecto tendría esto en MySQL, pero sé que puede ser significativo con SQL Server y Oracle.
- 1. Inserción/actualización masiva de servidor Sql frente a MERGE en el escenario de inserción o actualización
- 2. Un panel de actualización frente a varios paneles de actualización
- 3. Actualización de LINQ-a-SQL: problemas de rendimiento
- 4. Solicitud de un campo Muchos-A-Muchos de Django administración
- 5. actualización de un campo DateTime en dB de SQL Server de fecha y hora campos
- 6. Habilitación de Django administración filtros en muchos-a-muchos campos
- 7. SQL - muchos-a-muchos tabla principal clave
- 8. Rendimiento MySQL del campo varchar único frente a bigint único
- 9. MongoDB: índice de dos campos frente a índice de campo de documento
- 10. Linq a Sql - Muchos a muchos - CRUD
- 11. Actualización de muchos a muchos en MongoDB sin transacciones
- 12. Sesión de ASP.NET: objeto grande frente a muchos objetos pequeños
- 13. SQL muchos a muchos seleccione
- 14. Marco de Entidad Marco de muchos a muchos, clúster frente a índice no agrupado
- 15. recuento complejos a través de muchos a muchos en el campo de ORM de Django
- 16. rendimiento rendimiento muchos?
- 17. En Django, ¿cómo recuperas un campo de una clase relacionada de muchos a muchos?
- 18. consulta SQL compleja, muchos a muchos
- 19. Campos públicos frente a propiedades automáticas
- 20. Rendimiento: BinaryFormatter frente a XmlSerializer
- 21. campo de actualización con el valor de otro campo en el documento
- 22. Cuenta para muchos campos booleanos en una consulta sql?
- 23. Django filtrar a través de varios campos de una tabla de intermediario muchos-a-muchos
- 24. Relaciones de muchos a muchos en Entity Framework donde join table tiene más de dos campos?
- 25. Documento grande frente a muchos documentos
- 26. Pruebas de rendimiento frente a perfiles
- 27. Grupo de subprocesos frente a muchos subprocesos individuales
- 28. SQL: relación muchos a muchos, condición IN
- 29. CASO frente a consultas de ACTUALIZACIÓN múltiples para grandes conjuntos de datos - Rendimiento
- 30. Activación de actualización del Servidor SQL, Obtener solo campos modificados
Estoy interesado en la respuesta con respecto al rendimiento específico. Sin embargo, creo que lo dijiste tú mismo - * el método de escopeta es bastante fácil *. Es decir, IMO, independientemente de la optimización que pueda ofrecer la actualización de campo único, vale * la sobrecarga del seguimiento. El rendimiento es un equilibrio. –
MySQL detectará si un campo no cambia y no hará ningún trabajo adicional en él, por lo que la carga no es tan mala como cree. – Johan
gracias, a todos. – changokun