mySQL объединяет несколько таблиц (4) и сводную таблицу - PullRequest
0 голосов
/ 14 февраля 2019

edit 3: я сделал некоторые улучшения:

  1. Использовал сервер с большей вычислительной мощностью (2 -> 4 ядра и т. Д.)

  2. Фильтрация по каждому утверждению объединения:

    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, ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...