2014-07-14 31 views
9

Có một PostgreSQL đơn giản hay thậm chí cách SQL liệt kê các bảng trống/không trống không?hiển thị tất cả các bảng không trống trong postgres

P.S .: Tôi đang phân tích cơ sở dữ liệu chứa hàng trăm bảng và muốn phát hiện "mã chết". Tôi giả sử, khi bảng sau một tháng vẫn còn trống, không được sử dụng.

EDIT: Solved

Cảm ơn tất cả các bạn! Cuối cùng tuyên bố này dường như đầu ra số liệu thống kê tôi có thể sử dụng:

select schemaname, relname, n_tup_ins from pg_stat_all_tables WHERE schemaname = 'public' ORDER BY n_tup_ins 
+0

bạn muốn xem bảng chưa sử dụng theo ngày cụ thể hoặc bảng trống? – stylishCoder

+0

Và điều gì sẽ xảy ra nếu tất cả các hàng của một bảng đã bị xóa vì một lý do hợp lệ? Giống như có nhiệm vụ và tất cả các tác vụ được hoàn tất thành công và sau đó bị xóa khỏi bảng. Điều gì xảy ra nếu bạn thả bảng và ai đó cố tạo một nhiệm vụ mới? –

+0

@ user1474602: các bảng trống, những bảng chưa bao giờ được ghi vào. –

Trả lời

3

Kiểm tra số hàng có thể cho bạn kết quả sai. Giả sử rằng một bảng được sử dụng như một bảng dàn xếp: các hàng được chèn vào (ví dụ: từ một tệp phẳng), được xử lý và xóa. Nếu bạn kiểm tra số hàng trong bảng đó, bạn có thể tin rằng nó không bao giờ được sử dụng nếu bạn không xảy ra để chạy truy vấn của bạn trong khi xử lý diễn ra.

Một cách khác để phát hiện các bảng "không sử dụng" là giám sát IO và các thay đổi được thực hiện cho các bảng.

Chế độ xem thống kê pg_stat_user_tables ghi lại các thay đổi (xóa, chèn, cập nhật) cho mỗi bảng trong hệ thống. Chế độ xem thống kê pg_statio_user_tables ghi lại IO được thực hiện dựa trên các bảng.

Nếu bạn chụp nhanh các bảng đó trong khoảng thời gian đều đặn, bạn có thể tính toán sự khác biệt về giá trị và xem liệu bảng có được sử dụng không.

Bạn có thể sử dụng pg_stat_reset() để đặt lại tất cả các giá trị về 0 và sau đó bắt đầu từ đó.

-1

Vui lòng thử này một lần, hy vọng nó sẽ giúp bạn:

Running the query below will give you a list of tables and indexes that have not been used since SQL Server was last restarted. Once you have a list of tables, you can do a dependency check to get a list of stored procedures that use each table. Then you can search your C# source code for thos SPs and table names. 



-- Unused tables & indexes. Tables have index_id’s of either 0 = Heap table or 1 = Clustered Index 

SELECT OBJECTNAME = OBJECT_NAME(I.OBJECT_ID), INDEXNAME = I.NAME, I.INDEX_ID 

FROM SYS.INDEXES AS I 

INNER JOIN SYS.OBJECTS AS O 

ON I.OBJECT_ID = O.OBJECT_ID 

WHERE OBJECTPROPERTY(O.OBJECT_ID,'IsUserTable') = 1 

AND I.INDEX_ID 

NOT IN (SELECT S.INDEX_ID 

FROM SYS.DM_DB_INDEX_USAGE_STATS AS S 

WHERE S.OBJECT_ID = I.OBJECT_ID 

AND I.INDEX_ID = S.INDEX_ID 

AND DATABASE_ID = DB_ID(db_name())) 

ORDER BY OBJECTNAME, I.INDEX_ID, INDEXNAME ASC 
+0

Cảm ơn bạn đã phản hồi nhanh. Thật không may tôi nhận được "LRI: giản đồ" sys "không tồn tại" –

+0

cần phải tinh chỉnh mã chút tôi nghĩ như vậy, tôi đã sử dụng thats này tại sao đăng như vậy. – stylishCoder

+0

@ValentinHeinitz tôi đã kiểm tra xem nó có hoạt động hoàn hảo không.Vui lòng kiểm tra một lần ở cuối của bạn, ví dụ: đối với các cơ sở dữ liệu khác quá – stylishCoder

0

Bạn có thể làm

OUTPUT này:

"child";0 
"location_master";6 
"location";5 
"tmp";5 
"a1";7 
"b1";3 
"master";0 
"child2";0 
"child1";0 

Ở đây trẻ, chủ, child1, child2 có 0 đếm có nghĩa là chúng là các bảng trống.

+0

Cảm ơn. Bu tiếc là không tìm thấy hàng nào. Tôi vừa mới nhận ra, rằng tôi đã làm một điều rất ngu ngốc. Chạy truy vấn của bạn có chứa tạo/thả trên cơ sở dữ liệu sản xuất. Tôi hy vọng tôi đã không phá hủy bất cứ điều gì. –

+0

Không, Điều này tạo ra bảng TEMP và cũng xóa như vậy. Không có gì khác nên không cần phải lo lắng –

3

Bạn có thể sử dụng danh mục hệ thống của PostgreSQL với ví dụ:

SELECT n.nspname, c.relname 
FROM pg_class c 
INNER JOIN pg_namespace n ON (n.oid = c.relnamespace) 
WHERE c.reltuples = 0 AND c.relkind = 'r'; 

Theo tài liệu, số hàng là ước tính.

Nếu bảng của bạn có các cột lấy giá trị mặc định của chúng từ chuỗi, bạn có thể liệt kê chúng và kiểm tra giá trị của chúng bằng nextval. (Thật không may, currval trả về một giá trị phiên phụ thuộc, vì vậy bạn phải đảm bảo rằng không ai khác đang sử dụng cơ sở dữ liệu và sử dụng cả hai nextvalsetval.)

SELECT n.nspname, c.relname 
FROM pg_class c 
INNER JOIN pg_namespace n ON (n.oid = c.relnamespace) 
WHERE c.relkind = 'S'; 

(Đáng tiếc là tôi vẫn chưa thể tìm thấy bất kỳ để xác định, chuỗi nào thuộc về bảng nào. Rõ ràng nó sẽ rất hữu ích. Dù sao, bạn có thể sử dụng pg_class.relnamespace để thu hẹp kết quả.)

Xem chi tiết http://www.postgresql.org/docs/9.3/interactive/catalogs-overview.html.

Các vấn đề liên quan