tuning net mvc framework consultas con asp c# sql-server performance asp.net-web-api edmx

c# - net - SQL Server y el rendimiento para búsquedas dinámicas



model c# asp net (3)

Me preguntaba cuáles eran las mejores prácticas para hacer una consulta en SQL con un valor dinámico, digamos que tengo un valor (nvarchar (max))

valor: "912345678"

select * from AllData where Number like ''%912345678%''

valor: "michael"

select * from AllData where Name like ''%Michael%''

valor: "calle número 10"

select * from AllData where Address like ''%Street number 10%''

Estos datos son un poco lentos ya que la búsqueda de un número que tenga 9 dígitos sería más rápida sin% como este

select * from AllData where Number like ''912345678''

Yo uso un EDMX para hacer una conexión a una base de datos externa en C #, como esto:

var Result = EDMXEntity.Entities.Where(x => (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Name.ToString().ToLower()) > 0) || (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Number.ToString().ToLower()) > 0) || (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Address.ToString().ToLower()) > 0)).Take(50).ToList();

¿Cómo puedo aumentar el rendimiento?


Las búsquedas con comodines como éstas en los campos varchar / nvarchar van a iterar sobre cada carácter, más o menos, para los registros que cumplen con los criterios críticos.

Una excelente (y rápida) opción para este tipo de búsquedas es:

  1. Haga un catálogo de texto completo para almacenar índices de texto completo.
  2. Coloque un índice de texto completo en las columnas de cada tabla que necesita buscar.
  3. Use la palabra clave CONTAINS cuando busque en lugar de comodines.

Usted mencionó que busca fuentes confiables, here hay una buena lectura.


Para buscar con ''me gusta'' en EF puedes usar Contains () :

var Result = EDMXEntity.Entities.Where( x => x.Name.Contains(Value) || x => x.Number.ToString().Contains(Value) || x => x.Address.Contains(Value)).Take(50).ToList();

Pero con este tipo de búsqueda nunca conseguirás un buen rendimiento. Debe cambiar la forma en que busca o almacena los datos en la base de datos. Por ejemplo, si está seguro de que el usuario estaba buscando un nombre, puede buscar solo en la columna ''nombre''.


Si el uso de LIKE y PATINDEX no le proporcionó el rendimiento necesario, probablemente debería escribir sp que usará FTS.