Sự khác biệt giữa lô SQL, câu lệnh và RPC?


35

Sự khác biệt giữa lô SQL, câu lệnh T-SQL và Cuộc gọi thủ tục từ xa là gì?
Làm thế nào tôi có thể biết nếu một phần của mã T-SQL là một lô hoặc câu lệnh?

Câu trả lời:


25

Chà, tôi cho rằng bạn chủ yếu nói về các lớp Profiler, nhưng dù sao thì lời giải thích vẫn đứng vững.

Một lô SQL là một tập hợp của một hoặc nhiều câu lệnh được nhóm lại với nhau và được phân tách bằng câu lệnh GO. EG: nhiều câu lệnh CHỌN và CHERTN tạo thành một đợt nếu chúng có GO ở cuối.

Cuộc gọi RPC là cuộc gọi xuất phát từ ứng dụng khách đến cơ sở dữ liệu. EG: dịch vụ windows, ứng dụng web, ứng dụng windows, bất cứ điều gì cần kết nối với cơ sở dữ liệu thực sự thực hiện cuộc gọi RPC.

Bây giờ, trong Profiler bạn sẽ thấy mọi thứ chạm vào máy chủ cơ sở dữ liệu. Một lô từ Management Studio, một cuộc gọi RPC (là một đợt hoặc một cuộc gọi thủ tục được lưu trữ) từ một ứng dụng bên ngoài, một thực thi thủ tục từ Management Studio.

Mỗi trong số chúng được tạo thành từ các câu lệnh TSQL, vì vậy lớp Profiler này hữu ích trong trường hợp bạn muốn mở rộng thực thi hơn nữa, để xem những gì thực sự được thực thi. Những gì chèn, chọn..v.v.

Cách dễ nhất để xem chúng trong Profiler là chỉ cho phép kết thúc cuộc gọi RPC hoặc Kết thúc cuộc gọi hàng loạt và bạn sẽ thấy ở đó tất cả các số liệu thống kê cần thiết (thời lượng, IO, CPU). Sau đó, di chuyển xa hơn bằng cách bật lớp Báo cáo TSQL và đào sâu hơn.


4
+1 Chỉ cần xác định, GOlà bộ kết thúc lô mặc định được chấp nhận và mặc định của các máy khách phổ biến chúng tôi sử dụng (ví dụ SSMS và sqlcmd), nhưng đáng chú ý là GOchuỗi thực tế như một bộ kết thúc hàng loạt có thể thay đổi và có thể định cấu hình được.
Thomas Stringer

1
"Cuộc gọi RPC (là cuộc gọi theo lô hoặc cuộc gọi thủ tục được lưu trữ)" . Vậy cuối cùng mọi thứ là RPC? Bạn có thể làm rõ điều đó?
Iain Samuel McLean Elder

Không, tôi muốn nói rằng một cuộc gọi RPC được hình thành từ một cuộc gọi thủ tục được lưu trữ hoặc một loạt các câu lệnh khác. Những gì bạn thực sự nhìn thấy trong sự kiện Profiler này là một thủ tục đơn lẻ hoặc một loạt các câu lệnh khác.
Mary

Xin vui lòng xem một số giải thích ở đây . Một số thông tin khác ở đây .
Mary

14

Tuyên bố hàng loạt so với T-SQL

Điều này được định nghĩa rõ ràng trong SQL Server BOL tại đây

Một lô là một nhóm gồm một hoặc nhiều câu lệnh Transact-SQL được gửi cùng lúc từ một ứng dụng đến SQL Server để thực thi. Go là một dấu tách hàng loạt được sử dụng trong hầu hết các ứng dụng khách bao gồm SSMS.

SQL Server biên dịch các câu lệnh của một lô thành một đơn vị thực thi duy nhất, được gọi là kế hoạch thực hiện. Các câu lệnh trong kế hoạch thực hiện sau đó được thực hiện từng cái một.

Trong một thuật ngữ đơn giản dựa trên sự hiểu biết của tôi, RPC là khi bạn thực thi một Proc được lưu trữ bằng API máy khách (ví dụ: trong ADO.net CommandObject. Phương thức thực thi)

Một lời giải thích chi tiết hơn được tìm thấy trong một trong những nhóm tin đăng trên internet ở đây :

RPC "vs" batch "là chế độ thực thi TDS mà ADO.NET (hoặc bất kỳ máy khách SQL Server nào) sử dụng. Khi một câu lệnh SQL đơn giản không có tham số nào được thực thi, chúng tôi sử dụng" batch ". chúng tôi sử dụng RPC (đây không giống như RPC như cuộc gọi thủ tục từ xa mạng độc lập, chúng tôi tình cờ gọi RPC chế độ này trong TDS (giao thức mạng SQL Server)). Ngoài ra, nếu bạn thực hiện một lô với tham số, chúng tôi thực sự sử dụng một lưu trữ được gọi là sp_executesql và truyền chính câu lệnh SQL và phần còn lại của các tham số cho nó, vì vậy nó cũng hiển thị dưới dạng RPC.


Giám đốc chương trình Pablo Castro - Nhóm ADO.NET
Microsoft Corp.


Vì vậy, nếu một câu lệnh trong đợt thất bại, toàn bộ lô được tự động phục hồi?
MonsterMMORPG

Không, mỗi câu lệnh trong lô được cam kết tự động, trừ khi lô nằm trong một giao dịch đang hoạt động hoặc bạn đặt IMPLICIT_TRANSACTIONS ON. Batches và giao dịch là hai khái niệm khác nhau. Tôi biết rằng câu hỏi đã rất cũ, tôi chỉ để lại ở đây cho độc giả tương lai.
spaghettidba
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.