Project

General

Profile

Bug #8105

Lenteur Agenda avec beaucoup de data

Added by David Guénard almost 4 years ago. Updated almost 4 years ago.

Status:
Bug resolved
Priority:
Normal
Assignee:
Category:
Agenda
Target version:
Start date:
24/02/2016
Due date:
% Done:

100%

Estimated time:
Complexity:
Normal
SCRUM pts - complexity:
?

Description

Je rencontre des lenteurs excessive avec l'agenda quand il y a beaucoup d'événements (30 secondes pour afficher les événements)...

Le problème est lors de l'affichage de l'agenda la requête ci-dessous retourne 800 résultats

SELECT DISTINCT agenda.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.ref, to_user_id 
FROM c_calendar_event agenda 
INNER JOIN c_item_property ip ON (agenda.id = ip.ref AND agenda.c_id = ip.c_id) 
WHERE ip.tool='calendar_event' AND (ip.visibility IN ('1', '0')) 
AND agenda.c_id = 5305 
AND ( agenda.session_id = 0 AND ip.session_id IS NULL ) 
AND ( agenda.start_date BETWEEN '2016-01-31 23:00:00' 
AND '2016-03-13 23:00:00' OR agenda.end_date BETWEEN '2016-01-31 23:00:00' 
AND '2016-03-13 23:00:00' OR ( agenda.start_date IS NOT NULL AND agenda.end_date IS NOT NULL AND YEAR(agenda.start_date) = YEAR(agenda.end_date) AND MONTH('2016-01-31 23:00:00') BETWEEN MONTH(agenda.start_date) AND MONTH(agenda.end_date) ) ) 

Puis la boucle while exécute 800 fois la requête suivante :

SELECT DISTINCT to_user_id, to_group_id FROM c_item_property ip INNER JOIN c_calendar_event agenda ON (ip.ref = agenda.id AND ip.c_id = agenda.c_id) WHERE ip.tool = 'calendar_event' AND ref = 31 AND ip.visibility = '1' AND ip.c_id = 5305 AND (ip.session_id = 0 OR ip.session_id IS NULL)

qui est 800 fois la même requête si les variables $eventId,$course_id,$this->sessionId n'ont pas changé !

Je propose donc avec ces tests de gagner du temps :

if (Database::num_rows($result)) {
            $eventsAdded = array_column($this->events, 'unique_id');

// initialisation des variables a une valeurs avant la boucle while

            $cache_eventId =$cache_course_id=$cache_sessionId=-1;
            $cache_items=array();

            while ($row = Database::fetch_array($result, 'ASSOC')) {

                $eventId = $row['ref'];

// tests si les variables on changer 

                if (( $cache_eventId!=-1  && $cache_course_id!=-1 && $cache_sessionId!=-1) && ($cache_eventId!=$eventId  || $cache_course_id!=$course_id || $cache_sessionId!=$this->sessionId)){
                    $items = $this->getUsersAndGroupSubscribedToEvent(
                        $eventId,
                        $course_id,
                        $this->sessionId
                    );

// mise a jour des variables

                    $cache_eventId =$eventId;
                    $cache_course_id=$course_id;
                    $cache_sessionId=$this->sessionId;
                    $cache_items=$items;
                }else{

// sinon c'est le meme 
                     $items =$cache_items;
                }

                $group_to_array = $items['groups'];
                $user_to_array = $items['users'];
                $event = array();
                $event['id'] = 'course_'.$row['id'];
                $event['unique_id']  = $row['iid'];

C'est lignes de code supplémentaire me permettre d'avoir un affichage en 2.62 secondes au lieu de 34 secondes avant !


Files

catalogue.jpg (70.7 KB) catalogue.jpg David Guénard, 25/02/2016 10:44

Associated revisions

History

#1

Updated by Julio Montoya almost 4 years ago

Can you provide a mysql dump to make some tests?

I did some changes here:

https://github.com/chamilo/chamilo-lms/commit/aebd287c3cf6f86e896a758bd48e604deac476e5

But I don't have that data to check if its faster enought.

#2

Updated by David Guénard almost 4 years ago

Which tables you want for dump file ?
the database's size is 4.6GB...

#3

Updated by Julio Montoya almost 4 years ago

David Guénard wrote:

Which tables you want for dump file ?
the database's size is 4.6GB...

4.6 mmm lets try with c_calendar_event, c_item_property and course

#4

Updated by David Guénard almost 4 years ago

the sql file is sent by filesender on your email.

Chamilo operation is very slow with large number of data (14500 categories, 7500 courses, 42000 users), it is impossible to view the course catalog ....

David

#5

Updated by Julio Montoya almost 4 years ago

thanks!
I will check it!

#6

Updated by Julio Montoya almost 4 years ago

  • Status changed from New to Needs more info

In which course is the problem and with which user id?

And I can load the course catalog very fast.

#7

Updated by David Guénard almost 4 years ago

Pour l'agenda la lenteur est pour le cours correspondant a la requête :

SELECT DISTINCT agenda.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.ref, to_user_id 
FROM c_calendar_event agenda 
INNER JOIN c_item_property ip ON (agenda.id = ip.ref AND agenda.c_id = ip.c_id) 
WHERE ip.tool='calendar_event' AND (ip.visibility IN ('1', '0')) 
AND agenda.c_id = 5305 
AND ( agenda.session_id = 0 AND ip.session_id IS NULL ) 
AND ( agenda.start_date BETWEEN '2016-01-31 23:00:00' 
AND '2016-03-13 23:00:00' OR agenda.end_date BETWEEN '2016-01-31 23:00:00' 
AND '2016-03-13 23:00:00' OR ( agenda.start_date IS NOT NULL AND agenda.end_date IS NOT NULL AND YEAR(agenda.start_date) = YEAR(agenda.end_date) AND MONTH('2016-01-31 23:00:00') BETWEEN MONTH(agenda.start_date) AND MONTH(agenda.end_date) ) ) 

Pour le catalogue de cours c'est avec tous

#8

Updated by Julio Montoya almost 4 years ago

David Guénard wrote:

Pour l'agenda la lenteur est pour le cours correspondant a la requête :

[...]

Pour le catalogue de cours c'est avec tous

With my fix added here:

https://github.com/chamilo/chamilo-lms/commit/aebd287c3cf6f86e896a758bd48e604deac476e5

The calendar is loaded very quick. Can you try it if it works for you?

#9

Updated by Julio Montoya almost 4 years ago

And the course catalog its also very fast. Maybe this was already fixed.

#10

Updated by David Guénard almost 4 years ago

oui le catalogue de cours reste long à afficher -> 22 secondes.

Mais peut-être que c'est normal (14500 categories, 7500 courses, 42000 users)

David

#11

Updated by Julio Montoya almost 4 years ago

David Guénard wrote:

oui le catalogue de cours reste long à afficher -> 22 secondes.

Mais peut-être que c'est normal (14500 categories, 7500 courses, 42000 users)

David

normalement ca doit être très rapide car il y a une pagination ...

#12

Updated by Yannick Warnier almost 4 years ago

  • Status changed from Needs more info to Bug resolved
  • Assignee set to Julio Montoya
  • % Done changed from 0 to 100

David, je ferme cette tâche. Pas qu'elle soit considérée complètement résolue, mais honnêtement, il est relativement difficile d'optimiser le calendrier plus que ça. Le problème c'est qu'il doit exécuter des opérations assez complexes pour savoir à qui montrer quoi (ce sont plusieurs queries qui se suivent et qui se rejoignent). Pour la quantité d'utilisateurs que tu as (j'ignore ce que sont tes "catégories", mais j'imagine que ce ne sont pas des catégories de cours vu qu'il y en a 2 fois plus que de cours), je crois que ça vaut la peine de penser à plus de processeurs sur le serveur...

En tout cas, pour pouvoir faire mieux, il faudrait plutôt aller dans la direction de l'optimisation de MySQL hors Chamilo. Le support communautaire va jusqu'à un certain point. Ici c'est plutôt un service personnalisé professionnel qu'il te faudrait (pas que celui-ci ne soit pas professionnel, mais nous ne pouvons pas personnaliser notre attention en tant que volontaires pour 29000 portails Chamilo installés dans le monde). Si besoin de services: .

Also available in: Atom PDF