![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 1 660 Pomógł: 13 Dołączył: 9.06.2004 Skąd: Wrocław i okolice Ostrzeżenie: (0%) ![]() ![]() |
Witam serdecznie.
Mam w bazie danych realację jeden do wielu. Mam tabelę transporty oraz miejsca. Do jednego transportu może być przypisanych kilka miejsc. Aby całość trasy (wszystkie miejsca danego transportu) wyciąnąć w zapytaniu daję GROUP CONCAT:
Niestety daje mi to czas 8 sekund dla 100 rekordow. Po usunieciu GROUP_CONCAT daje mi czas 0,03s. Co próbowałem: 1. Uproszczenie GROUP_CONCAT: (SELECT GROUP_CONCAT(M.Miejscowosc SEPARATOR '-') FROM m_miejsca AS M WHERE M.ID_transport=T.ID_t ) - nic nie daje (minimalne przyspieszenie - 1,5%) 2. Przeniesienie funkcjonalności do "STORED FUNCTION" - także nic Czy ktoś ma jakiś pomysł? -------------------- |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Od razu trzeba było powiedzieć, że takiego kolosa testujesz, bo takie wyniki przy pierwszym podanym przez Ciebie zapytaniu i 100 rekordach w moich oczach były po prostu niemożliwe. Z DISTINCT to jest tak, że w przypadku posortowanego zbioru danych (ORDER BY) tworzona jest tabela tymczasowa i to z niej są wybierane rekordy bez duplikatów... stąd tak długi czas wykonywania zapytania. Z założenia DISTINCT ma służyć do wybrania rekordów bez powtórzeń, ale to samo można osiągnąć grupując powtarzające się rekordy według odpowiednich kolumn. DISTINCT to po prostu "specjalny przypadek GROUP BY". Zastanawia mnie tylko skąd założenie, że przy tak dużej ilości danych (gdzie każde T.ID_t powinno być unikalne) pojawią się duplikaty.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 05:42 |