Galera venho novamente pedir ajuda de vocês, com a tabela abaixo possuo algo em torno de 1milhão de registros, e agora preciso gerar um sql que me retorne uma posição dentro de uma margem de valores, criei o seguinte sql.
SELECT DISTINCT DS_POSICAO
FROM POSICAO_GPS
WHERE CD_EMPRESA=17
AND DS_POSICAO IS NOT NULL AND
(NR_LAT>=-12.92493 AND NR_LAT<=-12.91493) AND (NR_LOG>=-49.43828 AND NR_LOG<=-49.40828)
ORDER BY DT_POSICAO DESC
LIMIT 1
Quando executo este sql, caso tenha alguma posição nesta margem de valores ela é retornada rapidamento, e no explain ele utiliza os index e passa em apenas 1 linha, isso ta funcionando muito bem.
O problema é se eu passar uma margem que não tenha nenhum registro, simplesmente ele demora 300segundos em media para não retornar nada, e ao testar no explain ele diz que passou em 11 linhas.
"id";"select_type";"table";"type";"possible_keys";"key";"key_len";"ref";"rows";"Extra"
"1";"SIMPLE";"POSICAO_GPS";"index";"Ref_91,Index 10,Index 9,Index 11";"IDX-DTPOSICAO-SQVEICULO-CDEMPRESA";"14";NULL;"11";"Using where; Using temporary"
Criei varios index para ver se melhora o desempenho mas o problema continua se não existir uma posição na margem passada ele demora 300segundos para responder, se tem em menos de 0.200 segundos é respondido. não sei mais o que fazer para resolver isso.
Obrigado!
CREATE TABLE `posicao_gps` (
`SQ_POSICAO_GPS` VARCHAR(36) NOT NULL,
`SQ_VEICULO` INT(11) NULL DEFAULT NULL,
`CD_EMPRESA` INT(6) NULL DEFAULT NULL,
`SQ_DISPOSITIVO_VEICULO` BIGINT(19) NULL DEFAULT NULL,
`DT_POSICAO` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`NR_ANTENA_RASTREAMENTO` BIGINT(20) NULL DEFAULT NULL,
`NR_LAT` VARCHAR(50) NOT NULL,
`NR_LOG` VARCHAR(50) NOT NULL,
`DS_POSICAO` VARCHAR(400) NULL DEFAULT NULL,
`ID_IGNICAO` VARCHAR(1) NULL DEFAULT NULL,
`VL_VELOCIDADE` FLOAT NULL DEFAULT NULL,
`STATUS` VARCHAR(1) NOT NULL DEFAULT 'V',
PRIMARY KEY (`SQ_POSICAO_GPS`),
INDEX `Ref_90` (`SQ_VEICULO`),
INDEX `Ref_91` (`CD_EMPRESA`),
INDEX `IDX-DTPOSICAO-SQVEICULO-CDEMPRESA` (`DT_POSICAO`, `SQ_VEICULO`, `CD_EMPRESA`),
INDEX `SQ_DISPOSITIVO_VEICULO` (`SQ_DISPOSITIVO_VEICULO`),
INDEX `index 7` (`SQ_VEICULO`, `DT_POSICAO`),
INDEX `status` (`STATUS`),
INDEX `Index 10` (`CD_EMPRESA`, `NR_LAT`, `NR_LOG`),
INDEX `Index 9` (`NR_LAT`),
INDEX `Index 11` (`NR_LOG`),
CONSTRAINT `FK_posicao_gps_dispositivo_veiculo` FOREIGN KEY (`SQ_DISPOSITIVO_VEICULO`) REFERENCES `dispositivo_veiculo` (`SQ_DISPOSITIVO_VEICULO`) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT `Ref_90` FOREIGN KEY (`SQ_VEICULO`) REFERENCES `veiculo` (`SQ_VEICULO`) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT `Ref_91` FOREIGN KEY (`CD_EMPRESA`) REFERENCES `empresa` (`CD_EMPRESA`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
Pergunta
shakall
Galera venho novamente pedir ajuda de vocês, com a tabela abaixo possuo algo em torno de 1milhão de registros, e agora preciso gerar um sql que me retorne uma posição dentro de uma margem de valores, criei o seguinte sql.
Quando executo este sql, caso tenha alguma posição nesta margem de valores ela é retornada rapidamento, e no explain ele utiliza os index e passa em apenas 1 linha, isso ta funcionando muito bem. O problema é se eu passar uma margem que não tenha nenhum registro, simplesmente ele demora 300segundos em media para não retornar nada, e ao testar no explain ele diz que passou em 11 linhas.Link para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.