/ / Otimizar subconsulta dupla do MS Access - sql, acesso ms, subconsulta, acesso ms-2010

Otimizar Subconsulta Dupla do MS Access - sql, acesso ms, subconsulta, acesso ms-2010

Esta consulta do MS Access que estou construindo é muito lenta. Estou testando apenas um mês de dados (uma tabela que direciona essa consulta com 28.577 registros, 36 colunas).

Aqui está o que estou tentando realizar:

Eu quero retornar a contagem de veículos exclusivos por modelo que são vendidos no tipo de transação específica (esse banco de dados não é normalizado e é criado a partir de uma planilha de excel carregada em uma tabela).

A primeira subconsulta existe porque é minhaEntendendo que no Access você não pode usar a instrução DISTINCT com uma função agregada. Então, eu precisava criar uma subconsulta para lidar com o Count (DISTINCT VIN).

A segunda subconsulta é o que eu acredito ser oculpado. Cada VIN pode ter muitas entradas. Por exemplo, um Veículo pode ter sido vendido usando uma das Categorias de Transação que estou contando, depois Cancelado e revendido em uma das categorias de transação que eu não quero contar. Isso produziria três registros para este VIN:

  1. Venda na categoria de transação que eu pensei que queria contar
  2. Cancelar dessa primeira venda
  3. Revendido em uma categoria de transação que não quero contar

A segunda subconsulta verifica se um VIN tem um registro de "Venda cancelada" e não inclui a primeira Venda na contagem.

Espero ter explicado isso bem, e alguém pode me oferecer uma solução potencial para acelerar essa consulta.

OBRIGADO

Inquerir

PARAMETERS [Enter Sales Month Start Date] DATETIME, [Enter Sales Month End Date]
DATETIME;

SELECT DSTNCT_COUNT.trans      AS Trans,
DSTNCT_COUNT.mdl        AS Model,
Count(DSTNCT_COUNT.cnt) AS VIN_COUNT
FROM   (SELECT DISTINCT new_bbss.vin              AS cNt,
new_bbss.[model category] AS MDL,
new_bbss.[trans category] AS Trans
FROM   new_bbss
WHERE  ( ( ( new_bbss.[trans category] ) NOT LIKE "Individual"
AND ( new_bbss.[trans category] ) NOT LIKE "Corporate"
AND ( new_bbss.[trans category] ) NOT LIKE "Cancel"
AND ( new_bbss.[trans category] ) NOT LIKE "Partners"
AND ( new_bbss.[trans category] ) NOT LIKE "Special"
AND ( new_bbss.[trans category] ) NOT LIKE "Employee"
AND ( new_bbss.[trans category] ) NOT LIKE "Mobile"
AND ( new_bbss.[trans category] ) NOT LIKE "JLR FLEET" )
AND ( ( new_bbss.[retailer code] ) LIKE "R*" ) )
AND new_bbss.[trans date] BETWEEN [enter sales month start date]
AND
[enter sales month end date]
AND new_bbss.vin NOT IN(SELECT new_bbss.vin
FROM   new_bbss
WHERE  new_bbss.[trans category] LIKE
"CancelVIP*"
OR new_bbss.[trans category] LIKE
"CancelDealer Local*"
OR new_bbss.[trans category] LIKE
"CancelLoaner*"
OR new_bbss.[trans category] LIKE
"CancelAlive*"))
AS DSTNCT_COUNT
GROUP  BY trans, mdl;

Respostas:

1 para resposta № 1

MsAccess é suposto ser mais lento em NOT IN do queNÃO EXISTE. Eu não sei se isso é verdade, mas você pode tentar de qualquer maneira. Além disso você pode mover essa restrição de sua cláusula WHERE para uma cláusula HAVING, como vin está na cláusula GROUP BY. Isso pode reduzir os tempos MsAccess tem que olhar este acima.

select [model category], [trans category], count(*)
from
(
select [model category], [trans category], vin
from new_bbss
where [trans category] not like "Individual"
and [trans category] not like "Corporate"
and [trans category] not like "Cancel"
and [trans category] not like "Partners"
and [trans category] not like "Special"
and [trans category] not like "Employee"
and [trans category] not like "Mobile"
and [trans category] not like "JLR FLEET"
and [retailer code] like "R*"
and [trans date] between [enter sales month start date]
and [enter sales month end date]
group by [model category], [trans category], vin
having not exists
(
select *
from new_bbss unwanted
where unwanted.vin = new_bbss.vin
and
(    unwanted.[trans category] like "CancelVIP*"
or unwanted.[trans category] like "CancelDealer Local*"
or unwanted.[trans category] like "CancelLoaner*"
or unwanted.[trans category] like "CancelAlive*"
)
)
) matches
group by [model category], [trans category];

BTW: Deve haver um índice no vin, então o MsAccess pode procurar seus registros rapidamente.