Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

SQL nâng cao:ÁP DỤNG CROSS và ÁP DỤNG NGOÀI TRỜI

Trong bài viết này, chúng ta sẽ xem xét toán tử “ÁP DỤNG” và các biến thể của nó - ÁP DỤNG CHÉO và ÁP DỤNG NGOÀI TRỜI cùng với các ví dụ về cách sử dụng chúng.

Đặc biệt, chúng ta sẽ tìm hiểu:

  • sự khác biệt giữa ÁP DỤNG CROSS và mệnh đề THAM GIA
  • cách kết hợp đầu ra của các truy vấn SQL với các hàm được đánh giá bằng bảng
  • cách xác định các vấn đề về hiệu suất bằng cách truy vấn các chế độ xem quản lý động và chức năng quản lý động.

Điều khoản ÁP DỤNG là gì

Microsoft đã giới thiệu toán tử ÁP DỤNG trong SQL Server 2005. Toán tử ÁP DỤNG tương tự như mệnh đề T-SQL JOIN vì nó cũng cho phép bạn nối hai bảng - ví dụ:bạn có thể nối một bảng bên ngoài với một bảng bên trong. Toán tử ÁP DỤNG là một lựa chọn tốt khi, ở một phía, chúng ta có một biểu thức được đánh giá bằng bảng mà chúng ta muốn đánh giá cho mỗi hàng từ bảng mà chúng ta có ở phía khác. Vì vậy, bảng bên phải được xử lý cho mỗi hàng của bảng bên trái. Bảng bên trái được đánh giá đầu tiên, sau đó bảng bên phải được đánh giá dựa trên từng hàng của bảng bên trái để tạo ra tập kết quả cuối cùng. Tập hợp kết quả cuối cùng bao gồm tất cả các cột từ cả hai bảng.

Toán tử APPLICY có hai biến thể:

  • ÁP DỤNG CROSS
  • ÁP DỤNG NGOÀI TRỜI

ÁP DỤNG CROSS

ÁP DỤNG CROSS tương tự như INNER JOIN, nhưng cũng có thể được sử dụng để tham gia các chức năng được đánh giá bằng bảng với Bảng SQL. Đầu ra cuối cùng của CROSS APPLICY bao gồm các bản ghi khớp giữa đầu ra của một hàm được đánh giá bằng bảng và một Bảng SQL.

ÁP DỤNG NGOÀI TRỜI

ÁP DỤNG NGOÀI TRỜI tương tự như LEFT JOIN, nhưng có khả năng tham gia các chức năng được đánh giá bằng bảng với Bảng SQL. Kết quả cuối cùng của OUTER APPLICY chứa tất cả các bản ghi từ bảng bên trái hoặc hàm được đánh giá bằng bảng, ngay cả khi chúng không khớp với các bản ghi trong bảng bên phải hoặc hàm được đánh giá bằng bảng.

Bây giờ, hãy để tôi giải thích cả hai biến thể bằng các ví dụ.

Ví dụ sử dụng

Chuẩn bị Thiết lập Demo

Để chuẩn bị thiết lập demo, bạn sẽ cần tạo các bảng có tên “Nhân viên” và “Phòng ban” trong cơ sở dữ liệu mà chúng tôi sẽ gọi là “DemoDatabase”. Để làm điều đó, hãy chạy đoạn mã sau:

 SỬ DỤNG DEMODATABASE GO CREATE TABLE [DBO]. [EMPLOYEES] ([EMPLOYEENAME] [VARCHAR] (MAX) NULL, [BIRTHDATE] [DATETIME] NULL, [JOBTITLE] [VARCHAR] (150) NULL, [EMAILID] [ VARCHAR] (100) NULL, [PHONENUMBER] [VARCHAR] (20) NULL, [HIREDATE] [DATETIME] NULL, [DEPARTMENTID] [INT] NULL) ĐI TẠO BẢNG [DBO]. [DEPARTMENT] ([DEPARTMENTID] INT IDENTITY (1, 1), [DEPARTMENTNAME] [VARCHAR] (MAX) NULL) ĐI 

Tiếp theo, chèn một số dữ liệu giả vào cả hai bảng. Tập lệnh sau sẽ chèn dữ liệu vào “ Nhân viên s ”Bảng:

[expand title =” FULL QUERY “]

 INSERT [DBO]. [EMPLOYEES] ([EMPLOYEENAME], [BIRTHDATE], [JOBTITLE], [EMAILID], [PHONENUMBER], [HIREDATE], [DEPARTMENTID]) GIÁ TRỊ (N'KEN J SÁNCHEZ ', CAST (N'1969-01-29T00:00:00.000 'AS DATETIME), N'CHIEF EXECUTIVE OFFICER', N'[email protected] ', N'697-555-0142', CAST (N'2009-01- 14T00:00:00.000 'AS DATETIME), 1), (N'TERRI LEE DUFFY', CAST (N'1971-08-01T00:00:00.000 'AS DATETIME), N'VICE PRESIDENT OF ENGINEERING', N'example @ sqldat.com ', N'819-555-0175', CAST (N'2008-01-31T00:00:00.000 'AS DATETIME), NULL), (N'ROBERTO TAMBURELLO', CAST (N'1974-11 -12T00:00:00.000 'AS DATETIME), N'ENGINEERING MANAGER', N'[email protected] ', N'212-555-0187', CAST (N'2007-11-11T00:00:00.000 'AS DATETIME), NULL), (N'ROB WALTERS ', CAST (N'1974-12-23T00:00:00.000' AS DATETIME), N ' SENIOR TOOL DESIGNER ', N'[email protected]', N'612-555-0100 ', CAST (N'2007-12-05T00:00:00.000' AS DATETIME), NULL), (N'GAIL A ERICKSON ', CAST (N'1952-09-27T00:00:00.000' AS DATETIME), N'DESIGN ENGINEER ', N'[email protected]', N'849-555-0139 ', CAST (N'2008- 01-06T00:00:00.000 'AS DATETIME), NULL), (N'JOSSEF H GOLDBERG', CAST (N'1959-03-11T00:00:00.000 'AS DATETIME), N'DESIGN ENGINEER', N'example @ sqldat.com ', N'122-555-0189', CAST (N'2008-01-24T00:00:00.000 'AS DATETIME), NULL), (N'DYLAN A MILLER', CAST (N'1987- 02-24T00:00:00.000 'AS DATETIME), N'RESEARCH AND DEVELOP MANAGER', N'[email protected] ', N'181-555-0156', CAST (N'2009-02-08T00:00:00.000 'AS DATETIME), 3), (N'DIANE L MARGHEIM', CAST (N'1986-06-05T00:00:00.000 'AS DATETIME), KHÔNG KỸ SƯ NGHIÊN CỨU VÀ PHÁT TRIỂN', N'[email protected] ', N'815-555-0138', CAST (N'2008-12-29T00:00:00.000 'AS DATETIME), 3), (N'GIGI N MATTHEW', CAST (N '1979-01-21T00:00:00.000' AS DATETIME), KHÔNG KỸ SƯ NGHIÊN CỨU VÀ PHÁT TRIỂN ', N'[email protected]', N'185-555-0186 ', CAST (N'2009-01-16T00 :00:00.000 'NHƯ DATETIME), 3), (N'MICHAEL RAHEEM', CAST (N'1984-11-30T00:00:00.000 'AS DATETIME), N'RESEARCH AND DEVELOP MANAGER', N'example @ sqldat .com ', N'330-555-2568', CAST (N'2009-05-03T00:00:00.000 'AS DATETIME), 3) 

[/ mở rộng]

Để thêm dữ liệu vào “ Bộ phận của chúng tôi ”, Hãy chạy tập lệnh sau:

 INSERT [DBO]. [DEPARTMENT] ([DEPARTMENTID], [DEPARTMENTNAME]) CÁC GIÁ TRỊ (1, N'IT '), (2, N'TECHNICAL'), (3, N'RESEARCH AND DEVELOPMENT ') 

Bây giờ, để xác minh dữ liệu, hãy thực thi đoạn mã mà bạn có thể thấy bên dưới:

 SELECT [EMPLOYEENAME], [BIRTHDATE], [JOBTITLE], [EMAILID], [PHONENUMBER], [HIREDATE], [DEPARTMENTID] FROM [EMPLOYEES] GOSELECT [DEPARTMENTID], [DEPARTMENTNAME] FROM [DEPARTMENT] ĐI  

Đây là kết quả mong muốn:

Tạo và thử nghiệm một chức năng được đánh giá bằng bảng

Như tôi đã đề cập, “ ÁP DỤNG CROSS ”Và“ ÁP DỤNG NGOÀI TRỜI ”Được sử dụng để nối các Bảng SQL với các hàm do bảng đánh giá. Để chứng minh điều đó, hãy tạo một hàm được đánh giá bằng bảng có tên “ getEFasteeData . ” Hàm này sẽ sử dụng một giá trị từ DepartmentID làm tham số đầu vào và trả về tất cả nhân viên từ bộ phận đại lý.

Để tạo hàm, hãy chạy tập lệnh sau:

 TẠO BẢNG CHỨC NĂNG do nhân viên quản lý (@DEPARTMENTID INT) RETURNS @EMPLOYEES TABLE (BIẾN ĐỔI NHÂN VIÊN (TỐI ĐA), NGÀY SINH, BIẾN HÀNH TRÌNH (150), BIẾN ĐỔI EMAILID (100), BIẾN HÌNH PHONENUMBER, BIẾN SỐ (20) )) NHƯ BẮT ĐẦU CHÈN VÀO @EMPLOYEES CHỌN A.EMPLOYEENAME, A.BIRTHDATE, A.JOBTITLE, A.EMAILID, A.PHONENUMBER, A.HIREDATE, A.DEPARTMENTID FROM [EMPLOYEES] A WHERE A.DEPARTMENTID =@DEPARTMENTID RETURN 

Bây giờ, để kiểm tra chức năng, chúng ta sẽ vượt qua “ 1 ”Là“ ID bộ phận ”Đến“ Gete Employeesbydepartment " hàm số. Để thực hiện việc này, hãy thực thi tập lệnh được cung cấp bên dưới:

 SỬ DỤNG DEMODATABASEGOSELECT EMPLOYEENAME, BIRTHDATE, JOBTITLE, EMAILID, PHONENUMBER, HIREDATE, DEPARTMENTIDFROM GETEMPLOYEESBYDEPARTMENT (1) 

Đầu ra sẽ như sau:

Kết hợp một bảng với một chức năng do bảng đánh giá bằng cách sử dụng ÁP DỤNG CROSS

Bây giờ, chúng ta hãy thử tham gia vào bảng Nhân viên với “ Phòng quản lý nhân viên ”Chức năng được đánh giá bằng bảng bằng cách sử dụng ÁP DỤNG CHÉO PHÉP . Như tôi đã đề cập, ĐĂNG KÝ ĐI CHÉO tương tự như mệnh đề Tham gia. Nó sẽ điền tất cả các bản ghi từ “ Nhân viên ”Trong đó có các hàng phù hợp trong kết quả đầu ra của“ Gete Employeesbydepartment ”.

Chạy tập lệnh sau:

 CHỌN A. [EMPLOYEENAME], A. [BIRTHDATE], A. [JOBTITLE], A. [EMAILID], A. [PHONENUMBER], A. [HIREDATE], B. [DEPARTMENTNAME] TỪ SỞ B ĐĂNG KÝ GETEMPLOYEESBYDEPARTMENT (B.DEPARTMENTID) A 

Đầu ra sẽ như sau:

Tham gia một Bảng với chức năng do Bảng đánh giá bằng ÁP DỤNG NGOÀI TRỜI

Bây giờ, chúng ta hãy thử tham gia bảng Nhân viên với “ Phòng nhân viên ”Chức năng được đánh giá bằng bảng bằng cách sử dụng ÁP DỤNG NGOÀI TRỜI . Như tôi đã đề cập trước đây, ỨNG TUYỂN NGOÀI TRỜI toán tử tương tự như “ OUTER JOIN ”Mệnh đề. Nó điền tất cả các bản ghi từ “ Nhân viên ”Và kết quả của bảng“ Gete Employeesbydepartment ”.

Chạy tập lệnh sau:

 CHỌN A. [EMPLOYEENAME], A. [BIRTHDATE], A. [JOBTITLE], A. [EMAILID], A. [PHONENUMBER], A. [HIREDATE], B. [DEPARTMENTNAME] TỪ SỞ B NGOÀI RA ĐĂNG KÝ GETEMPLOYEESBYDEPARTMENT (B.DEPARTMENTID) A 

Đây là kết quả mà bạn sẽ thấy:

Xác định các vấn đề về hiệu suất bằng cách sử dụng các chức năng và chế độ quản lý động

Hãy để tôi cho bạn thấy một ví dụ khác. Tại đây, chúng ta sẽ thấy cách lấy kế hoạch truy vấn và văn bản truy vấn tương ứng bằng cách sử dụng các chức năng quản lý động và chế độ xem quản lý động.

Với mục đích trình diễn, tôi đã tạo một bảng có tên “ SmokeTestResults ”Trong“ DemoDatabase ”. Nó chứa các kết quả của một bài kiểm tra khói ứng dụng. Hãy tưởng tượng rằng do nhầm lẫn, một nhà phát triển thực thi Truy vấn SQL để điền dữ liệu từ “ SmokeTestResults ”Mà không thêm bộ lọc, điều này làm giảm đáng kể hiệu suất cơ sở dữ liệu.

Là một DBA, chúng tôi cần xác định truy vấn có nhiều tài nguyên. Để thực hiện việc này, chúng tôi sẽ sử dụng “ sys.dm_exec_requests ”Và chế độ xem“ sys.dm_exec_sql_text ”.

Sys.dm_exec_requests ”Là chế độ xem quản lý động cung cấp các chi tiết quan trọng sau đây mà chúng tôi có thể sử dụng để xác định truy vấn tiêu tốn tài nguyên:

  1. ID phiên
  2. Thời gian CPU
  3. Loại Chờ
  4. ID cơ sở dữ liệu
  5. Số lần đọc (Thực tế)
  6. Viết (Vật lý)
  7. Số lần đọc logic
  8. Xử lý SQL
  9. Xử lý kế hoạch
  10. Trạng thái truy vấn
  11. Lệnh
  12. ID giao dịch

sys.dm_exec_sql_text ”Là một chức năng quản lý động chấp nhận một SQL xử lý dưới dạng tham số đầu vào và cung cấp các chi tiết sau:

  1. ID cơ sở dữ liệu
  2. ID đối tượng
  3. Được mã hóa
  4. Văn bản Truy vấn SQL

Bây giờ, hãy chạy truy vấn sau để tạo ra một số căng thẳng trên cơ sở dữ liệu ASAP. Thực hiện truy vấn sau:

 SỬ DỤNG CÀNG SỚM CÀNG TỐT ĐI CHỌN TSID, USERID, EXECUTIONID, EX_RESULTFILE, EX_TESTDATAFILE, EX_ZIPFILE, EX_STARTTIME, EX_ENDTIME, EX_REMARKS TỪ [ASAP]. [DBO]. [SMOKETESTRESULTS] 

SQL Server cấp phát ID phiên “66” và bắt đầu thực thi truy vấn. Xem hình ảnh sau:

Bây giờ, để khắc phục sự cố, chúng tôi yêu cầu ID cơ sở dữ liệu, Số đọc logic, SQL Truy vấn, Lệnh, ID phiên, Loại chờ SQL Handle . Như tôi đã đề cập, chúng ta có thể nhận được ID cơ sở dữ liệu, Đọc logic, Lệnh, ID phiên, Loại chờ SQL xử lý từ “sys.dm_exec_requests.” Để nhận Truy vấn SQL , chúng tôi phải sử dụng “ sys.dm_exec_sql_text. ”Đó là một chức năng quản lý động, vì vậy cần phải tham gia“ sys.dm_exec_requests ”Với“ sys.dm_exec_sql_text ”Bằng cách sử dụng ÁP DỤNG CHÉO.

Trong cửa sổ trình chỉnh sửa truy vấn mới, hãy chạy truy vấn sau:

 SELECT B.TEXT, A.WAIT_TYPE, A.LAST_WAIT_TYPE, A.COMMAND, A.SESSION_ID, CPU_TIME, A.BLOCKING_SESSION_ID, A.LOGICAL_READS FROM SYS.DM_EXEC_REQUESTS A CROSS ÁP DỤNG SYS.DM_EXEC_SQL_TEXT (A. / pre> 

Nó sẽ tạo ra kết quả sau:

Như bạn có thể thấy trong ảnh chụp màn hình ở trên, truy vấn trả lại tất cả thông tin cần thiết để xác định vấn đề hiệu suất.

Bây giờ, ngoài văn bản truy vấn, chúng tôi muốn nhận được kế hoạch thực thi đã được sử dụng để thực hiện truy vấn được đề cập. Để thực hiện việc này, chúng tôi sẽ sử dụng “ sys.dm_exec_query_plan” chức năng.

sys.dm_exec_query_plan ”Là một chức năng quản lý động chấp nhận một phương án xử lý dưới dạng tham số đầu vào và cung cấp các chi tiết sau:

  1. ID cơ sở dữ liệu
  2. ID đối tượng
  3. Được mã hóa
  4. Kế hoạch truy vấn SQL ở định dạng XML

Để điền kế hoạch thực thi truy vấn, chúng tôi phải sử dụng ÁP DỤNG CROSS để tham gia “ sys.dm_exec_requests ”Và“ sys.dm_exec_query_plan.

Mở cửa sổ trình soạn thảo Truy vấn Mới và thực hiện truy vấn sau:

 SELECT B.TEXT, A.WAIT_TYPE, A.LAST_WAIT_TYPE, A.COMMAND, A.SESSION_ID, CPU_TIME, A.BLOCKING_SESSION_ID, A.LOGICAL_READS, C.QUERY_PLAN FROM SYS.DM_EXEC_REQUESTS A CROSS ÁP DỤNG SYS.DM_EXEC A. SQL_HANDLE) B ÁP DỤNG CROSS SYS.DM_EXEC_QUERY_PLAN (A.PLAN_HANDLE) C 

Đầu ra sẽ như sau:

Bây giờ, như bạn có thể thấy, kế hoạch truy vấn được tạo ở định dạng XML theo mặc định. Để mở nó dưới dạng biểu diễn đồ họa, hãy nhấp vào đầu ra XML trong query_plan như trong hình trên. Khi bạn nhấp vào đầu ra XML, kế hoạch thực thi sẽ được mở trong một cửa sổ mới như thể hiện trong hình ảnh sau:

Nhận danh sách các bảng có các chỉ số bị phân mảnh cao bằng cách sử dụng các chức năng và dạng xem quản lý động

Hãy xem thêm một ví dụ. Tôi muốn nhận danh sách các bảng có các chỉ số có 50% hoặc nhiều hơn bị phân mảnh trong một cơ sở dữ liệu nhất định. Để truy xuất các bảng này, chúng tôi sẽ cần sử dụng “ sys.dm_db_index_physical_stats ”Và chế độ xem“ sys.tables ”.

Sys.tables ”Là chế độ xem quản lý động điền danh sách các bảng trên cơ sở dữ liệu cụ thể.

sys.dm_db_index_physical_stats ”Là một chức năng quản lý động chấp nhận các tham số đầu vào sau:

  1. ID cơ sở dữ liệu
  2. ID đối tượng
  3. ID chỉ mục
  4. Số phân vùng
  5. Chế độ

Nó trả về thông tin chi tiết về trạng thái vật lý của chỉ mục được chỉ định.

Bây giờ, để điền danh sách các chỉ số bị phân mảnh, chúng ta phải tham gia “ sys.dm_db_index_physical_stats ”Và“ sys.tables ”Bằng cách sử dụng ÁP DỤNG CHÉO. Chạy truy vấn sau:

 CHỌN TABLES.NAME, INDEXSTATISTICS.ALLOC_UNIT_TYPE_DESC, CONVERT (NUMERIC (10, 2), INDEXSTATISTICS.AVG_FRAGMENTATION_IN_PERCENT) NHƯ PERCENTAGEFRAGMENTATION, INDEXSTATISTICS.PAGE_COUNT FROM SYSATABLES AS TABLES_ABLES, TABLES ASSATABLES AS TABLES, TABLES_PHIM , NULL, NULL, NULL) NHƯ CHỈ SỐ TRONG ĐÓ INDEXSTATISTICS.DATABASE_ID =DB_ID () VÀ AVG_FRAGMENTATION_IN_PERCENT> =50 ĐƠN HÀNG THEO INDEXSTATISTICS.AVG_FRAGMENTATION_IN_PERCENT DESC 

Truy vấn sẽ tạo ra kết quả sau:

Tóm tắt

Trong bài viết này, chúng tôi đã đề cập đến toán tử ÁP DỤNG, các biến thể của nó - ÁP DỤNG CHÉO và ÁP DỤNG NGOÀI TRỜI và cách thức hoạt động của bạn. Chúng tôi cũng đã biết cách bạn có thể sử dụng chúng để xác định các vấn đề về hiệu suất SQL bằng cách sử dụng chế độ xem Quản lý động và chức năng quản lý động.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tạo dữ liệu thử nghiệm DB

  2. Trận đấu gần nhất, Phần 1

  3. Ẩn danh các số nhận dạng gián tiếp để giảm rủi ro làm lại ID

  4. Tạo một cụm Docker Swarm trên Dịch vụ vùng chứa Azure

  5. Cách tạo chỉ mục trong Django mà không có thời gian ngừng hoạt động