Đây là một câu hỏi TUYỆT VỜI và tôi thấy các câu trả lời rất hấp dẫn. Tôi sẽ bình luận về điều này với tư cách là một DBA của Oracle và câu trả lời của tôi là CỤ THỂ cho cơ sở dữ liệu của Oracle. Đây là một sai lầm lớn mà rất nhiều người mắc phải khi làm việc với Oracle. Tôi không chắc chắn nếu điều này cũng áp dụng cho các ứng dụng khác. Điều này không có nghĩa là lạc đề, nhưng có nghĩa là một câu trả lời chuyên ngành.
Khi bạn điều chỉnh hiệu suất với Oracle, bạn thực sự đang tìm cách giải tỏa các nút thắt. Mặc dù hầu hết chúng ta không nói điều đó, nhưng nó dựa trên Lý thuyết về các ràng buộc: https://en.wikipedia.org/wiki/Theory_of_constraint
Bộ nhớ có thể không phải là nút cổ chai của bạn. Oracle có các cơ chế phức tạp để quản lý bộ nhớ và chỉ cần tăng bộ nhớ thực sự có thể làm mọi thứ chậm lại nếu các khu vực khác là nơi tắc nghẽn. Hãy để tôi cho bạn một ví dụ RẤT phổ biến.
Truy vấn dường như là chậm. Sự đồng thuận là nếu chúng ta tăng RAM, chúng ta nên tăng thời gian phản hồi của các truy vấn vì bộ nhớ nhanh hơn đĩa. Chà ... Đây là cách Oracle xử lý việc quản lý bộ nhớ cho dữ liệu. Oracle có nhiều vị trí bộ nhớ được phân bổ cho các nhiệm vụ cụ thể. Vì vậy, bạn có thể tăng những kỷ niệm này. Vùng được sử dụng cho dữ liệu được gọi là 'bộ đệm bộ đệm'. Đây là một loạt các danh sách được liên kết (số lượng chúng có xu hướng tăng theo từng phiên bản). Mỗi khi một khối được tìm thấy trên đĩa trong khi truy vấn, thuật toán băm được chạy trên nó để xác định danh sách nào sẽ gắn nó vào. Việc đặt nó vào danh sách dựa trên thuật toán đếm cảm ứng (được giải thích trên trang web hỗ trợ của Oracle, vì vậy bạn phải trả tiền để có được nó ... nó không thực sự quan trọng).
TUY NHIÊN, khi bạn chạy một truy vấn, Oracle sẽ đưa ra một chốt trên chuỗi bộ đệm mà bạn tìm kiếm tại thời điểm đó. LATCH này (lưu ý: đây không phải là khóa. Google "chốt" nếu bạn không biết sự khác biệt) chặn tất cả các hoạt động khác trên chuỗi đó trong suốt thời gian bạn đọc. Vì vậy, nó chặn đọc và ghi (điều này hoàn toàn khác với việc Oracle tuyên bố các khóa không chặn đọc).
Điều này là cần thiết bởi vì khi bạn đọc khối trong chuỗi, Oracle sẽ di chuyển nó dựa trên tần suất 'được yêu cầu'. Các khối được yêu cầu thường xuyên hơn được chuyển lên trên cùng và các khối ít được yêu cầu hơn được để lại ở phía dưới và già đi. Bạn không thể có 2 phiên đọc danh sách được liên kết và di chuyển các khối xung quanh hoặc bạn sẽ nhấn con trỏ trỏ đến các vị trí không tồn tại.
Khi bạn tăng kích thước bộ nhớ, bạn tăng kích thước của mỗi danh sách được liên kết. Điều này làm tăng thời gian cần thiết để đọc danh sách. Một truy vấn kém hoặc truy vấn phức tạp có thể thực hiện hàng chục nghìn hoặc thậm chí hàng triệu lượt đọc các danh sách được liên kết. Mỗi lần đọc là nhanh, nhưng số lượng chúng dẫn đến chốt được thực hiện và những điều này sẽ chặn các phiên khác. Oracle gọi đây là 'IO logic' (hoặc bộ đệm get hoặc một số nội dung khác. Lingo này dành riêng cho Oracle và có thể có ý nghĩa khác trong các phần khác của CNTT).
Vì vậy, nếu danh sách dài hơn và bạn có SQL thực sự xấu, thì các câu lệnh SQL sẽ giữ các chốt của chúng lâu hơn. Tăng bộ nhớ đôi khi có thể GIẢM hiệu suất. Hầu hết thời gian, điều này sẽ không xảy ra. Mọi người sẽ chi rất nhiều tiền và thấy không có lợi. Điều đó đang được nói, có những lúc bạn cần thêm bộ nhớ trong bộ đệm bộ đệm, nhưng bạn phải xác định chính xác nút cổ chai để biết liệu điều này có phù hợp hay không. Tôi không thể thảo luận làm thế nào để phân tích điều này trong bài viết này. Xem các diễn đàn DBA. Một số người thảo luận về nó ở đó. Nó khá phức tạp.
Có ai có ví dụ cụ thể với các phần mềm khác mà điều này có thể xảy ra không? Có một cuốn sách kinh doanh tuyệt vời gọi là 'Mục tiêu' thảo luận về các hạn chế giảm bớt trong một nhà máy. Quá trình này rất giống với những gì Oracle DBA làm khi đánh giá các vấn đề về hiệu năng. Nó thường được đọc tiêu chuẩn trong các chương trình MBA. Nó rất có giá trị để đọc cho các ngành nghề CNTT.
https://en.wikipedia.org/wiki/Eliyahu_M._Goldratt