![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 30.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witam serdecznie, opis sytuacji:
posiadam tabelę z prezentacjami, oraz inną tabelę ze zdjęciami do prezentacji. dużo prezentacji wygasło, a ich zdjęcia zaśmiecają mi tabelę zdjęć tworząc zestaw powyżej pół miliona rekordów. Chciałbym odchudzić bazę, jednak mam duży problem. Napisałem sobie skrypt, który pobiera z tabeli prezentacje ID prezentacji których status to zero i usuwa row z tabeli zdjęcia. Jednak skrypt działa tak wolno, że musiałbym poczekać z miesiąc aż skonczy się to robić. Zastanawiam się nad napisaniem jednego zapytania sql które: 1)z tabeli prezentacje pobiera id_prezentacje gdzie status = 0 2) z tabeli zdjecia usówa rekordy w których id_prezentacje = pobrane ID podejmowałem próby z zapytaniami zagnieżdżonymi jednak nie udało mi się rozwiązać problemu. przykład zapytania które testowałem:
zgłasza mi błąd - Subquery returns more than 1 row Nie wiem naprawdę jak to napisać, i co więcej, czy przy takiej ilosci rekordów ( prezentacje = 300 000, zdjecia = 500 000 ) da się to zrobić 1 zapytaniem Uprzejmie proszę o pomoc PS. urządza mnie jedno z dwóch rozwiązań, update zdjęcia z nieaktywnej prezentacji i oznaczenie jego status=0 LUB usunięcie zdjęć z nieaktywnych prezentacji (IMG:style_emoticons/default/smile.gif) Ten post edytował budda1989 28.07.2012, 20:40:20 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 592 Pomógł: 62 Dołączył: 3.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
zamiast IN lepiej używać EXISTS, bo IN przetrzymuje wszystkie dane odnośnie wybranych wierszy/kolumn,
a exists ustawia jedynie flagę true/false, co jest po pierwsze szybsze, a po drugie, przy dużych bazach, w ogóle daje kryterium wykonalności zapytania w rozsądnym czasie (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 30.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
zamiast IN lepiej używać EXISTS, bo IN przetrzymuje wszystkie dane odnośnie wybranych wierszy/kolumn, a exists ustawia jedynie flagę true/false, co jest po pierwsze szybsze, a po drugie, przy dużych bazach, w ogóle daje kryterium wykonalności zapytania w rozsądnym czasie (IMG:style_emoticons/default/smile.gif) Dziękuję za zainteresowanie tematem oraz odpowiedź, jednak podane polecenie wywala mi wszystkie rekordy z tabeli zdjęcia. Coś na pewno robię źle
próbuję narazie selectem, aby zobaczyć czy robi się to co ma się robić, boję się w ciemno dawać update BaN, dziękuję za odpowiedź Jedno zdjęcie może być przypisane tylko do 1 prezentacji, natomiast jedna prezentacja może mieć nawet 50 zdjęć. zastanawiam się jak powinien wyglądać select
Wywala mi błąd o nieistniejącej tabeli #1054 - Unknown column 'zdjecia.id_prezentacja' in 'where clause' prezentacja.status przyjmuje tylko 2 wart 0 i 1 na zdjecia.id_prezentacja NIE jest założony indeks w tabeli prezentacja indeks to id_prezentacja, w tabeli zdjecia indeks to id_zdjecia, ale w tabeli zdjecia znajduje sie tez pole id_prezentacja. skopiowałem sobie tab ze zdjęciami i na niej teraz testuje, niestety wywala ten sa błąd przy delete :/ Ten post edytował budda1989 28.07.2012, 22:36:53 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 158 Pomógł: 43 Dołączył: 9.11.2007 Ostrzeżenie: (0%) ![]() ![]() |
... zastanawiam się jak powinien wyglądać select z zapytania, które podałeś nie wiem co chcesz wyciągnąć, jeśli chcesz zobaczyć dane o zdjęciach, które są przyporządkowane do prezentacji, które mają status 0, to zmienia się tylko początek zapytania
... na zdjecia.id_prezentacja NIE jest założony indeks W zapytaniu uaktualniającym czy kasującym może to nie mieć znaczenia, bo i tak baza musi wszystkie zdjęcia sprawdzić, ale ten indeks jest raczej wymagany jeśli chcesz wyciągnąć wszystkie zdjęcia do danej prezentacji, bo są to pewnie zapytania typu:
Zatem lepiej założyć indeks, bo przy takim zapytaniu baza musi sprawdzić wszystkie wiersze jeśli nie ma indeksu |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 11:07 |