Tôi có thể cải thiện hiệu suất trên các bảng hệ thống cồng kềnh không?


12

Bối cảnh:
Tôi có nhiều cơ sở dữ liệu với số lượng lớn VIEW và số lượng cực lớn của SYNONYM. Ví dụ: một db có hơn 10 nghìn lượt XEM và hơn 2 triệu SYNONYM.

Vấn đề chung:
Các truy vấn liên quan sys.objects(và các bảng hệ thống nói chung) có xu hướng chậm. Truy vấn liên quan sys.synonymslà băng hà. Tôi tự hỏi những gì tôi có thể làm để cải thiện hiệu suất.

Ví dụ cụ thể
Lệnh này được điều hành bởi một công cụ của bên thứ ba. Nó chậm trong cả ứng dụng và SSMS:

exec sp_tables_rowset;2 NULL,NULL

Câu hỏi của tôi :
Làm thế nào tôi có thể làm cho điều này chạy nhanh hơn?

Những gì tôi đã thử :
Nếu SET STATISTICS IO ONtôi nhận được kết quả này:

(2201538 hàng bị ảnh hưởng)
Bảng 'sysobjrdb'. Quét số 1, đọc logic 28, đọc vật lý 0, đọc trước 0, đọc logic 0, đọc vật lý 0, đọc đọc trước 0. đọc
'sysschobjs'. Quét số 1, đọc logic 53926, đọc vật lý 0, đọc trước 0, đọc logic 0, đọc vật lý lob 0, đọc trước đọc 0, đọc trước 0.

Tôi đã có thể cập nhật số liệu thống kê trên các bảng hệ thống cơ bản. Điều này đã hoạt động trong môi trường SQL 2008 R2 hoặc mới hơn của tôi:

UPDATE STATISTICS sys.sysobjrdb WITH FULLSCAN
UPDATE STATISTICS sys.sysschobjs WITH FULLSCAN

Tôi cũng đã có thể thực hiện bảo trì chỉ số. Điều này hoạt động trong môi trường SQL 2012 hoặc mới hơn của tôi. Ví dụ, chạy sp_help 'sys.sysschobjs'xác định các chỉ mục trên bảng và từ đó tôi tạo và chạy các lệnh này:

ALTER INDEX clst ON sys.sysschobjs REORGANIZE
ALTER INDEX nc1 ON sys.sysschobjs REORGANIZE
ALTER INDEX nc2 ON sys.sysschobjs REORGANIZE
ALTER INDEX nc3 ON sys.sysschobjs REORGANIZE

Cập nhật số liệu thống kê và sắp xếp lại các chỉ mục giúp, nhưng không nhiều.


Ôi. Tôi đoán bạn đang thực hiện một số loại người thuê lộn xộn, giữ dữ liệu của mọi người trong cùng một bảng và lọc nó với các khung nhìn và sử dụng các từ đồng nghĩa để đặt tên cho chúng theo đối tượng cơ bản, trên quy mô lớn? Dù bằng cách nào, tôi cảm thấy cho bạn
Phil 3/03/2016

2
Nhiều người thuê nhà? Thật ra, không. Không phải vậy. Khá rối, phải không? FWIW, theo sự hiểu biết của tôi, đối với mỗi người dùng ứng dụng, có 5 SYNONYM được tạo cho mỗi bảng. May mắn cho tôi
Dave Mason

Việc loại bỏ quyền đối với một số đối tượng đó có làm tăng hiệu suất (do đó có ít khả năng sử dụng chúng hơn không?) Tôi không biết liệu đó có phải là một tùy chọn ở cấp độ người dùng hay không.
ConstantineK

Sẽ rất thú vị khi xem một kế hoạch thực hiện về điều này. có lẽ bạn có thể đăng một cái từ sql sentry plan explorer lên answer.sqlperformance.com và liên kết với nó, trừ khi có một cách để nhúng cái này ở đây. Tôi sẽ thấy thú vị khi nhìn vào nó
SheldonH

Câu trả lời:


1

Nếu bạn chưa làm như vậy, bạn có thể đạt được hiệu suất bằng cách di chuyển tệp dữ liệu chính sang một bộ trục chính riêng biệt từ phần còn lại của dữ liệu (xem Kiến trúc tệp và tệp FilegroupsSQL Server: filegroup chỉ cho các bảng hệ thống? ).


Tôi nghĩ rằng đây là lời khuyên âm thanh, tuy nhiên, nó sẽ bị ảnh hưởng khi tác động nhiều nếu thiết lập IO không phải là máy chủ vật lý tiêu chuẩn có đĩa đính kèm, ví dụ ảo với SAN hoặc ổ SSD sẽ giảm thiểu tác động đáng chú ý của việc tách các tệp dữ liệu chính đến một địa điểm khác phải không?
SheldonH

1
Nếu bạn có quyền kiểm soát phần cứng (tức là bạn không được lưu trữ bởi bên thứ ba), bạn có thể có các bộ trục khác nhau trong SAN (ví dụ: hai hoặc nhiều ổ RAID-10 riêng biệt). Nếu bạn đang sử dụng (hoặc được lưu trữ) với SSD, thì không có trục chính và IO sẽ bị hạn chế chủ yếu bởi bất kỳ nút thắt nào giữa các ổ đĩa và bo mạch chủ (ví dụ: SATA, RAID, hoặc thẻ NIC, cáp, bộ định tuyến / chuyển mạch , SAN, SSD tốc độ), vì vậy bạn sẽ không đạt được bất cứ điều gì bằng cách tách các tệp trong trường hợp đó.
Zitgy Crueltyfree Zeitgeister
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.