Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 1 086 Pomógł: 8 Dołączył: 10.12.2003 Ostrzeżenie: (0%)
|
Zaprojektowałem bazę danych do przechowywania dokumentów sprzedażowych z ich pozycjami. W uproszczeniu do istotnych kolumn wygląda ona tak:
Kod ┌────────────┐ ┌────────────┐ │ invoices │ │ items │ ├────────────┤ ├────────────┤ │ id │ 1 n │ id │ │ date ├────────┤ invoice_id │ │ number │ │ position │ │ contractor │ │ name │ └────────────┘ │ quantity │ │ price │ └────────────┘ Jak widać, w tabeli "invoices" nie przechowuję sumy pozycji. Dla wygody stworzyłem więc widok: Kod CREATE VIEW invoices_summary AS SELECT invoices.*, SUM(items.quantity * items.price) AS total FROM invoices LEFT JOIN items ON (items.invoice_id = invoices.id) GROUP BY invoices.id Powyższe działało bardzo fajnie na MySQL aż do rozrośnięcia się danych. Obecnie wyciągnięcie choćby jednego wiersza z "invoices_summary" trwa ok. 2 sekund. Przyczyną kulejącej wydajności jest ograniczenie algorytmu MERGE w MySQL: https://dev.mysql.com/doc/refman/8.0/en/view-algorithms.html MySQL nie potrafi użyć MERGE gdy widok korzysta z funkcji grupujących. Stąd każde zapytanie do "invoices_summary" to generowanie tymczasowej tabeli na podstawie setek tysięcy. Gdyby MySQL "przeniosło" moje WHERE do wnętrza widoku, wystarczyłoby kilkadziesiąt wierszy. Szukam pomysłu jak wybrnąc z tej sytuacji i potrzebuję pomocy. Rozważałem:
Czy ktoś ma jakieś inne pomysły albo ogólnie sugestie? |
|
|
|
Zajec Projekt i wybór bazy - normalizacja oraz wydajność widoków 12.09.2020, 11:49:17
trueblue 1. Ile obecnie jest tych danych (faktur i pozycji)... 12.09.2020, 12:12:23 
Zajec Cytat(trueblue @ 12.09.2020, 13:12:23... 12.09.2020, 12:31:01
trueblue 1. To tyle co nic. Założone są indeksy na kolumny ... 12.09.2020, 12:37:14 
Zajec Cytat(trueblue @ 12.09.2020, 13:37:14... 12.09.2020, 12:47:40
trueblue Sprawdź jeszcze wynik EXPLAIN SELECT... 12.09.2020, 13:26:05
viking Albo zmień bazę na postgresa, stwórz sobie widok z... 12.09.2020, 13:30:49
Pyton_000 Wywal ten widok i zakoduj zapytanie w aplikacji a ... 12.09.2020, 16:17:47
phpion Nie ma co na siłę trzymać się normalizacji, czasem... 13.09.2020, 08:51:46
Zajec Dzięki wszystkim za odpowiedzi, wątpliwości co do ... 15.09.2020, 21:10:43
trueblue Cytat(Zajec @ 15.09.2020, 22:10:43 ) ... 16.09.2020, 06:04:45
Zajec Cytat(trueblue @ 16.09.2020, 07:04:45... 16.09.2020, 06:21:51 ![]() ![]() |
|
Aktualny czas: 19.12.2025 - 12:54 |