Đầu tiên, luôn luôn sử dụng phiên bản mới nhất của PostgreSQL. Cải tiến hiệu suất luôn đến, vì vậy bạn có thể lãng phí thời gian nếu bạn điều chỉnh một phiên bản cũ. Ví dụ, PostgreSQL 9.2 cải thiện đáng kể tốc độTRUNCATE
và tất nhiên sẽ thêm các lần quét chỉ mục. Ngay cả các bản phát hành nhỏ phải luôn luôn được tuân theo; xem chính sách phiên bản .
Không
Đừng KHÔNG đặt một tablespace trên một đĩa RAM hoặc không bền lưu trữ khác .
Nếu bạn mất một vùng bảng, toàn bộ cơ sở dữ liệu có thể bị hỏng và khó sử dụng nếu không có công việc quan trọng. Có rất ít lợi thế cho việc này so với việc chỉ sử dụng UNLOGGED
bảng và có nhiều RAM cho bộ nhớ cache.
Nếu bạn thực sự muốn có một hệ thống dựa trên ramdisk, initdb
một cụm hoàn toàn mới trên ramdisk bằng cách sử dụng initdb
một phiên bản PostgreQuery mới trên ramdisk, vì vậy bạn có một phiên bản PostgreQuery hoàn toàn dùng một lần.
Cấu hình máy chủ PostgreSQL
Khi kiểm tra, bạn có thể định cấu hình máy chủ của mình để hoạt động không bền nhưng nhanh hơn .
Đây là một trong những cách sử dụng duy nhất được chấp nhận cho fsync=off
cài đặt trong PostgreSQL. Cài đặt này khá nhiều cho PostgreSQL không bận tâm đến việc ghi lệnh hoặc bất kỳ nội dung khó chịu nào khác về bảo vệ toàn vẹn dữ liệu và bảo vệ sự cố, cho phép nó hoàn toàn làm mất dữ liệu của bạn nếu bạn bị mất điện hoặc gặp sự cố hệ điều hành.
Không cần phải nói, bạn không bao giờ nên kích hoạt fsync=off
trong sản xuất trừ khi bạn đang sử dụng PG làm cơ sở dữ liệu tạm thời cho dữ liệu bạn có thể tạo lại từ nơi khác. Nếu và chỉ khi bạn đang tắt fsync thì cũng có thể full_page_writes
tắt, vì nó không còn hoạt động tốt nữa. Coi chừng đó fsync=off
và full_page_writes
áp dụng ở cấp độ cụm , vì vậy chúng ảnh hưởng đến tất cả các cơ sở dữ liệu trong trường hợp PostgreQuery của bạn.
Đối với việc sử dụng sản xuất, bạn có thể có thể sử dụng synchronous_commit=off
và thiết lập commit_delay
, vì bạn sẽ nhận được nhiều lợi ích giống như fsync=off
không có rủi ro tham nhũng dữ liệu khổng lồ. Bạn có một cửa sổ nhỏ mất dữ liệu gần đây nếu bạn bật cam kết không đồng bộ - nhưng đó là nó.
Nếu bạn có tùy chọn thay đổi một chút DDL, bạn cũng có thể sử dụng UNLOGGED
các bảng trong PG 9.1+ để tránh hoàn toàn việc ghi nhật ký WAL và tăng tốc độ thực sự với chi phí của các bảng bị xóa nếu máy chủ gặp sự cố. Không có tùy chọn cấu hình để làm cho tất cả các bảng không bị chặn, nó phải được đặt trong thời gian CREATE TABLE
. Ngoài việc tốt cho việc kiểm tra, điều này rất hữu ích nếu bạn có các bảng chứa đầy đủ dữ liệu được tạo hoặc không quan trọng trong cơ sở dữ liệu có chứa những thứ bạn cần để an toàn.
Kiểm tra nhật ký của bạn và xem nếu bạn nhận được cảnh báo về quá nhiều điểm kiểm tra. Nếu là bạn, bạn nên tăng checkpoint_segments . Bạn cũng có thể muốn điều chỉnh checkpoint_completion_target để viết trơn tru.
Điều chỉnh shared_buffers
để phù hợp với khối lượng công việc của bạn. Điều này phụ thuộc vào hệ điều hành, phụ thuộc vào những gì khác đang xảy ra với máy của bạn và yêu cầu một số thử nghiệm và lỗi. Mặc định là cực kỳ bảo thủ. Bạn có thể cần tăng giới hạn bộ nhớ chia sẻ tối đa của HĐH nếu bạn tăng shared_buffers
trên PostgreSQL 9.2 trở xuống; 9.3 trở lên đã thay đổi cách họ sử dụng bộ nhớ dùng chung để tránh điều đó.
Nếu bạn đang sử dụng chỉ một vài kết nối làm nhiều việc, hãy tăng work_mem
để cung cấp cho họ nhiều RAM hơn để giải quyết, v.v. Hãy coi chừng work_mem
cài đặt quá cao có thể gây ra sự cố hết bộ nhớ vì không phải là sắp xếp bộ nhớ mỗi kết nối để một truy vấn có thể có nhiều loại lồng nhau. Bạn chỉ thực sự phải tăng work_mem
nếu bạn có thể thấy các loại tràn vào đĩa EXPLAIN
hoặc đăng nhập với log_temp_files
cài đặt (được khuyến nghị), nhưng giá trị cao hơn cũng có thể cho phép PG chọn các kế hoạch thông minh hơn.
Như đã nói bởi một poster khác ở đây, thật khôn ngoan khi đặt xlog và các bảng / chỉ mục chính trên các ổ cứng riêng biệt nếu có thể. Các phân vùng riêng biệt là khá vô nghĩa, bạn thực sự muốn các ổ đĩa riêng biệt. Sự tách biệt này có ít lợi ích hơn nhiều nếu bạn đang chạy cùng fsync=off
và hầu như không có gì nếu bạn đang sử dụng UNLOGGED
bảng.
Cuối cùng, điều chỉnh các truy vấn của bạn. Đảm bảo rằng random_page_cost
và seq_page_cost
phản ánh hiệu suất hệ thống của bạn, đảm bảo effective_cache_size
chính xác, v.v. Sử dụng EXPLAIN (BUFFERS, ANALYZE)
để kiểm tra các gói truy vấn riêng lẻ và bật auto_explain
mô-đun để báo cáo tất cả các truy vấn chậm. Bạn thường có thể cải thiện đáng kể hiệu năng truy vấn chỉ bằng cách tạo một chỉ mục thích hợp hoặc điều chỉnh các tham số chi phí.
AFAIK không có cách nào để thiết lập toàn bộ cơ sở dữ liệu hoặc cụm UNLOGGED
. Thật thú vị khi có thể làm như vậy. Xem xét yêu cầu trong danh sách gửi thư PostgreSQL.
Điều chỉnh hệ điều hành máy chủ
Có một số điều chỉnh bạn cũng có thể làm ở cấp hệ điều hành. Điều chính bạn có thể muốn làm là thuyết phục hệ điều hành không xóa mạnh việc ghi vào đĩa, vì bạn thực sự không quan tâm khi / nếu họ đưa nó vào đĩa.
Trong Linux, bạn có thể kiểm soát điều này bằng các cài đặt của hệ thống con bộ nhớ ảodirty_*
, như dirty_writeback_centisecs
.
Vấn đề duy nhất với việc điều chỉnh các thiết lập ghi lại quá chậm là việc một chương trình khác bị tuôn ra có thể khiến tất cả các bộ đệm tích lũy của PostgreQuery cũng bị xóa, gây ra các gian hàng lớn trong khi mọi thứ bị chặn. Bạn có thể giảm bớt điều này bằng cách chạy PostgreSQL trên một hệ thống tệp khác, nhưng một số lần xả có thể ở cấp thiết bị hoặc toàn bộ cấp không phải cấp hệ thống tệp, vì vậy bạn không thể dựa vào đó.
Điều chỉnh này thực sự đòi hỏi phải chơi xung quanh với các cài đặt để xem cái gì hoạt động tốt nhất cho khối lượng công việc của bạn.
Trên các hạt nhân mới hơn, bạn có thể muốn đảm bảo rằng nó vm.zone_reclaim_mode
được đặt thành 0, vì nó có thể gây ra các vấn đề hiệu năng nghiêm trọng với các hệ thống NUMA (hầu hết các hệ thống hiện nay) do tương tác với cách quản lý của PostgreQuery shared_buffers
.
Truy vấn và điều chỉnh khối lượng công việc
Đây là những thứ mà DO yêu cầu thay đổi mã; họ có thể không phù hợp với bạn. Một số điều bạn có thể áp dụng.
Nếu bạn không xử lý hàng loạt các giao dịch lớn hơn, hãy bắt đầu. Rất nhiều giao dịch nhỏ rất tốn kém, vì vậy bạn nên xử lý hàng loạt bất cứ khi nào có thể và thực tế để thực hiện. Nếu bạn đang sử dụng async, điều này ít quan trọng hơn, nhưng vẫn được khuyến khích cao.
Bất cứ khi nào có thể sử dụng bảng tạm thời. Họ không tạo lưu lượng truy cập WAL, vì vậy họ sẽ nhanh hơn rất nhiều cho việc chèn và cập nhật. Đôi khi, đáng để nhét một loạt dữ liệu vào một bảng tạm thời, thao tác dữ liệu theo cách bạn cần, sau đó thực hiện INSERT INTO ... SELECT ...
để sao chép nó vào bảng cuối cùng. Lưu ý rằng các bảng tạm thời là mỗi phiên; nếu phiên của bạn kết thúc hoặc bạn mất kết nối thì bảng tạm thời sẽ biến mất và không có kết nối nào khác có thể thấy nội dung của (các) bảng tạm thời của phiên.
Nếu bạn đang sử dụng PostgreSQL 9.1 hoặc mới hơn, bạn có thể sử dụng UNLOGGED
các bảng cho dữ liệu bạn có thể mất, như trạng thái phiên. Chúng được hiển thị qua các phiên khác nhau và được bảo tồn giữa các kết nối. Chúng bị cắt cụt nếu máy chủ tắt không rõ ràng để chúng không thể được sử dụng cho bất cứ thứ gì bạn không thể tạo lại, nhưng chúng tuyệt vời cho bộ nhớ cache, chế độ xem cụ thể, bảng trạng thái, v.v.
Nói chung, không DELETE FROM blah;
. Sử dụng TRUNCATE TABLE blah;
thay thế; sẽ nhanh hơn rất nhiều khi bạn bỏ tất cả các hàng trong một bảng. Cắt bớt nhiều bảng trong một TRUNCATE
cuộc gọi nếu bạn có thể. TRUNCATES
Mặc dù vậy, có một cảnh báo nếu bạn làm nhiều bàn nhỏ lặp đi lặp lại; xem: Tốc độ cắt của Postgresql
Nếu bạn không có chỉ mục trên các khóa ngoại, DELETE
s liên quan đến các khóa chính được tham chiếu bởi các khóa ngoại đó sẽ bị chậm khủng khiếp. Đảm bảo tạo các chỉ mục như vậy nếu bạn mong đợi DELETE
từ (các) bảng được tham chiếu. Chỉ số là không cần thiết cho TRUNCATE
.
Đừng tạo các chỉ mục bạn không cần. Mỗi chỉ số có một chi phí bảo trì. Cố gắng sử dụng một bộ chỉ mục tối thiểu và để quét chỉ mục bitmap kết hợp chúng thay vì duy trì quá nhiều chỉ mục nhiều cột lớn, đắt tiền. Trường hợp chỉ mục là bắt buộc, hãy thử điền vào bảng trước, sau đó tạo chỉ mục ở cuối.
Phần cứng
Có đủ RAM để chứa toàn bộ cơ sở dữ liệu là một chiến thắng lớn nếu bạn có thể quản lý nó.
Nếu bạn không có đủ RAM, dung lượng lưu trữ càng nhanh thì bạn càng có thể sử dụng tốt hơn. Ngay cả một ổ SSD giá rẻ cũng tạo ra sự khác biệt lớn so với việc quay gỉ. Đừng tin tưởng vào SSD giá rẻ để sản xuất, mặc dù chúng thường không gặp sự cố và có thể ăn dữ liệu của bạn.
Học tập
Cuốn sách của Greg Smith, PostgreQuery 9.0 Hiệu suất cao vẫn có liên quan mặc dù đề cập đến một phiên bản cũ hơn một chút. Nó nên là một tài liệu tham khảo hữu ích.
Tham gia danh sách gửi thư chung PostgreSQL và làm theo nó.
Đọc hiểu: