Tôi đang xử lý vấn đề rõ ràng về hiệu suất khi truy xuất ResultSet
tương đối lớn từ Microsoft SQL Server 2012 từ xa đến máy khách Java sử dụng Trình điều khiển Microsoft JDBC 4.0.Tại sao truy vấn Microsoft SQL Server 2012 mất vài phút trên JDBC 4.0 nhưng thứ hai (s) trong Management Studio?
Khi tôi chạy truy vấn tương ứng trên Microsoft SQL Server Management Studio của máy chủ từ xa, nó sẽ trả về xấp xỉ. 220k hàng gần như ngay lập tức. Khi tôi phát hành cùng một truy vấn từ máy khách, nó sẽ dừng lại. Các thử nghiệm tương tự đã làm việc tốt cũng trên máy khách với một phiên bản trước đó của cơ sở dữ liệu mà chỉ có khoảng. 400 hàng đủ điều kiện.
Tôi đã cố gắng giải quyết vấn đề này bằng cách thêm ;responseBuffering=adaptive"
vào URL được chuyển đến DriverManager.getConnection()
. Sau khi kết nối được thiết lập, tôi thấy thuộc tính này (trong số nhiều kết quả khác) trong kết quả từ connection.getMetaData().getURL()
, nhưng [connection.getClientInfo(responseBuffering)
trả lại null
và khách hàng vẫn bị trì hoãn như thế nào.
Điều gì có thể xảy ra ở đây và làm cách nào tôi có thể hướng dẫn một máy chủ Microsoft SQL (không chỉ đề xuất trong Java) mà phải trả về các hàng trong các khối nhỏ hơn là tất cả cùng một lúc hoặc cải thiện thời gian truy vấn JDBC bởi một số biện pháp khác. quan sát
Hai thêm rằng có vẻ hơi kỳ lạ và có lẽ trỏ đến một nguyên nhân gốc rễ khác nhau hoàn toàn:
- Khi client quầy hàng nó vẫn cho thấy tải CPU chỉ tương đối nhẹ, không giống như những gì tôi mong chờ từ thu gom rác thải nặng
- "responseBuffering = adaptive" nên là bình thường default bây giờ
CẬP NHẬT tôi đã kiểm tra và thấy rằng việc chuyển đổi từ PreparedStatement
đến Statement
không cải thiện mọi thứ trong trường hợp của tôi (có vẻ như có thể giúp đỡ trong trường hợp other).
CẬP NHẬT Đây là câu hỏi của tôi hiện tại:
select
PARENT.IDENTIFIER as PARENT_IDENTIFIER,
PARENT.CLASS as PARENT_CLASS,
CHILD.TYPE as CHILD_TYPE,
CHILD.IDENTIFIER as CHILD_IDENTIFIER,
PROPERTY.IDENTIFIER as PROPERTY_IDENTIFIER,
PROPERTY.DESCRIPTION as PROPERTY_DESCRIPTION,
PROPERTY.TYPE as PROPERTY_TYPE,
PROPERTY.PP as PROPERTY_PP,
PROPERTY.STATUS as PROPERTY_STATUS,
PROPERTY.TARGET as PROPERTY_TARGET -- a date
from
OBJECTS as CHILD
left outer join RELATIONS on RELATIONS.CHILD = CHILD.IDENTIFIER
left outer join OBJECTS as PARENT on RELATIONS.PARENT = PARENT.IDENTIFIER
inner join PROPERTIES as PROPERTY on PROPERTY.OBJECT = CHILD.IDENTIFIER
where
PROPERTY.TARGET is not null
order by
case when PARENT.IDENTIFIER is null then 1 else 0 end,
PARENT.IDENTIFIER,
CHILD.IDENTIFIER,
PROPERTY.TARGET,
PROPERTY.IDENTIFIER
Bạn có thể sử dụng 'SQLServerStatement' để nhận trạng thái' responseBuffering' thực tế. Xem mã mẫu [ở đây] (http://pastebin.com/zbRPmA2Y). FWIW, mã đó nói với tôi rằng 'adaptive' * là * mặc định với sqljdbc4.jar. –
@GordThompson Tôi bây giờ cũng tin rằng * adaptive * được bật theo mặc định. Mà làm cho hiệu suất rất chậm (theo thứ tự phút cho khách hàng JDBC từ xa so với thứ tự của vài giây trong Microsoft SQL Server Management Studio địa phương tất cả những bí ẩn hơn với tôi. Tại sao một đồng bằng lớn như vậy? – Drux
Bài viết tuyệt vời này ([Làm chậm ứng dụng, nhanh trong SSMS? Hiểu bí quyết về hiệu suất] (http://www.sommarskog.se/query-plan-mysteries.html)) giải thích lý do tại sao –