Estoy trabajando en la generación de informes para datos contenidos en una gran base de datos de Access (~ 500 mb después de la reparación compacta &), y estoy teniendo problemas con una lenta subconsulta .Subconsultas muy lentas al usar "NOT IN"
La base de datos tiene una gran tabla que contiene un registro de la compra de cada cliente. Aquí hay una consulta simple que encuentra clientes que compraron un widget azul. Se completa en unos pocos segundos y devuelve unos diez mil registros.
SELECT DISTINCT CustomerId
FROM ProductSales
WHERE Product = 'BLUE'
Aquí hay una pregunta que trata de encontrar clientes que han comprado un widget azul, pero no es un widget rojo. Lleva alrededor de una hora correr.
SELECT DISTINCT CustomerId FROM ProductSales
WHERE Product = 'BLUE'
AND CustomerId NOT IN (
SELECT CustomerId
FROM ProductSales
WHERE Product = 'RED'
)
¿Hay alguna manera de refactorizar la segunda consulta para que tome unos minutos en lugar de una hora?
Supongo que el campo CustomerId tiene índices en ambas tablas? –
Ha intentado SELECCIONAR DISTINCT CustomerId FROM ProductSales WHERE Producto = 'AZUL' menos SELECCIONAR ID de cliente DEVENTAS DE PRODUCTO DONDE Producto = 'ROJO'. He visto casos en los que realmente aceleró la consulta, pero YMMV –
@Marc B: aquí solo hay una tabla, pero CustomerId está indexada en ella. – James