Tengo un problema al utilizar SQLiteParameters y el operador LIKE en una consulta de SQLite. Aquí hay un fragmento de código, y me disculpo si no tengo suficiente código aquí. Si ese es el caso, puedo publicar más fácilmente.Rendimiento de SQLite.NET utilizando SQLiteParameter con el operador LIKE
degradación de las prestaciones:
using (OdysseyDataContext entities = new OdysseyDataContext())
{
var results = entities.SearchResults.SqlQuery(
"SELECT * FROM SearchResults WHERE ContactName LIKE @ContactName",
new SQLiteParameter("@ContactName", "test")
);
}
Gran Rendimiento:
using (OdysseyDataContext entities = new OdysseyDataContext())
{
var results = entities.SearchResults.SqlQuery(
string.Format(
"SELECT * FROM SearchResults WHERE ContactName LIKE '{0}'",
"test"
)
);
}
Otro código importante:
public class OdysseyDataContext : DbContext
{
public DbSet<SearchResult> SearchResults { get; set; }
}
public class SearchResult
{
[Key]
public Guid Id { get; set; }
public string ContactName { get; set; }
}
El primer ejemplo tiene 700 ms para ejecutar, que mi supervisor considera inaceptable. El segundo ejemplo tarda 7 ms en ejecutarse. ¿Por qué la diferencia? ¿Hay algo que estoy haciendo completamente mal para ganarme estatus de novato?
¡Gracias de antemano!
¿Está ejecutando varias pruebas para eliminar los artefactos de almacenamiento en caché? ¿Ambos devuelven las mismas filas? ¿Estás usando comodines? – Tim
Además, en implementaciones de SQLite donde la función LIKE está anulada, los índices no están disponibles. ¿Qué obtienes con ... donde contactname GLOB @contactname [case sensitive, BTW]? – Tim
Hola Tim. Sí, estoy ejecutando múltiples pruebas. La primera vez es un poco más de 1 segundo y el promedio de más de 15 pruebas es de aproximadamente 700 ms. Sí, devuelven las mismas filas.No, no estoy usando comodines. Sé que parece extraño, pero estoy usando la declaración similar para eliminar la búsqueda sensible a mayúsculas y minúsculas así que usará mi configuración de índice en ContactName COLLATE NOCASE. – Terry