2016-07-04 2 views
0

У меня проблема с запросом sql, он дает мне то, что я хочу, и на моем компьютере отлично работает, но поскольку я должен запускать свой db на компьютере школы, я попадаю в проблема. Запрос требует 34! секунд для выполнения, в то время как на моем компьютере она должна как 6.SQL-запрос медленный для выполнения

Это мой DB:

enter image description here

Запрос: вы должны найти 1 ПМ (Max (Carico)) из упражнений «Panca Orizzontale», «Squat», «Estensioni Bilanciere», «Squat» для каждого пользователя, который был членом спортзала более 5 лет.

Это вопрос, который я использую:

SELECT U.Nome 
    , U.Cognome 
    , MAX(P1.Carico) AS MaxPanca_Orizzontale 
    , MAX(P2.Carico) AS MaxSquat 
    , MAX(P3.Carico) AS MaxEstensioni_Bilanciere 
    , MAX(P4.Carico) AS MaxLento_Avanti 
    FROM utente AS U 
    left 
    join scheda AS S1 
    on U.CF=S1.ID_Utente 
    left 
    join programma AS P1 
    on S1.ID_Scheda = P1.ID_Scheda 
    AND P1.nRipetizioni = 1 
    AND P1.Esercizio = "Panca Orizzontale" 
    left 
    join scheda AS S2 
    on U.CF=S2.ID_Utente 
    left 
    join programma AS P2 
    on S2.ID_Scheda = P2.ID_Scheda 
    AND P2.nRipetizioni = 1 
    AND P2.Esercizio = "Squat" 
    left 
    join scheda AS S3 
    on U.CF = S3.ID_Utente 
    left 
    join programma AS P3 
    on S3.ID_Scheda = P3.ID_Scheda 
    AND P3.nRipetizioni = 1 
    AND P3.Esercizio = "Estensioni Bilanciere" 
    left 
    join scheda AS S4 
    on U.CF = S4.ID_Utente 
    left 
    join programma AS P4 
    on S4.ID_Scheda = P4.ID_Scheda 
    AND P4.nRipetizioni = 1 
    AND P4.Esercizio = "Lento Avanti" 
WHERE U.CF IN(SELECT U.CF 
       FROM utente U 
       WHERE Data_Iscrizione < date_sub(curdate(), interval 5 year) 
      ) 
GROUP 
    BY U.Nome 
    , U.Cognome; 

Это желаемый результат:

enter image description here

Вероятно, все те, присоединиться являются проблемой, есть способ сделать это быстрее выполнить? спасибо за ваше время

+1

может вы обеспечиваете tablestructures и некоторые данные? – Philipp

+0

... и желаемый результат. – Strawberry

+0

добавил желаемый результат, теперь я пытаюсь добавить таблицу create – LucaPearl

ответ

0

Я бы сказал, что вам лучше добавить programma.Esercizio в группу. Что-то вроде:

SELECT U.Nome, U.Cognome, P.Esercizio, MAX(Carico) AS MaxCarico 
FROM utente AS U left join scheda AS S1 on U.CF=S1.ID_Utente 
left join programma AS P1 on S1.ID_Scheda=P1.ID_Scheda AND P1.nRipetizioni=1 
WHERE U.CF IN(SELECT U.CF FROM utente U WHERE Data_Iscrizione < date_sub(curdate(), interval 5 year)) 
GROUP BY U.Nome, U.Cognome, P.Esercizio; 

Выход будет немного отличаться (дополнительный столбец и 4 строки вместо пе), но его намного лучше ее обрабатывать для сервера баз данных. Не могли бы вы проверить это и посмотреть, все ли это соответствует вашим потребностям?

0

Я изменил все свои ответы и написал новые данные.

сначала вы должны создать 2 новых indexe

ALTER TABLE programma 
ADD KEY `idx_nRipetizioni` (`nRipetizioni`,`ID_Scheda`,`Esercizio`); 

ALTER TABLE utente 
ADD KEY `idx_ata_Iscrizione` (`Data_Iscrizione`); 

, а затем вы можете запустить. пожалуйста, протестируйте его, результат будет таким же. , если вы хотите иметь NULL вместо 0 изменения , 0) в , NULL) в если заявление

И увидеть время выполнения :-)

SELECT 
    U.Nome, 
    U.Cognome, 
    MAX(IF(P1.Esercizio="Panca Orizzontale",P1.Carico,0)) AS MaxPanca_Orizzontale, 
    MAX(IF(P1.Esercizio="Squat",P1.Carico,0)) AS MaxSquat, 
    MAX(IF(P1.Esercizio="Estensioni Bilanciere",P1.Carico,0)) AS MaxEstensioni_Bilanciere, 
    MAX(IF(P1.Esercizio="Lento Avanti",P1.Carico,0)) AS MaxLento_Avanti 
FROM utente AS U 
LEFT JOIN scheda AS S1 ON U.CF=S1.ID_Utente 
LEFT JOIN programma AS P1 ON S1.ID_Scheda=P1.ID_Scheda 
      AND P1.nRipetizioni=1 
WHERE Data_Iscrizione < date_sub(curdate(), INTERVAL 5 YEAR) 
GROUP BY U.Nome, 
     U.Cognome; 

образца

создать индекс

MariaDB [yourschema]> ALTER TABLE programma 
    -> ADD KEY `idx_nRipetizioni` (`nRipetizioni`,`ID_Scheda`,`Esercizio`); 

Query OK, 0 rows affected (0.27 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

создать индекс

MariaDB [yourschema]> ALTER TABLE utente 
    -> ADD KEY `idx_ata_Iscrizione` (`Data_Iscrizione`); 
Query OK, 0 rows affected, 1 warning (0.08 sec) 
Records: 0 Duplicates: 0 Warnings: 1 

запустить запрос

MariaDB [yourschema]> SELECT 
    -> U.Nome, 
    -> U.Cognome, 
    -> MAX(IF(P1.Esercizio="Panca Orizzontale",P1.Carico,0)) AS MaxPanca_Orizzontale, 
    -> MAX(IF(P1.Esercizio="Squat",P1.Carico,0)) AS MaxSquat, 
    -> MAX(IF(P1.Esercizio="Estensioni Bilanciere",P1.Carico,0)) AS MaxEstensioni_Bilanciere, 
    -> MAX(IF(P1.Esercizio="Lento Avanti",P1.Carico,0)) AS MaxLento_Avanti 
    -> FROM utente AS U 
    -> LEFT JOIN scheda AS S1 ON U.CF=S1.ID_Utente 
    -> LEFT JOIN programma AS P1 ON S1.ID_Scheda=P1.ID_Scheda 
    ->   AND P1.nRipetizioni=1 
    -> WHERE Data_Iscrizione < date_sub(curdate(), INTERVAL 5 YEAR) 
    -> GROUP BY U.Nome, 
    ->   U.Cognome; 
+------------+--------------+----------------------+----------+--------------------------+-----------------+ 
| Nome  | Cognome  | MaxPanca_Orizzontale | MaxSquat | MaxEstensioni_Bilanciere | MaxLento_Avanti | 
+------------+--------------+----------------------+----------+--------------------------+-----------------+ 
| Ajeje  | Brazov  |     0.0 | 100.0 |      0.0 |   35.0 | 
| Aldo  | Baglio  |     80.0 | 120.0 |      32.5 |   50.0 | 
| Fernando | Torres  |     0.0 | 150.0 |      0.0 |   35.0 | 
| Francesco | Toldo  |     90.0 |  0.0 |      40.0 |    0.0 | 
| Giovanni | Storti  |     65.0 |  0.0 |      0.0 |   30.0 | 
| Guendalina | Porte  |     0.0 |  50.0 |      20.0 |   25.0 | 
| Harry  | Potter  |    150.0 | 180.0 |      80.0 |   122.5 | 
| John  | Cena   |    135.0 | 240.0 |      60.0 |   75.5 | 
| Kevin  | Velociraptor |     0.0 |  0.0 |      20.0 |   95.0 | 
| Luciano | Spalletti |     60.0 | 280.0 |      95.0 |   100.0 | 
| Marcella | Mandria  |     0.0 |  50.0 |      0.0 |   27.5 | 
| Marcelo | Zalayeta  |    140.0 | 200.0 |      55.0 |   60.0 | 
| Radja  | Nainggolan |     90.0 | 120.0 |      0.0 |   40.0 | 
| Romina  | Power  |     0.0 |  0.0 |     140.0 |   20.0 | 
+------------+--------------+----------------------+----------+--------------------------+-----------------+ 
14 rows in set (0.00 sec) 

MariaDB [yourschema]> 
+0

Я пробовал, но это показывает мне ошибку: # 1248 - Каждая производная таблица должна иметь свой собственный псевдоним – LucaPearl

+0

@LucaPearl - теперь ошибки, исправленные в моем ответе. пожалуйста, проверьте еще раз. у меня нет данных –

+0

Нет, это не работает, это то, что он показывает https://i.gyazo.com/43316678aac5c90bd302f2d5f83d0c7c.png – LucaPearl

Смежные вопросы