Postgres kế thừa chỉ mục cho các bảng được phân đoạn


8

Tôi có một bảng với khoảng 60 triệu hàng mà tôi đã phân vùng theo trạng thái thành 53 bảng phụ. Các bảng này "kế thừa" bảng lớn như vậy:

CREATE TABLE b2b_ak (LIKE b2b including indexes, CHECK ( state = 'AK') ) INHERITS (b2b8) TABLESPACE B2B;

Câu hỏi của tôi là: nếu tôi không xây dựng các chỉ mục trên b2b8 cho đến khi câu lệnh sao chép hoàn thành, các bảng phụ có kế thừa các chỉ mục không? Nói cách khác, tôi muốn làm điều này:

Create b2b8
Create b2b8_ak inherits b2b8
COPY b2b8 FROM bigcsvfile.csv
CREATE INDEX CONCURRENTLY

Và có toàn bộ hóa ra đã tạo ra tất cả các chỉ mục trên các bảng phụ.

Câu trả lời:


11

Như đã giải thích trước, INHERITSkhông sao chép định nghĩa chỉ mục.

Do đó, bạn cần nêu cả kế thừa và sao chép chỉ mục.

    CREATE TABLE sub_tab (LIKE tab INCLUDING ALL) INHERITS (tab);

Cảm ơn bạn, @dezso, vì nhận xét của bạn.



2

Mặc dù các tài liệu , nói rằng tất cả các trường được đồng bộ hóa giữa bảng cha và con của nó (được sao chép trước đó).

Mệnh đề INHERITS tùy chọn chỉ định danh sách các bảng mà bảng mới tự động kế thừa tất cả các cột.

Việc sử dụng INHERITS tạo ra mối quan hệ bền vững giữa bảng con mới và (các) bảng cha của nó. Các sửa đổi lược đồ cho (các) cha mẹ cũng thường truyền cho trẻ em và theo mặc định, dữ liệu của bảng con được bao gồm trong các lần quét của cha mẹ.

không bao gồm các chỉ mục .

Bạn có thể xem từ các ví dụ trong tài liệu (hoặc tự mình chạy một vài bài kiểm tra) để thấy rằng bạn sẽ cần xây dựng các chỉ mục này trên cơ sở bảng con.


Có, tôi đã kết thúc việc thử một số bản dựng để kiểm tra và "kế thừa" không dẫn đến các bảng con được lập chỉ mục sau khi được tạo nếu cha mẹ không có sẵn chúng ngay từ đầu. Thật không may, điều này kết thúc làm chậm việc nhập khẩu csv lớn thông qua bản sao.
ABCD EFGHIJK

1

Từ các tài liệu: "THÍCH .... Không giống như INHERITS, bảng mới và bảng gốc hoàn toàn được tách rời sau khi tạo xong. Thay đổi đối với bảng gốc sẽ không được áp dụng cho bảng mới"


0

Tôi đã thực hiện chức năng này để xây dựng các chỉ mục trên các bảng con.

CREATE OR REPLACE FUNCTION index_children (col_name text, parent_name text, index_type text) RETURNS void LANGUAGE plpython3u AS
$_function$
    children = plpy.execute("SELECT c.relname AS child FROM pg_inherits JOIN pg_class AS c ON (inhrelid=c.oid) JOIN pg_class as p ON (inhparent=p.oid) where p.relname = '" + parent_name + "'")
    prog = len(children)
    count = 0
    for child in children:
        if count % 10 == 0:
            plpy.notice('%s : %s / %s' % (child['child'], str(count), str(prog)))
        plpy.execute("Create index on %s using %s (%s)" % (child['child'], index_type, col_name))
        count += 1
    plpy.notice('DONE')
$_function$;
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.