Я использую запрос sqlite для поиска двигателя с наилучшим набором калибровочных значений с использованием определенной формулы. В исходном запросе я заказываю вычисляемый столбец (для выбора top 1), это, по-моему, замедляет мой запрос.Оптимизировать запрос SQLite с упорядочением по вычисленному столбцу?
Я стараюсь сделать этот запрос как можно быстрее. В настоящее время время выполнения составляет около 0,300 секунды, и я смог уменьшить его до 0.150 секунд, ограничив таблицу Volume BETWEEN (0.9*1.7006359100341797) AND (1.1*1.7006359100341797)
и используя tempTable для сортировки вычисленной таблицы (BestMotor
).
Что еще я могу сделать, чтобы улучшить это? Стол имеет таблицу 30000 строк. Количество отдельных MotorVendors составляет около 55.
Вот мой оригинальный запрос: Я пытаюсь найти CalX и CalY, которые ближе всего к указанному тому для каждого отдельного MotorVendor.
SELECT T.MotorVendor, ((1/(CalX)+1/(CalY))) AS BestMotor FROM (
SELECT MotorVendor,
(SELECT CalX
FROM MotorTable AS T2
WHERE MotorType = 'text' and T2.MotorVendor = Tools.MotorVendor
ORDER BY abs(Volume - 1.7006359100341797)
LIMIT 1
) AS CalX,
(SELECT CalY
FROM MotorTable AS T2
WHERE MotorType = 'text' and T2.MotorVendor = Tools.MotorVendor
ORDER BY abs(Volume - 1.7006359100341797)
LIMIT 1
) AS CalY
FROM (SELECT DISTINCT MotorVendor,
FROM MotorTable) AS Tools) AS T
WHERE T.CalX != '' AND T.CalY != ''
ORDER BY BestMotor DESC
LIMIT 1;
А вот запрос с использованием TempTable заказать вычисляемый столбец (с индексом на этом вычисляемый столбец в TempTable):
DELETE FROM TempTable;
INSERT INTO TempTable SELECT T.MotorVendor, ((1/(CalX)+1/(CalY))) AS BestMotor FROM (
SELECT MotorVendor,
(SELECT CalX
FROM MotorTable AS T2
WHERE MotorType = 'text' and T2.MotorVendor = Tools.MotorVendor AND Volume BETWEEN (0.9*1.7006359100341797) AND (1.1*1.7006359100341797)
ORDER BY abs(Volume - 1.7006359100341797)
LIMIT 1
) AS CalX,
(SELECT CalX
FROM MotorTable AS T2
WHERE MotorType = 'text' and T2.MotorVendor = Tools.MotorVendor AND Volume BETWEEN (0.9*1.7006359100341797) AND (1.1*1.7006359100341797)
ORDER BY abs(Volume - 1.7006359100341797)
LIMIT 1
) AS CalX
FROM (SELECT DISTINCT MotorVendor,
FROM MotorTable) AS Tools) AS T
WHERE T.CalX != '' AND T.CalY != ''
ORDER BY BestMotor DESC
LIMIT 1;
SELECT MotorVendor, BestMotor FROM TempTable ORDER BY BestMotor DESC LIMIT 1;
UPDATE ...
я смог уменьшить его до 0.05 секунд ... Я создал таблицу для хранения всех отдельных MotorVendor и сменить основной запрос на это:
SELECT T.MotorVendor FROM (
SELECT MotorVendor,
(SELECT CalX
FROM MotorTable AS T2
WHERE MotorType = 'text' and T2.MotorVendor = Tools.MotorVendor AND Volume BETWEEN (0.9*1.7006359100341797) AND (1.1*1.7006359100341797)
ORDER BY abs(Volume - 1.7006359100341797)
LIMIT 1
) AS CalX,
(SELECT CalY
FROM MotorTable AS T3
WHERE MotorType = 'text' and T3.MotorVendor = Tools.MotorVendor AND Volume BETWEEN (0.9*1.7006359100341797) AND (1.1*1.7006359100341797)
ORDER BY abs(Volume - 1.7006359100341797)
LIMIT 1
) AS CalY
FROM TempMotorVendorTable AS Tools) AS T
ORDER BY ((1/(CalX)+1/(CalY))) DESC LIMIT 1;
Вот схемы двух таблиц и индексов, которые я создал.
CREATE TABLE MotorTable (
CalY real,
CalX real,
Volume real,
MotorType text,
MotorVendor text
);
CREATE TABLE TempMotorVendorTable (
MotorVendor TEXT
);
CREATE INDEX `MotorVendorIndex` ON MotorTable (`MotorVendor` ASC)
CREATE INDEX VolumeIndex ON MotorTable (Volume DESC)
Выход EXPLAIN QUERY ПЛАН
"0" "0" "0" "SCAN TABLE TempMotorVendorTable AS Tools"
"0" "1" "1" "SEARCH TABLE MotorTable USING AUTOMATIC COVERING INDEX (MotorVendor=?)"
"0" "0" "0" "EXECUTE CORRELATED SCALAR SUBQUERY 1"
"1" "0" "0" "SEARCH TABLE MotorTable AS T2 USING INDEX CompToolIndex (MotorVendor=?)"
"1" "0" "0" "USE TEMP B-TREE FOR ORDER BY"
"0" "0" "0" "EXECUTE CORRELATED SCALAR SUBQUERY 2"
"2" "0" "0" "SEARCH TABLE MotorTable AS T3 USING INDEX CompToolIndex (MotorVendor=?)"
"2" "0" "0" "USE TEMP B-TREE FOR ORDER BY"
"0" "0" "0" "USE TEMP B-TREE FOR ORDER BY"
Показать схему базы данных и вывод [EXPLAIN PLAN ЗАПРОСА] (http://www.sqlite.org/eqp.html). –
Только что обновил мой вопрос более подробно для схемы и вывода 'EXPLAIN QUERY PLAN' – 22332112
Что такое' historyCR'? –