2011-11-21 26 views
6

Tôi đang chạy truy vấn tạo bảng tạm thời nhưng giới hạn là 64mb và tôi không thể thay đổi giới hạn do quyền truy cập v.v. Khi một phạm vi ngày lớn được chọn bảng tạm thời hết dung lượng và dẫn đến lỗi mysql.mysql - Tôi có thể xác định hoặc giới hạn số truy vấn bộ nhớ được phép sử dụng

Có anyway tôi có thể xác định kích thước hoặc số lượng bộ nhớ truy vấn sẽ sử dụng trước khi cố gắng chạy truy vấn, vì vậy tôi có thể tránh vấn đề trên một cách duyên dáng?

Trả lời

3

Không có cách nào để giới hạn kích thước bảng tạm thời, ngoại trừ bằng cách truy vấn một số hàng nhỏ hơn trong truy vấn SQL cơ sở của bạn.

Bạn có thể cụ thể hơn về lỗi bạn đang thấy không? Bảng tạm thời MySQL có thể tồn tại trong bộ nhớ tối đa ít hơn của tmp_table_sizemax_heap_table_size. Nếu bảng tạm thời lớn hơn, MySQL chuyển nó thành bảng tạm thời trên đĩa.

Điều này sẽ làm cho bảng tạm thời chậm hơn rất nhiều so với bộ nhớ trong bộ nhớ, nhưng không nên dẫn đến lỗi trừ khi you have no space available in your temp directory.

Ngoài ra còn có rất nhiều ways MySQL uses memory ngoài bộ nhớ bảng tạm thời. Bạn có thể điều chỉnh các biến cho nhiều trong số này, nhưng nó không giống như đặt một giới hạn trên bộ nhớ mà một truy vấn sử dụng.


Lỗi 1114 cho biết bạn đã hết dung lượng. Nếu nó là một bảng InnoDB trên đĩa, điều này có thể có nghĩa là bạn có một tệp ibdata1 mà không có autoextend được định nghĩa cho vùng bảng. Đối với bảng bộ nhớ, điều đó có nghĩa là bạn đang đạt đến giới hạn max_heap_table_size.

Vì bạn không thể thay đổi max_heap_table_size, các tùy chọn của bạn là giảm số hàng bạn đưa vào bảng cùng một lúc hoặc sử dụng bảng tạm thời trên đĩa thay vì trong bộ nhớ.

Cũng nên cẩn thận khi sử dụng bản phát hành mới nhất của phiên bản MySQL chính. Tôi tìm thấy bug 18160 báo cáo MySQL tính toán kích thước bảng không chính xác cho bảng heap (được sử dụng cho các bảng tạm thời trong bộ nhớ). Vì vậy, ví dụ làm cho một số bạn đang sử dụng ít nhất là MySQL 5.0.23 hoặc 5.1.10 để có được sửa chữa cho lỗi đó.

+0

nhờ trả lời của bạn, im thông báo lỗi nhận được là [code Quê quán: 1114] [nhắn Quê quán: Bảng 'dertemp' là đầy đủ] –

+0

Làm thế nào tôi có thể sử dụng trên đĩa bảng temp Sự bắt đầu của tôi truy vấn trông giống như 'TẠO TEMPORARY TABLE erebus.dertemp SELECT etc ở đây' Tôi tưởng tượng tôi sẽ cần phải thay đổi bit đầu tiên và đặt' on-disk' trong đó bằng cách nào đó? –

+0

'TẠO TẠO TEMPORARY TABLE erebus.dertemp ENGINE = InnoDB SELECT ...' –

1

Tôi không biết cách trực tiếp để thực hiện điều này, nhưng bạn có thể sử dụng thông tin về các bảng đã sử dụng được cung cấp bởi SHOW TABLE STATUS chẳng hạn như kích thước hàng trung bình và sau đó tính số lượng bản ghi được truy vấn trả về bằng cách sử dụng SELECT COUNT(*) ... . Nếu bạn cần phải thực sự lưu tính toán kích thước tối đa của một hàng bằng cách sử dụng các loại cột.

Có thể sẽ dễ dàng kiểm tra số lượng hồ sơ có thể xử lý và sau đó chỉ định mệnh đề LIMIT cố định hoặc để phản ứng trên SELECT COUNT(*) ....

Các vấn đề liên quan