![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 27.09.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Opiszę problem: tabela: produkt produkt2sklep (8mln) sklep (40tys) (posiada pole id_sieci) siec (200) Gdy chcę pobrać produkty należące do danej sieci, robie (w uproszczeniu): product JOIN produkt2sklep JOIN sklep JOIN siec (poniewaz sklep jest przypisany do sieci, a produkt do sklepu poprzez tabele produkt2sklep). Poniewaz w ostatnim czasie bardzo rozrosła sie tabela produkt2sklep czas zapytan wzrósł do kilku sekund, a to stanowczo za duzo. Dodam, że używam indexów tam, gdzie potrzeba. ROZWIAZANIE? Czy dodac tabele product2siec, ktora bylaby uzywana tylko do tego zapytania? Chyba najwiekszym minusem tego rozwiazania jest utrata integralności, bo wtedy produkt jest przypisany do sieci poprzez bezposrednie polaczenie nową tabela, oraz przez stare polaczenie poprzez tabele sklep. Plusem natomiast jest to, ze biorac pod uwage ilosci wierszy w tabeli siec i produkt2sklep rozwiazanie to (wg mnie) znacznie skrociloby czas wykonywania zapytania. Dla dbania o integralnosc pomyslalem, ze mozna codziennie uruchamiac skrypt, ktory bedzie aktualizowal tabele produkt2siec, zeby zawarte w niej dane byly zawsze zgodne z reszta bazy. Co o tym myslicie? Może macie inne pomysły na rozwiazanie tego problemu? Ten post edytował madar 15.07.2011, 11:27:54 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 27.09.2006 Ostrzeżenie: (0%) ![]() ![]() |
Tak, produkt jest przypisany do wielu sklepów, a kazdy sklep jest przypisany do jednej sieci. poniewaz produkt jets przypsiany do wielu sklepow, to tabela produkt2sklep rozrosla sie do takiej wielkosci.
W każdym razie obrazowo tabele wygladaja tak: PRODUKT id_produktu ... SKLEP id_sklepu nazwa id_sieci ... SIEC id_sieci ... PRODUKT2SKLEP id_produktu id_sklepu Tabela, ktora chce wprowadzic to: PRODUKT2SIEC id_produktu id_sieci ZAPYTANIE (pseudokod): SELECT * FROM produkt INNER JOIN produkt2sklep ON id_produktu=id_produktu INNER JOIN sklep ON id_sklepu=id_sklepu INNER JOIN siec on id_sieci=id_sieci WHERE id_sieci=8 A po amianach byloby: SELECT * FROM produkt INNER JOIN produkt2siec ON id_sieci=id_sieci INNER JOIN siec on id_sieci=id_sieci WHERE id_sieci=8 Pobieram wybrane kolumny, nie wszystkie. Indexy sa nalozone na wszytskich polach, ktore sa pobierane i uzywane w WHERE i JOIN. Przejalem ten projekt, moce indexow sa poustawiane przez innych, musze doczytac o ich istotnosci - czy moc indexow duzo zmienia? Ten post edytował madar 15.07.2011, 11:27:22 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 14.10.2025 - 05:58 |