Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Propel, relacja "n do m", niska wydajność
joebezucha
post
Post #1





Grupa: Zarejestrowani
Postów: 43
Pomógł: 1
Dołączył: 23.05.2007
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


Witam,

Pracuje wlaśnie nad projektem z wykorzystaniem frameworka Symfony i pojawił sie pierwszy problem. Problemem jest wydajność Propel-a.

Fragment opisu schematu bazy danych:

  1. CREATE TABLE `answer`
  2. (
  3. `id` INTEGER NOT NULL AUTO_INCREMENT,
  4. `question_id` INTEGER NOT NULL,
  5. `no` INTEGER NOT NULL,
  6. `body` TEXT NOT NULL,
  7. `scale` INTEGER,
  8. `grade` INTEGER,
  9. PRIMARY KEY (`id`),
  10. INDEX `FI_answer_1` (`question_id`),
  11. CONSTRAINT `FK_answer_1`
  12. FOREIGN KEY (`question_id`)
  13. REFERENCES `question` (`id`)
  14. ON DELETE CASCADE
  15. )Type=InnoDB;
  16.  
  17. CREATE TABLE `test`
  18. (
  19. `id` INTEGER NOT NULL AUTO_INCREMENT,
  20. `status` INTEGER NOT NULL,
  21. `test_type` INTEGER NOT NULL,
  22. `lname` VARCHAR(40) NOT NULL,
  23. `fname` VARCHAR(24) NOT NULL,
  24. `birthdate` DATE NOT NULL,
  25. `sex` CHAR NOT NULL,
  26. `school_type` INTEGER NOT NULL,
  27. `user_id` INTEGER NOT NULL,
  28. `password` VARCHAR(20),
  29. `created_at` DATETIME,
  30. `timestart` DATETIME,
  31. `timefinish` DATETIME,
  32. `ip` VARCHAR(15),
  33. PRIMARY KEY (`id`),
  34. INDEX `FI_test_1` (`user_id`),
  35. CONSTRAINT `FK_test_1`
  36. FOREIGN KEY (`user_id`)
  37. REFERENCES `user` (`id`)
  38. ON DELETE CASCADE
  39. )Type=InnoDB;
  40.  
  41. CREATE TABLE `test_answer`
  42. (
  43. `test_id` INTEGER NOT NULL,
  44. `answer_id` INTEGER NOT NULL,
  45. PRIMARY KEY (`test_id`,`answer_id`),
  46. INDEX `FI_ta_1` (`answer_id`),
  47. CONSTRAINT `FK_ta_1`
  48. FOREIGN KEY (`answer_id`)
  49. REFERENCES `answer` (`id`)
  50. ON DELETE CASCADE,
  51. CONSTRAINT `FK_ta_2`
  52. FOREIGN KEY (`test_id`)
  53. REFERENCES `test` (`id`)
  54. ON DELETE CASCADE
  55. )Type=InnoDB;


Jak widać są tu 3 tabele test, asnwer, i tabela test_answer która odpowida za relacje "n do m"

W skrypcie PHP mam:

  1. <?php
  2. $this->test = TestPeer::retrieveByPk($this->getRequestParameter('id')); // 1*
  3. $c = new Criteria();
  4. $c->setLimit(10);
  5. $test_answers = $this->test->getTestAnswersJoinAnswer($c);  // 2*
  6. foreach ($test_answers as $test_answer){
  7. $answer = $test_answer->getAnswer();
  8. }
  9. ?>

No i w tym momencie pojawił się problem z wydajością PROPELa. Czas tworzenia kolekcji $test_answers rośnie po exponencie;) przy limicie ustawionym na 200 skrypt zostaje zakończony w wyniku przekroczenia limitu czasu(60sekund). No a wszystkich odpowiedzi mam do pobrania 214.

W narzędziu WebDebug (część frameworka Symfony) widze, że wykonywane są tylko dwa zapytania do bazy:
1* pobranie testu
2* pobranie danych z tabel test_answer złączonej z answer

Czyli nie ma problemu z zapętlaniem zapytań do bazy danych.
Zresztą robie wszytsko zgodnie z instrukcją propel.phpdb.org/trac/wiki/Users/Documentation/1.2/ManyToManyRelationships

Czy Propel jest aż tak mało wydajny?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Potrzebuję pełnych danych odpowiedzi na pytania testowe do przeliczenia wyników końcowych. Mogę oczywiście obejść Propela, skorzystac bezposrednio z Creola i operować na tablicach zamiast na obiektach. No ale zastanawia mnie ta bardzo niska wydajność.

Jakieś pomysły?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował joebezucha 2.07.2007, 15:19:31
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
joebezucha
post
Post #2





Grupa: Zarejestrowani
Postów: 43
Pomógł: 1
Dołączył: 23.05.2007
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


No i chyba juz wiem w czym problem.

Dotąd aplikację odpalełem pod WAMPem. Większośc z podstron generowana byla przez okolo 1sekunde (dość sporo jak na proste wyswietlenie danych obiektów)

Zainstalowałem najnowsze PHP 5.2.3, Upgrade PEAR (z problemami) No ale czas wykonania problematycznego skryptu byl ciągle bliski 1minuty.
Problem nie istnieje natomiast na platformie LAMP (instalacja na Ubuntu 7.04, PHP 5.2.1)
Większość podstron generowana jest w czasie 250-500ms a problematyczny skrypt około 3-4sekund

Także wyglada na to ze ogołnie pod Windowsem jest slabsza wydajnośc przetwarzania skryptów no a moj przypadek to juz wogóle skrajna sytuacja...

Inna sprawa to tez dziwny problem z upgradem PEAR pod windowsem. Przy upgradzie oraz przy instalacji paczek ciągle wywalał błąd braku pamięci (przekroczenie 8MB). Jednak zmiany w php.ini (memory_limit) nic nie pomagały.

Pomogło dopiero dodanie w pliku pearcmd.php lini:
  1. <?php
  2. ini_set('memory_limit', '100M');
  3. ?>


tak 100MB (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) , zgaduje że jest jakis problem z PEAR z jakąs podstawową operacją w stylu czytanie pliku, ktora pod windowsem stała sie potwornie pamięciożerna.

Przy upgradzie PEAR pod Ubuntu takiego problemu nie było!

Także podsumowując zraziłem sie do WAMPa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 18:32