2011-11-21 7 views
6

Mam uruchomione zapytanie, które tworzy tabelę tymczasową, jednak limit wynosi 64 MB i nie jestem w stanie zmienić limitu z powodu uprawnień dostępu itp. wybrany jest duży zakres dat, w którym w tabeli tymczasowej zabraknie miejsca i powstaje błąd mysql.mysql - czy mogę określić lub ograniczyć ilość kwerend pamięci dozwolonej do użycia

Czy mimo to mogę określić rozmiar lub ilość pamięci, której będzie używać zapytanie przed próbą uruchomienia zapytania, aby móc z łatwością uniknąć powyższego problemu?

Odpowiedz

3

Nie ma możliwości bezpośredniego ograniczenia rozmiaru tabeli tymczasowej, za wyjątkiem zapytania o mniejszą liczbę wierszy w zapytaniu bazowym SQL.

Czy możesz dokładniej określić występujący błąd? Tabele tymczasowe MySQL mogą istnieć w pamięci do mniejszej z tmp_table_size i max_heap_table_size. Jeśli tabela temp jest większa, MySQL konwertuje ją na tabelę tymczasową na dysku.

Spowoduje to, że tabela tymczasowa będzie wolniejsza niż przechowywanie w pamięci, ale nie powinna powodować błędu, chyba że you have no space available in your temp directory.

Istnieje również wiele ways MySQL uses memory oprócz przechowywania w tabeli temp. Możesz dostroić zmienne dla wielu z nich, ale to nie to samo, co umieszczenie limitu na pamięci używanej w zapytaniu.


Błąd 1114 wskazuje, że zabrakło miejsca. Jeśli była to tablica InnoDB na dysku, prawdopodobnie oznacza to, że masz plik ibdata1 bez zdefiniowanego automatycznego przejścia dla obszaru tabel. W przypadku tabeli pamięci oznacza to, że osiągasz limit max_heap_table_size.

Ponieważ nie można zmienić wartości max_heap_table_size, można zmniejszyć liczbę wierszy umieszczanych w tabeli w tym samym czasie lub użyć zamiast niej tymczasowej tabeli na dysku zamiast w pamięci.

Należy również zachować ostrożność w używaniu najnowszej wersji głównej wersji MySQL. Znalazłem bug 18160, który podaje nieprawidłowy rozmiar tabeli kalkulacyjnej MySQL dla tabel sterty (używanych w tabelach tymczasowych w pamięci). Na przykład upewnij się, że używasz przynajmniej MySQL 5.0.23 lub 5.1.10, aby uzyskać poprawkę dla tego błędu.

+0

dzięki za odpowiedź, komunikat o błędzie im coraz to [natywny kod: 1114] [Native wiadomość: tabela „dertemp” jest pełna] –

+0

Jak chciałbym użyć tabeli temp na dysku początku mojej zapytanie wygląda jak 'UTWÓRZ TABELĘ TYMCZASOWĄ erebus.dertemp SELECT itp. idzie tutaj" Wyobrażam sobie, że musiałbym zmienić pierwszy bit i umieścić w nim 'on-disk'? –

+0

'STWÓRZ TABELĘ TYMCZASOWĄ erebus.dertemp ENGINE = InnoDB WYBIERZ ...' –

1

Nie jestem świadomy bezpośredniego sposobu, aby to osiągnąć, ale można użyć informacji o używanych tabelach dostarczonych przez SHOW TABLE STATUS, takich jak na przykład średni rozmiar wiersza, a następnie obliczyć liczbę rekordów zwróconych przez zapytanie przy użyciu SELECT COUNT(*) ... . Jeśli naprawdę potrzebujesz zapisać, obliczyć maksymalny rozmiar rzędu za pomocą typów kolumn.

Być może łatwiej byłoby sprawdzić liczbę rekordów, które można obsłużyć, a następnie określić stałą klauzulę LIMIT lub reagować na SELECT COUNT(*) ....

Powiązane problemy