Postgres - Tạo bảng có ràng buộc khóa ngoại quá chậm


9

Tôi có một bảng gọi là "Tài khoản" là bảng được sử dụng nhiều, có 17 cột và có hơn 300.000 hàng. Tôi đang cố gắng tạo một bảng mới, "NewTable", có ràng buộc khóa ngoại đối với bảng "Tài khoản".

Câu lệnh CREATE TABLE của tôi trông như thế này:

CREATE TABLE "NewTable"
   (
       "column1" VARCHAR(100) NOT NULL,
       "column2" INTEGER NOT NULL,
       PRIMARY KEY("column1")
       CONSTRAINT "SomeFK" FOREIGN KEY ("column2") REFERENCES "Account" ("ID")
    )

Tuyên bố trên được thực hiện trong hơn 25 phút và không hoàn thành. Chúng tôi đã giết giao dịch.

Khi chúng ta loại bỏ ràng buộc khóa ngoại, nó sẽ thực thi ngay lập tức.

Ai đó có thể cho chúng tôi biết vấn đề là gì? Ban đầu, chúng tôi nghĩ rằng nó đã khóa bảng "Tài khoản" vì một số lý do, nhưng khi chúng tôi xem "pg_locks", chúng tôi không tìm thấy bất kỳ mục nào cho "Tài khoản" - chỉ có một khóa độc quyền cho "NewTable".


Chỉ là một ý tưởng: nếu bạn xác định column2cho phép NULLs, nó vẫn chậm?
dezso

Tài khoản.ID có được lập chỉ mục không? NewTable.column2 có được lập chỉ mục không?
Philᵀᴹ

@Phil - FK có hoạt động mà không có chỉ số trên cột nước ngoài không?
dezso

@deszo, nếu cột2 là NULL thì vẫn chậm. Atleast chúng tôi đã đợi một phút trước khi hủy nó.
Shivasubramanian A

@Phil, Account.ID là khóa chính cho Tài khoản, vì vậy nó đã có một chỉ mục. NewTable.column2 chưa được lập chỉ mục, ít nhất là khi chúng ta tạo bảng.
Shivasubramanian A

Câu trả lời:


12

Truy vấn của bạn đã bị khóa chờ đợi một cái gì đó - đặt cược của tôi là nó đang chờ một giao dịch khác kết thúc.

Khi bạn đang thực hiện bảng tạo, chỉ cần phát hành (trong một phiên psql khác):

select * from pg_locks where pid = XXX and not granted;

trong đó xxx là pid của phụ trợ làm bảng tạo.

Điều này sẽ cho bạn thấy khóa mà bảng tạo đang chờ là gì.


Cảm ơn bạn rất nhiều. Điều đó đã tiết lộ một khóa độc quyền trên Tài khoản !!
Shivasubramanian A

1

Điều này được giải thích trong chủ đề này; http://www.postgresql.org/message-id/75218696-61be-4730-89f6-dd6058fa9eda@a28g2000prb.googlegroups.com

Theo Tom Lane,

điều này tạo tham chiếu hoạt động Bảng tài khoản và PostgreSQL sẽ thêm các kích hoạt cho cả hai bảng. Vì vậy, nếu có một giao dịch mở kéo dài (có thể nhàn rỗi) đang giữ khóa AccessShare trên auth_user Postgres bị chặn chờ xact đó kết thúc và giải phóng khóa của nó. Mọi thứ khác xếp hàng phía sau Tạo.

Đó là chủ đề PostgreSQL Mail là một đọc tốt.

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.