Pregunta

Tengo que comprobar si existe un registro en una base de datos; Sin embargo, yo estoy tratando de encontrar la manera de hacer esto que ofrece el mejor rendimiento. Esto se resume mejor con un ejemplo.

Vamos a suponer que tengo la siguiente tabla:

dbo.Person(
FirstName varchar(50),
LastName varchar(50),
Company varchar(50)
)

Supongamos que esta tabla tiene millones de filas, sin embargo, sólo el Company columna tiene un índice.

Quiero averiguar si existe una combinación particular de FirstName, LastName y Company. Sé que puedo hacer esto:

IF EXISTS(select 1 from dbo.Person where FirstName = @FirstName and LastName = @LastName and Company = @Company)
Begin
....
End

Sin embargo, si no me equivoco, que va a hacer un escaneo completo de tabla.

Lo que me gusta mucho que hay que hacer es una consulta donde se utiliza el índice. Con la tabla anterior, sé que la siguiente consulta tendrá un gran rendimiento, ya que utiliza el índice:

Select * from dbo.Person where Company = @Company

¿Hay alguna forma para que la búsqueda sólo en el subconjunto de datos? p.ej. algo como esto:

select * from (
  Select * from dbo.Person where Company = @Company
)
where FirstName = @FirstName and LastName = @LastName

De este modo, sólo se estaría haciendo un recorrido de tabla en una colección más estrecho gran parte de los datos.

Sé que la consulta anterior no funcionará, pero no es una consulta que lo haría?

Ah, y no soy capaz de crear tablas temporales, ya que el usuario sólo tendrá acceso de lectura.

¿Fue útil?

Solución

IF EXISTS( ...) es la forma más rápida. El optimizador utilizará un índice disponible para satisfacer la condición de filtro si se calcula el índice será más rápido. IF EXISTS se cerrará tan pronto como se encuentre una fila.

Asegúrese de que sus estadísticas son hasta la fecha ...

Otros consejos

Fwiw, esto es SQL válida:

select *
from (select * from dbo.Person where Company = @Company) t
where t.FirstName = @FirstName and t.LastName = @LastName

Y sólo se diferencia de la consulta por un alias. El IF EXISTS será más rápido como dice Mitch en su puesto.

Puede utilizar el analizador de consultas para averiguar lo que el optimizador decide hacerlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top