Tại sao CHỌN * nhanh hơn nhiều so với việc chọn tất cả các cột (theo thứ tự cột khác) theo tên?


12

Trên một bảng có các cột a, b, c, d, e, f, g, h, i, j, k tôi nhận được:

select * from misty order by a limit 25;
Time: 302.068 ms

Và:

select c,b,j,k,a,d,i,g,f,e,h from misty order by a limit 25;
Time: 1258.451 ms

Có cách nào để chọn cột theo cách nhanh nhất không?

Cập nhật:

Không có chỉ mục trên bảng, mới được tạo

Đây là ANALYZE GIẢI THÍCH, có vẻ không quá hữu ích:

explain analyze select * from misty order by a limit 25;

Limit  (cost=43994.40..43994.46 rows=25 width=190) (actual time=404.958..404.971 rows=25 loops=1)
->  Sort  (cost=43994.40..45731.11 rows=694686 width=190) (actual time=404.957..404.963 rows=25 loops=1)
     Sort Key: a
     Sort Method: top-N heapsort  Memory: 28kB
     ->  Seq Scan on misty  (cost=0.00..24390.86 rows=694686 width=190) (actual time=0.013..170.945 rows=694686 loops=1)
Total runtime: 405.019 ms
(6 rows)

Và:

explain analyze select c,b,j,k,a,d,i,g,f,e,h from misty order by a limit 25;

Limit  (cost=43994.40..43994.46 rows=25 width=190) (actual time=1371.735..1371.745 rows=25 loops=1)
->  Sort  (cost=43994.40..45731.11 rows=694686 width=190) (actual time=1371.733..1371.736 rows=25 loops=1)
     Sort Key: a
     Sort Method: top-N heapsort  Memory: 28kB
     ->  Seq Scan on misty  (cost=0.00..24390.86 rows=694686 width=190) (actual time=0.015..516.355 rows=694686 loops=1)
Total runtime: 1371.797 ms
(6 rows)

Cột có được lập chỉ mục không? Bạn có thể gửi giải thích phân tích?
dùng_0

1
Bạn cần cẩn thận thực hiện hai lựa chọn liên tiếp và so sánh thời gian. Dữ liệu trong bộ đệm trên truy vấn thứ hai có thể chiếm sự khác biệt về thời gian.
Walter Mitty

1
Tôi cũng thấy sự khác biệt, mặc dù không được phát âm. Bảng của tôi có các hàng = 514431 width = 215 và tôi nhận được khoảng 1,5 giây cho select *trường hợp và khoảng 2,2 giây cho lựa chọn với các cột được liệt kê theo thứ tự khác .
Colin 't Hart

Nếu tôi liệt kê tất cả các cột theo cùng thứ tự như được xác định trong bảng, tôi sẽ nhận được khoảng thời gian giống như tôi select *.
Colin 't Hart

2
Tiêu đề là sai lệch. Câu hỏi thực sự là tại sao thời lượng của một loại phụ thuộc vào thứ tự của các cột đầu ra.
Daniel Vérité

Câu trả lời:


12

Điều này đã được đăng lên danh sách gửi thư của pssql-tin tặc và tôi đã cố gắng trả lời ngắn gọn ở đó. Dường như nếu danh sách đích (các cột được chỉ định) khớp chính xác với bộ mô tả của mối quan hệ, nghĩa là cả về số lượng cột và thứ tự, thì việc quét bên dưới có thể trả về một tuple có thể tiêu thụ trực tiếp bởi nút Sắp xếp kèm theo. Mặt khác, nếu danh sách đích không khớp (theo thứ tự hoặc số cột được chỉ định), quá trình quét trả về một dạng của các bộ dữ liệu yêu cầu bước chuẩn bị dữ liệu của Sắp xếp để thực hiện công việc bổ sung (chuyển đổi từ định dạng bộ dữ liệu nội bộ sang định dạng tiêu thụ trực tiếp bằng mã sắp xếp).

Nhân tiện, '*' được chuyển đổi bên trong thành một danh sách (theo trực giác) khớp với mô tả bộ dữ liệu của mối quan hệ.

EDIT: Nếu bạn nhìn vào lần sau GIẢI THÍCH thời gian thực tế của Seq Scan của bạn, bạn có thể thấy nó nhiều hơn so với trình định dạng. Điều đó đã xảy ra bởi vì quá trình quét thực hiện một bước chiếu bổ sung (nghĩa là chuyển đổi heap tuple thành định dạng bên trong [], nulls []). Và bởi vì điều đó đã xảy ra, nút Sắp xếp phía trên phải thực hiện thêm công việc khởi tạo dữ liệu của nó, đó là chuyển đổi nó trở lại định dạng tuple mà bước sắp xếp thực tế hiểu được. Điều đó thể hiện rõ từ chi phí khởi nghiệp của Sắp xếp. Điều đó không xảy ra trong trường hợp trước. Đó là, cả quá trình quét trả về bộ dữ liệu như hiện tại và sắp xếp bước khởi tạo chỉ đơn giản là sao chép nó.


@ Colin'tHart, hy vọng điều đó có ý nghĩa.
amitlan

Đúng. Tôi đã hy vọng có thể bỏ qua bước đó hoặc làm cho nó ngắn hơn bằng cách sử dụng một số "con trỏ xáo trộn", nhưng đó là một cuộc thảo luận cho tin tặc pssql.
Colin 't Hart

Có thể có một số cải tiến trên đường chân trời với sự hồi sinh gần đây của công việc đặt hàng cột logic.
amitlan

Tôi đã suy nghĩ về điều đó và hy vọng như vậy!
Colin 't Hart

Thưa ông, nếu tôi chỉ cần một số cột thay vì tất cả, cái nào sẽ nhanh hơn? chọn * hoặc chọn some_of_columns? Cảm ơn rất nhiều.
sgon00
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.