es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Rendimiento de las variables de enlace de DBI

Estoy enfrentando problemas de rendimiento al utilizar variables de enlace con el paquete DBI. Mi caso de uso original es con la base de datos Postgres, pero para reproducibilidad, a continuación uso SQLite en memoria que tiene exactamente el mismo problema: cuando selecciono datos de alguna tabla por id (en Postgres la columna está indexada), la versión parametrizada se ejecuta varias veces más lenta al seleccionar el número de filas que la consulta SQL con los IDs pegados en la declaración IN:

“`{r}
library(DBI)
library(tictoc)

sample.data <- data.frame(
id = 1:100000,
value = rnorm(100000)
)

sqlite <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(
sqlite, "sample_data",
sample.data,
overwrite = TRUE
)

tic("Carga por enlace")
ids <- 50000:50100
res <- dbSendQuery(sqlite, "SELECT * FROM sample_data WHERE id = $1")
dbBind(res, list(ids))
result <- dbFetch(res)
dbClearResult(res)
toc()

Carga por enlace: 0.81 segundos transcurridos

tic("Carga por pegado")
ids <- 50000:50100
result2 <- dbGetQuery(sqlite, paste0("SELECT * FROM sample_data WHERE id IN (", paste(ids, collapse = ","), ")"))
toc()

Carga por pegado: 0.04 segundos transcurridos
“`

Parece que debo tener algún error obvio, ya que se supone que las consultas preparadas deben ser más rápidas (y lo veo con Python/SQLAlchemy en el mismo ejemplo de Postgres).

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que puede haber un problema al usar variables de enlace en el paquete DBI para Postgres, como se evidencia por el tiempo de ejecución significativamente más largo al seleccionar datos de una tabla por ID en comparación con el uso de los IDs pegados en una declaración IN. Se utilizó la base de datos SQLite en memoria con fines de reproducibilidad, pero el mismo problema persiste en Postgres, incluso cuando la columna está indexada. Se sugiere que puede haber un error en el código, ya que las consultas preparadas generalmente son más rápidas.

Comments are closed.