Como sugiere el título ... Estoy tratando de descubrir la forma más rápida con la menor sobrecarga para determinar si existe un registro en una tabla o no.
Consulta de muestra:
SELECT COUNT(*) FROM products WHERE products.id = ?;
vs
SELECT COUNT(products.id) FROM products WHERE products.id = ?;
vs
SELECT products.id FROM products WHERE products.id = ?;
Digamos que ?
se intercambia con 'TB100'
... tanto la primera como la segunda consulta devolverán exactamente el mismo resultado (digamos ... 1
para esta conversación). La última consulta volverá 'TB100'
como se esperaba, o nada si id
no está presente en la tabla.
El propósito es averiguar si el id
está en la tabla o no. De lo contrario, el programa insertará luego el registro; si es así, el programa lo omitirá o realizará una consulta de ACTUALIZACIÓN basada en otra lógica del programa fuera del alcance de esta pregunta.
¿Cuál es más rápido y tiene menos gastos generales? (Esto se repetirá decenas de miles de veces por ejecución de programa y se ejecutará muchas veces al día).
(Ejecutar esta consulta en M $ SQL Server desde Java a través del controlador JDBC proporcionado por M $)
fuente
if exists(select null from products where id = @id)
; si en una consulta llamada directamente por un clienteselect case when exists (...) then 1 else 0 end
.Respuestas:
SELECT TOP 1 products.id FROM products WHERE products.id = ?;
superará todas sus sugerencias, ya que terminará la ejecución después de encontrar el primer registro.fuente
id
no es PK. Entonces +1 a tu consejo.EXISTS
(oNOT EXISTS
) está especialmente diseñado para verificar si algo existe y, por lo tanto, debería ser (y es) la mejor opción. Se detendrá en la primera fila que coincida, por lo que no requiere unaTOP
cláusula y en realidad no selecciona ningún dato, por lo que no hay sobrecarga en el tamaño de las columnas. Puede usarlo con seguridadSELECT *
aquí, no es diferente deSELECT 1
,SELECT NULL
oSELECT AnyColumn
... (incluso puede usar una expresión no válida comoSELECT 1/0
y no se romperá) .fuente
Exists
funcionaselect
de tal manera que sale tan pronto como se encuentra una fila. Además, existe simplemente nota la existencia de registros, no valores reales en el registro, lo que ahorra la necesidad de cargar la fila desde el disco (suponiendo que los criterios de búsqueda estén indexados, por supuesto). En cuanto a los gastos generales deif
- tendrá que pasar este tiempo minúsculo de todos modos.select top
oexists
; si no están presentes, el motor sql tendrá que realizar un escaneo de tabla. Esta es la opción de búsqueda de tabla menos deseable. Si no está autorizado para crear índices, deberá comunicarse con el personal técnico del otro lado para averiguar si los ajustan automáticamente o si esperan que sugiera índices.SELECT CASE WHEN EXISTS(..) THEN 1 ELSE 0 END;
Nada puede vencer
No necesita contar para saber si hay datos en la tabla. Y no use alias cuando no sea necesario.
fuente
id
no es clave primaria. Entonces, aunque no esté contando , aún necesita encontrar todos los registros coincidentes, posiblemente miles de ellos. Acerca del alias: el código es un trabajo constante en progreso. Nunca se sabe cuándo tendrá que regresar. El alias ayuda a prevenir errores estúpidos de tiempo de ejecución; por ejemplo, un nombre de columna único que no necesitaba un alias ya no es único porque alguien creó una columna con el mismo nombre en otra tabla unida.aliasing
. El término correcto esqualifying
. Aquí hay una explicación más larga de Alex Kuznetzov . Acerca de las consultas de una sola mesa - es única tabla ahora . Pero más tarde, cuando se descubre un error y está tratando de contener la inundación, el cliente está nervioso, se une a otra mesa solo para enfrentar un mensaje de error, un mensaje fácilmente corregible, pero no en este momento sudoroso, ocurre un pequeño derrame cerebral y corrige el problema. error recordando nunca dejar una columna ...Este enfoque le devuelve un valor booleano.
fuente
También puedes usar
fuente
No piense que nadie lo ha mencionado todavía, pero si está seguro de que los datos no cambiarán debajo de usted, es posible que también desee aplicar la sugerencia NoLock para asegurarse de que no se bloquee durante la lectura.
fuente
Esta es la solución de base de datos relacional cruzada que funciona en todas las bases de datos.
fuente
A continuación se muestra la forma más simple y rápida de determinar si existe un registro en la base de datos o no. Lo bueno es que funciona en todos los DB relacionales
fuente
fuente
Lo he usado en el pasado y no requiere un escaneo completo de la tabla para ver si existe algo. Es super rápido ...
fuente
Para aquellos que se topan con esto desde MySQL u Oracle, MySQL admite la cláusula LIMIT para seleccionar un número limitado de registros, mientras que Oracle usa ROWNUM.
fuente