edit 3: я сделал некоторые улучшения:
Использовал сервер с большей вычислительной мощностью (2 -> 4 ядра и т. Д.)
Фильтрация по каждому утверждению объединения:
From tblLaps
inner join tblSectorsInLap on fk_LapPoint = id_tblLaps
AND tblLaps.eventid = 22
AND LapTime > 30
inner join tblTrackSectorDefinition ON fk_SegmentEntry = tblSegmentDataID
inner join tblSectorMetrics on id_tblSectorsInLap = fk_segmentpoint
Являются ли операторы MAX правильным способом для Pivot?или есть потенциально что-то еще, что было бы «лучше»?
edit 2 на основе обратной связи:
SQLFiddle Это представляет мою схему (немного уменьшенную) с некоторыми примерами данных.
Запрос дает мне вывод, который я хочу.Когда вставляются реальные данные и появляется ~ 50 000 «орбит», это вызывает ~ 18 000 000 записей в tblmetricpoint, и запрос начинает занимать сотни секунд (что кажется слишком длинным)
Я оставил оригинальный постинформация ниже:
У меня есть следующий запрос:
Select concat(DeviceType, ' ', DeviceSerialNumber ) As DeviceName, LapCount, Round(LapTime, 3) AS LapTime
, MAX(CASE WHEN MetricChannel = 'EnergyIncrementingCounter' AND MetricType = 6 AND SegmentNumber = 0 THEN MetricValue END) AS EnergyIncrementingCounter_Diff
, MAX(CASE WHEN MetricChannel = 'EnergyIncrementingCounter' AND MetricType = 3 AND SegmentNumber = 0 THEN MetricValue END) AS EnergyIncrementingCounter_Max
, MAX(CASE WHEN MetricChannel = 'ConditionOfTheTrack' AND MetricType = 1 AND SegmentNumber = 0 THEN MetricValue END) AS ConditionOfTheTrack_Ave
, MAX(CASE WHEN MetricChannel = 'b_InPitLaneCrossed' AND MetricType = 3 AND SegmentNumber = 0 THEN MetricValue END) AS PitIn
, MAX(CASE WHEN MetricChannel = 'b_OutPitLaneCrossed' AND MetricType = 3 AND SegmentNumber = 0 THEN MetricValue END) AS PitOut
, MAX(Case WHEN MetricChannel = 'MotorEfficiency' AND MetricType = 1 AND SegmentNumber = 13 THEN MetricValue END) AS MotorEfficiency_p1_AVE
, MAX(Case WHEN MetricChannel = 'MotorEfficiency2' AND MetricType = 1 AND SegmentNumber = 13 THEN MetricValue END) AS MotorEfficiency2_p1_AVE
, MAX(Case WHEN MetricChannel = 'MotorEfficiency' AND MetricType = 1 AND SegmentNumber = 17 THEN MetricValue END) AS MotorEfficiency_p2_AVE
, MAX(Case WHEN MetricChannel = 'MotorEfficiency2' AND MetricType = 1 AND SegmentNumber = 17 THEN MetricValue END) AS MotorEfficiency2_p2_AVE
From tblLaps
left join tblSectorsInLap on fk_LapPoint = id_tblLaps
left join tblTrackSectorDefinition ON fk_SegmentEntry = tblSegmentDataID
left join tblSectorMetrics on id_tblSectorsInLap = fk_segmentpoint
WHERE tblLaps.eventid = 22
GROUP BY id_tblLaps
HAVING min(EnergyIncrementingCounter_Diff) >= 0 AND LapTime > 30
Это работает достаточно хорошо для eventid = 20 (который имеет небольшое количество записей в tblSectorMetrics).Однако, если у меня есть большое количество записей, скажем, 80 000 000 (в tblSectorMetrics).Запрос занимает 11 секунд для продолжительности и 75 секунд для извлечения (MySQL Workbench), когда ограничение составляет 2000 записей.Если я не ограничиваю количество результатов, я получаю ~ 70 000 записей, и это занимает почти час, тогда я экспортирую набор результатов в CSV, который составляет ~ 10 МБ.
Мой вопрос: Есть ли лучший способ структурировать мой SQL-запрос, чтобы он не занимал так много времени?
Мой другой вопрос: Есть ли лучший способ получить результаты (сохраненный процесс / представление и т. д.)?
Мой третий вопрос: Есть ли что-то в схеме, на которую я должен обратить внимание при изменении?
У меня нет сильногофон в SQL, и я создал вышеупомянутый запрос из нескольких сообщений на этом сайте, поэтому я не уверен, что пропустил что-то фундаментальное, что помогло бы мне
Таблица Объяснения:
tblLaps:
'id_tblLaps', 'int(11)', 'NO', 'PRI', NULL, 'auto_increment'
'DeviceType', 'varchar(10)', 'NO', '', NULL, ''
'DeviceSerialNumber', 'varchar(10)', 'NO', '', NULL, ''
'LapCount', 'int(11)', 'NO', '', NULL, ''
'LapTime', 'double', 'NO', '', NULL, ''
'Driver', 'varchar(45)', 'YES', '', NULL, ''
'eventid', 'int(11)', 'NO', 'MUL', NULL, ''
tblSectorsInLap:
'id_tblSectorsInLap', 'int(11)', 'NO', 'PRI', NULL, 'auto_increment'
'fk_SegmentEntry', 'int(11)', 'NO', 'MUL', NULL, ''
'TimeSegmentStarted', 'datetime', 'YES', '', NULL, ''
'TrackCondition', 'int(11)', 'YES', '', NULL, ''
'fk_LapPoint', 'int(11)', 'NO', 'MUL', NULL, ''
tblTrackSectorDefinition:
'id_tblTrackSectorDefinition', 'int(11)', 'NO', 'PRI', NULL, 'auto_increment'
'EventID', 'int(11)', 'NO', 'MUL', NULL, ''
'StartDistance', 'double', 'NO', '', '0', ''
'EndDistance', 'double', 'NO', '', '0', ''
'SegmentName', 'varchar(45)', 'YES', '', 'Segment Name Goes Here', ''
'SegmentNumber', 'int(4)', 'YES', '', NULL, ''
tblSectorMetrics:
'MetricType', 'int(11)', 'NO', 'MUL', NULL, ''
'MetricValue', 'double', 'YES', '', NULL, ''
'tblInstanceID', 'int(11)', 'NO', 'PRI', NULL, 'auto_increment'
'MetricChannel', 'mediumtext', 'NO', '', NULL, ''
'fk_SegmentPoint', 'int(11)', 'NO', 'MUL', NULL, ''