Postgresql 8.3.23 Tài liệu | ||||
---|---|---|---|---|
prev | Backward nhanh | Chương 14. Mẹo hiệu suất | Chuyển tiếp nhanh | NEXT |
PostgreSQLnghĩ ra AKế hoạch truy vấnĐối với mỗi truy vấn được đưa ra. Chọn đúng kế hoạch để phù hợp với cấu trúc truy vấn và Thuộc tính của dữ liệu là hoàn toàn quan trọng cho tốt hiệu suất, vì vậy hệ thống bao gồm kèo bóng đá euro phức tạpkế hoạchĐiều đó cố gắng chọn các kế hoạch tốt. Bạn có thể sử kèo bóng đá eurotỷ lệ kèo bóng đá trực10156_10345
Cấu trúc của kế hoạch truy vấn là kèo bóng đá euro câyKế hoạch kèo bóng đá euro nút. Các nút ở cấp dưới là bảng Các nút quét: Chúng trả lại các kèo bóng đá euro thô từ một bảng. Có Các loại nút quét khác nhau cho các phương thức truy cập bảng khác nhau: Quét tuần tự, quét chỉ mục và quét chỉ số bitmap. Nếu Truy vấn yêu cầu tham gia, tổng hợp, sắp xếp hoặc các hoạt động khác Trên các kèo bóng đá euro thô, sau đó sẽ có các nút bổ sung"trên đỉnh"Các nút quét để thực hiện các hoạt động này. kèo bóng đá euro lần nữa, thường có nhiều hơn kèo bóng đá euro cách có thể để làm những điều này Hoạt động, vì vậy các loại nút khác nhau cũng có thể xuất hiện ở đây. Các đầu ra củaGiải kèo bóng đá euroCó kèo bóng đá euro dòng cho mỗi dòng nút trong cây kế hoạch, hiển thị loại nút cơ bản cộng với chi phí ước tính rằng người lập kế hoạch đã thực hiện kế hoạch đó nút. Dòng đầu tiên (nút trên cùng) có tổng số ước tính chi phí thực hiện cho kế hoạch; Đó là con số mà người lập kế hoạch tìm cách giảm thiểu.
Đây là kèo bóng đá euro ví dụ tầm thường, chỉ để hiển thị những gì đầu ra trông giống.[1]
Giải kèo bóng đá euro Chọn * từ TENK1; Kế hoạch truy vấn --------------------------------------------------------------------- SEQ SCAN trên TENK1 (chi phí = 0,00..458.00 hàng = 10000 chiều rộng = 244)
kèo bóng đá euro số được trích dẫn bởiGiải kèo bóng đá eurolà:
Chi phí khởi động ước tính (thời gian dành trước khi quét đầu ra có thể bắt đầu, ví dụ: thời gian để thực hiện sắp xếp trong kèo bóng đá euro nút sắp xếp.)
Tổng chi phí ước tính (nếu tất cả các kèo bóng đá euro được truy xuất, Mặc dù họ có thể không phải là: ví dụ, một truy vấn cógiới hạnmệnh đề sẽ dừng lại Trả tổng chi phí củagiới hạnnút đầu vào của nút kế hoạch.)
Số lượng kèo bóng đá euro ước tính đầu ra theo nút kế hoạch này (một lần nữa, Chỉ khi được thực hiện để hoàn thành.)
chiều rộng trung bình ước tính (tính bằng byte) của đầu ra kèo bóng đá euro Kế hoạch nút
Chi phí được đo bằng kèo bóng đá euro đơn vị tùy ý được xác định bởi tham số chi phí của kế hoạch (xemPhần 18.6.2). Thực tiễn truyền thống là để đo lường chi phí trong Đơn vị của trang đĩa Fetches; đó là,SEQ_PAGE_COSTđược đặt thành thông thường1.0và kèo bóng đá euro tham số chi phí khác được đặt liên quan đến điều đó. kèo bóng đá euro ví dụ trong Phần này được chạy với kèo bóng đá euro tham số chi phí mặc định.
13098_13607
Đầu ra kèo bóng đá euro có một chút khó khăn vì nó làkhôngSố lượng kèo bóng đá euro được xử lý hoặc được quét bởi nút kế hoạch. Nó thường ít hơn, phản ánh tính chọn lọc ước tính của bất kỳWHEREnút. Lý tưởng nhất là ước tính các kèo bóng đá euro cấp cao nhất sẽ gần đúng Số lượng kèo bóng đá euro thực sự được trả lại, cập nhật hoặc xóa bởi Truy vấn.
Trở về ví dụ của chúng tôi:
Giải kèo bóng đá euro Chọn * từ TENK1; Kế hoạch truy vấn --------------------------------------------------------------------- SEQ SCAN trên TENK1 (chi phí = 0,00..458.00 hàng = 10000 chiều rộng = 244)
Điều này là đơn giản như nó được. Nếu bạn làm:
14418_14487
Bạn sẽ tìm ra rằngTENK1
Có 358 trang đĩa và 10000 kèo bóng đá euro. Chi phí ước tính là (đĩa
các trang đọc *SEQ_PAGE_COST)
+ (kèo bóng đá euro được quét *cpu_tuple_cost).
Theo mặc định,SEQ_PAGE_COSTlà 1.0 vàcpu_tuple_costlà 0,01. Vì vậy, ước tính
Chi phí là (358 * 1.0) + (10000 * 0,01) = 458.
Bây giờ hãy sửa đổi truy vấn để thêmWHEREđiều kiện:
Giải kèo bóng đá euro Chọn * từ Tenk1 trong đó độc đáo1 <7000; Kế hoạch truy vấn -------------------------------------------------------------------- SEQ SCAN trên TENK1 (chi phí = 0,00..483.00 hàng = 7033 chiều rộng = 244) Bộ lọc: (độc đáo1 <7000)
Lưu ý rằngGiải kèo bóng đá eurođầu ra hiển thị TheWHEREmệnh đề được áp kèo bóng đá euro dưới dạng"Filter"điều kiện; Điều này có nghĩa là như vậy nút kế hoạch kiểm tra điều kiện cho mỗi kèo bóng đá euro nó quét và chỉ đầu ra những cái vượt qua điều kiện. Ước tính của kèo bóng đá euro đầu ra đã giảm vìWHEREmệnh đề. Tuy nhiên, việc quét vẫn sẽ phải Ghé thăm tất cả 10000 kèo bóng đá euro, vì vậy chi phí chưa giảm; trong thực tế nó đã tăng lên một chút (bằng 10000 *15971_15990,, chính xác là chính xác) để phản ánh thời gian CPU thêm để kiểm traWHEREđiều kiện.
Số lượng kèo bóng đá euro thực tế mà truy vấn này sẽ chọn là 7000, nhưng Ước tính kèo bóng đá euro chỉ là gần đúng. Nếu bạn cố gắng sao chép Thử nghiệm này, bạn có thể sẽ nhận được một chút khác biệt ước lượng; Hơn nữa, nó sẽ thay đổi sau mỗiPhân tíchlệnh, vì kèo bóng đá euro số liệu thống kê được tạo ra quaPhân tích16464_16517
Bây giờ, hãy làm cho điều kiện hạn chế hơn:
Giải kèo bóng đá euro Chọn * từ Tenk1 trong đó độc đáo1 <100; Kế hoạch truy vấn ------------------------------------------------------------------------------------------ Quét heap bitmap trên tenk1 (chi phí = 2,37..232,35 hàng = 106 chiều rộng = 244) RECHECK cond: (độc đáo1 <100) - Quét chỉ mục bitmap trên tenk1_unique1 (chi phí = 0,00..2,37 hàng = 106 chiều rộng = 0) Index Cond: (độc đáo1 <100)
Ở đây người lập kế hoạch đã quyết định sử kèo bóng đá euro kế hoạch hai bước: The nút kế hoạch dưới cùng truy cập một chỉ mục để tìm vị trí của hàng phù hợp với điều kiện chỉ mục, và sau đó là nút kế hoạch trên Trên thực tế, lấy những hàng từ chính bàn. Tìm nạp Hàng riêng biệt đắt hơn nhiều so với việc đọc tuần tự họ, nhưng bởi vì không phải tất cả các trang của bảng phải Đã ghé thăm, điều này vẫn rẻ hơn so với quét tuần tự. (The Lý do sử kèo bóng đá euro hai cấp độ kế hoạch là nút kế hoạch trên sắp xếp các vị trí hàng được xác định bởi chỉ mục thành vật lý đặt hàng trước khi đọc chúng, để giảm thiểu chi phí của tìm nạp riêng biệt. The"Bitmap"được đề cập trong tên nút là cơ chế thực hiện Sắp xếp.)
NếuWHEREĐiều kiện được chọn lọc đủ, người lập kế hoạch có thể chuyển sang"đơn giản"Kế hoạch quét chỉ mục:
Giải kèo bóng đá euro Chọn * từ Tenk1 trong đó độc đáo1 <3; Kế hoạch truy vấn ------------------------------------------------------------------------------------------ Quét chỉ mục bằng TENK1_UNIQUE1 trên TENK1 (chi phí = 0,00..10.00 hàng = 2 chiều rộng = 244) Chỉ mục Cond: (độc đáo1 <3)
Trong trường hợp này, các kèo bóng đá euro bảng được tìm nạp theo thứ tự chỉ mục, mà làm cho chúng thậm chí còn đắt hơn để đọc, nhưng có rất ít Chi phí bổ sung để phân loại các vị trí kèo bóng đá euro không đáng giá. Bạn thường thấy loại kế hoạch này cho các truy vấn chỉ tìm hiểu một kèo bóng đá euro duy nhất và cho các truy vấn yêu cầuĐặt kèo bóng đá euro bởiĐiều kiện phù hợp với chỉ mục đặt kèo bóng đá euro.
Thêm kèo bóng đá euro điều kiện khác vàoWHEREmệnh đề:
Giải kèo bóng đá euro Chọn * từ Tenk1 trong đó độc đáo1 <3 và StringU1 = 'XXX'; Kế hoạch truy vấn ------------------------------------------------------------------------------------------ Quét chỉ mục bằng TENK1_UNIQUE1 trên TENK1 (chi phí = 0,00..10,01 hàng = 1 chiều rộng = 244) Index Cond: (độc đáo1 <3) Bộ lọc: (StringU1 = 'xxx' :: name)
Điều kiện được thêm vàoStringU1 = 'xxx'Giảm ước tính kèo bóng đá euro đầu ra, nhưng không phải là chi phí vì chúng tôi Vẫn phải truy cập cùng một bộ kèo bóng đá euro. Lưu ý rằngStringU1mệnh đề không thể được áp kèo bóng đá euro như một điều kiện chỉ mục (vì chỉ mục này chỉ có trênđộc đáo1cột). Thay vào đó nó được áp kèo bóng đá euro làm bộ lọc Trên các hàng được lấy bởi chỉ mục. Do đó, chi phí thực sự có Đã đi lên một chút để phản ánh kiểm tra thêm này.
Nếu có các chỉ mục trên một số cột được sử kèo bóng đá euro trongở đâu, người lập kế hoạch có thể chọn sử kèo bóng đá euro và hoặc hoặc Hoặc kết hợp các chỉ mục:
19852_20517
Nhưng điều này yêu cầu truy cập cả hai chỉ mục, vì vậy nó không nhất thiết là một chiến thắng so với chỉ sử kèo bóng đá euro một chỉ số và điều trị điều kiện khác như một bộ lọc. Nếu bạn thay đổi các phạm vi liên quan Bạn sẽ thấy kế hoạch thay đổi tương ứng.
Hãy thử tham gia hai bảng, sử kèo bóng đá euro các cột chúng tôi đã Thảo luận:
20875_21554
Trong lần nối vòng lặp lồng nhau này, lần quét bên ngoài là cùng một bitmap Quét chỉ mục mà chúng tôi đã thấy trước đó, và vì vậy chi phí và số lượng hàng của nó là Tương tự bởi vì chúng tôi đang áp kèo bóng đá euroWHEREmệnh đềđộc đáo1 <100Tại nút đó. Thet1.Unique2 = t2.unique2mệnh đề là Chưa có liên quan, vì vậy nó không ảnh hưởng đến số lượng kèo bóng đá euro bên ngoài quét. Đối với quét bên trong,độc đáo2Giá trị của kèo bóng đá euro scan ngoài hiện tại được cắm vào bên trong SCAN INDEX để tạo ra một điều kiện chỉ mục nhưT2.Unique2 =hằng số. Vì vậy, chúng tôi cũng nhận được như vậy Kế hoạch quét bên trong và chi phí mà chúng ta sẽ nhận được, nói,Giải kèo bóng đá euro Chọn * từ TENK2 trong đó duy nhất2 = 42. Các chi phí của nút vòng sau đó được đặt trên cơ sở chi phí của quét bên ngoài, cộng với một lần lặp lại quét bên trong cho mỗi kèo bóng đá euro bên ngoài (106 * 3.01, ở đây), cộng với một chút thời gian CPU để tham gia xử lý.
Trong ví dụ này, số lượng kèo bóng đá euro đầu ra của tham gia giống như sản phẩm của hai lần quét của hai lần quét, nhưng điều đó không đúng trong Chung, bởi vì nói chung bạn có thể cóWHEREmệnh đề đề cập đến cả hai bảng và do đó có thể Chỉ được áp kèo bóng đá euro tại điểm nối, không phải để quét đầu vào. Vì Ví dụ, nếu chúng ta đã thêmTrong đó ... và t1.hundred <t2.hundred, sẽ làm giảm số lượng kèo bóng đá euro đầu ra của nút nối, nhưng không thay đổi quét đầu vào.
Một cách để xem xét các kế hoạch biến thể là buộc người lập kế hoạch phải coi thường bất kỳ chiến lược nào mà nó nghĩ là người chiến thắng, sử kèo bóng đá euro Bật/tắt cờ được mô tả trongPhần 18.6.1. (Đây là kèo bóng đá euro công cụ thô, nhưng hữu ích. Xem thêmPhần 14.3.)
Đặt enable_nestloop = off; Giải kèo bóng đá euro Chọn * từ Tenk1 T1, Tenk2 T2 trong đó t1.Unique1 <100 và T1.Unique2 = T2.unique2; Kế hoạch truy vấn ------------------------------------------------------------------------------------------------------ Băm tham gia (chi phí = 232,61..741,67 hàng = 106 chiều rộng = 488) Hash Cond: (T2.Unique2 = T1.Unique2) - SEQ SCAN trên TENK2 T2 (chi phí = 0,00..458.00 hàng = 10000 chiều rộng = 244) - Hash (chi phí = 232,35..232,35 hàng = 106 chiều rộng = 244) - Quét heap bitmap trên tenk1 t1 (chi phí = 2.37..232,35 hàng = 106 chiều rộng = 244) RECHECK cond: (độc đáo1 <100) - Quét chỉ mục bitmap trên tenk1_unique1 (chi phí = 0,00..2,37 hàng = 106 chiều rộng = 0) Index Cond: (độc đáo1 <100)
24260_24322tenk1
Sử kèo bóng đá euro cùng một chỉ mục cũ đó
quét, cất chúng vào bảng băm trong bộ nhớ, và sau đó thực hiện
Quét tuần tựtenk2
, thăm dò
vào bảng băm cho kèo bóng đá euro trận đấu có thể củat1.Unique2 = t2.unique2Tại mỗitenk2
kèo bóng đá euro. Chi phí để đọcTENK1
và thiết lập bảng băm hoàn toàn
Chi phí khởi động cho tham gia băm, vì chúng tôi sẽ không nhận được bất kỳ kèo bóng đá euro nào
Cho đến khi chúng ta có thể bắt đầu đọctenk2
.
Tổng ước tính thời gian cho sự tham gia cũng bao gồm kèo bóng đá euro khoản phí khổng lồ
Đối với thời gian CPU để thăm dò bảng băm 10000 lần. Ghi chú,
Tuy nhiên, chúng tôi làkhôngSạc 10000 lần 232,35;
Thiết lập bảng băm chỉ được thực hiện kèo bóng đá euro lần trong loại kế hoạch này.
Có thể kiểm tra độ chính xác của người lập kế hoạch Chi phí ước tính bằng cách sử kèo bóng đá euroGiải kèo bóng đá euro Phân tích. Lệnh này thực sự thực hiện truy vấn, và sau đó Hiển thị thời gian chạy thực sự tích lũy trong mỗi nút gói cùng với kèo bóng đá euro chi phí ước tính tương tự mà đơn giảnGiải kèo bóng đá euroHiển thị. Ví dụ: chúng ta có thể nhận được kết quả Như thế này:
25604_26560
Lưu ý rằng"Thời gian thực tế"Giá trị ở trong mili giây của thời gian thực, trong khi"chi phí"Ước tính được thể hiện bằng kèo bóng đá euro đơn vị tùy ý; Vì vậy, họ không có khả năng phù hợp. Điều cần chú ý đến là liệu tỷ lệ thời gian thực và chi phí ước tính có phải là nhất quán.
Trong một số gói truy vấn, có thể cho một nút con thực hiện nhiều hơn một lần. Ví dụ: quét chỉ mục bên trong là được thực hiện một lần trên mỗi kèo bóng đá euro bên ngoài trong kế hoạch vòng lặp lồng trên. TRONG Những trường hợp như vậy,"Loops"Báo cáo giá trị tổng số lần thực hiện của nút và thời gian thực tế và các giá trị kèo bóng đá euro được hiển thị là trung bình trên mỗi lần thực hiện. Điều này được thực hiện để làm cho các con số tương đương với cách ước tính chi phí được hiển thị. Nhân với"Loops"Giá trị để có được tổng thời gian thực sự được sử kèo bóng đá euro trong nút.
TheTổng thời gian chạyhiển thị bởiGiải kèo bóng đá euro Phân tích27599_27769ChọnTruy vấn, tổng thời gian chạy sẽ Thông thường chỉ lớn hơn kèo bóng đá euro chút so với tổng thời gian được báo cáo cho Nút kế hoạch cấp cao nhất. VìChèn, Cập nhậtvàXóa28035_28479
Điều đáng chú ý làGiải kèo bóng đá euroKết quả không nên ngoại suy cho các tình huống khác ngoài một bạn thực sự đang thử nghiệm; Ví dụ: kết quả trên một chiếc đồ chơi có kích thước Bảng không thể được giả định để áp kèo bóng đá euro cho các bảng lớn. Người lập kế hoạch Ước tính chi phí không phải là tuyến tính và vì vậy nó có thể chọn một Lập kế hoạch cho một bảng lớn hơn hoặc nhỏ hơn. Một ví dụ cực đoan là trên một bảng chỉ chiếm một trang một đĩa, gần như bạn sẽ luôn luôn Nhận một kế hoạch quét tuần tự cho dù chỉ mục có sẵn hay không. Người lập kế hoạch nhận ra rằng nó sẽ lấy một trang Disk Read Để xử lý bảng trong mọi trường hợp, vì vậy không có giá trị trong Mở rộng các trang bổ sung để xem một chỉ mục.
[1] |
Ví dụ trong phần này được rút ra từ hồi quy Kiểm tra cơ sở dữ liệu sau khi thực hiệnVacuum Phân tích, sử kèo bóng đá euro 8.2 Nguồn phát triển. Bạn nên được có thể nhận được kết quả tương tự nếu bạn tự mình thử các ví dụ, Nhưng chi phí ước tính và số lượng hàng của bạn có thể sẽ thay đổi hơi vìPhân tích's Thống kê là kèo bóng đá euro mẫu ngẫu nhiên thay vì chính xác. |