154 Bài 11: Cải tiến khả năng thực thi ca query Đ Microsoft â h
QL Server T-
Cải tiến khả năng thực thi của query
Trong bài này, bạn sẽ học cách sử dung Query Analyzer ctia SQL Server để khai thác và cải tiến cách SOL Server đáp tíng được
những query của bạn Bài này sẽ trình bày cho bạn cách server thực
thì các query của bạn và cách sử dụng Query Analyser để khai thác sự thực thi query, nhận biết các vấn đề và đánh giá các hiệu ứng của những thay đổi mà bạn thực hiện để xứ lý những vấn đề đó Đối với các query lớn, bạn sẽ sử dụng Internet server log cho một trong
những server của ban trong table Inetlog, bởi vì các cơ sở dữ liệu mẫu không chứa đủ dữ liệu Table là dạng chuẩn được sử dụng cho
việc ghỉ chép IS, nhưng một trường 1D s nguyên được bổ sung để
trình bày một số kỹ thuật tạo index Đối với các ví dụ khác, bạn sẽ
sứ dụng cơ sở dữ liệu pubs
Trang 2Bài 11: Cải tiếu khả năng thực thi ctia query 155
Việc tỉnh chỉnh khả năng thực thi của query là một phần
quản lý khả năng thực thi của server Bất kỳ nguồn server vốn được sử dụng nhiều, chẳng hạn như các đĩa hay bộ nhớ, sẽ giới hạn khả năng thực thí của tất cả trình ứng dụng vốn cần sử dụng nó Khi nhiều trinh ứng dụng đòi hỏi cùng một nguồn tài nguyên cùng một lúc, một tinh huống được gọi là sự tranh chấp nguồn tài nguyên xảy ra và mỗi trình ứng dụng đợi đến lượt của nó đến khi nó có thể tiến hành Nếu tình trạng này vấn cứ xảy ra thì nguồn tài nguyên đó trở thành sự cản trở đối với việc điều khiển khả năng thực thi của toàn bộ server Việc nhận thấy và
sửa chữa loại sự cố toàn server này là công việc của nhà quản lý hệ thống hay DBA, nhưng bày này sẽ giúp bạn trợ giúp họ
bằng cách giảm đi những nhu cầu riêng của bạn trên server
đt Sử ĐỦ THỰC THỊ
Khi bạn gởi một query, SQL Server thực hiện ba bước chính
để đáp ứng query này:
1 _ Query được phân tích, một tiến trình trong đó SQL Server đọc text query và phân chia nó để hiểu được những gì mà
bạn đang yêu cầu nó thực hiện
2 Bộ tối ưu hóa của SQL Server đọc thông tin về cấu trúc,
việc tạo índex và lượng dữ liệu trong các table ma ban đang vấn tin Nó sử dụng thông tin này để hình thành một
sơ đồ query, các bước mà nó thực hiện để đạt được những kết quả mà bạn đã yêu cầu
4 Trong bước sau cùng, SQL Server thực thi các bước trong
Trang 3156 Bài 11: Cải tiến khả năng thực thí của query Bằng cách hoạch định trước query, SQL Server co thể chọn phương pháp hiệu quả nhất để đạt được những kết quả mong muốn
Để chọn sơ đồ query tốt nhất, bộ tối ưu hóa của SQL Server
cố giảm tối thiểu các nguồn tài nguyên server được sử dụng trong việc đáp ứng yêu cầu Nguồn tài nguyên quan trọng nhất trong những nguồn tài nguyên này thường là chỉ phí !⁄O nhưng khả năng thực thi của CPU cũng có thể trở thành một vấn đề
trong một số trường hợp, bạn có thể kiểm tra những chỉ phí phát
Sinh do query của bạn bằng tùy chọn SHOWPLAN ALL trong các query hay với màn hình đồ họa của Query Analyzer - một
phương pháp dễ tiếp cận hơn nhiều
Kế hoạch thực thi text được mở bằng cách thực thi câu lệnh
Trang 4Bài 11: Cải tiến khả năng thực thi của quer Eternia Gene advantedl| TP Show query pian FP Santitieet
TÔ, LCT Use ANSI quoted wlenttiers
FF Lee ANSI nulls, padding and wemings,
| system messages io
| Perform tansialon lor cheraclerdin {i
| Use regional stings when oulputing curency,rumber dates and tmos,
Trang 5158 Bài 1L: Cải tiếu khả năng thực thí của query
¡-:Tab1e §can(OBJECT: ( [ đemoapp] [dbo] [1net1øg])} {1 row(s) affected)
Trong dữ liệu xuất, SQL Server đội SQL mà bạn đã yêu cầu
nó thực thi trở lại cho bạn và cho bạn biết những gì mà nó đã
thực hiện Trong trường hợp này, nó thông báo rằng nó sẽ thực
thí chỉ một bước trong query: quét table và truy tìm tất cả hàng từ
table inetlog Bởi vì table nay co han 200.000 hàng trong đỏ,
đây sẽ là một hoạt động khá dài Bạn có thể xem chi phí của một query bằng cách quay trở về các tùy chọn nối kết, tắt sơ đồ thực thi và mở Show stats J/O Kết quả giống hệt như sau khi
bạn thực thi cùng một query
SQL Server Execution Times:
CPU time = @ ms, elapsed time = @ ms SOL Server parse and compile time:
CPU time = @ ms, elapsed time = 165 ms
SQL Server parse and compile time:
CPU time = @ ms, elapsed time = 0 ms
clienthost
(result rows omitted) (207280 row(s) affected)
Table ‘inetlog' Scan count 1, logical reads 4118, physical
reads 1674, read-ahead reads 4120
SQL Server Execution Times:
CPU time = @ ms, elapsed time = 297672 ms, SOL Server parse and compile time:
CPU time = @ ms, elapsed time = 5 ms
SQL Server Execution Times:
Trang 6Bài 11: Cải tiến khả năng thực thí của quer 159 Chú ý thời gian mà query này cần để thực thi, mae du query được chạy bên trong trên server Ở bài 2 đã đề cập rằng, bạn
hiểm khi sử dụng các query không cỏ giới hạn, các query không co ménh dé WHERE dé giảm số hàng được trả về Một query chạy lâ, một thuật ngữ mà bạn sẽ thấy trong Books Online, có
thể liên kết một server và ảnh hưởng đến những người dùng
khác
Không quá 5 phút, query được yêu cầu để thực thi được sử
dụng trong việc xử lý dữ liệu: query chỉ yêu cầu nó đọc tất cả hàng và cho ra cột clienthost, do đó thật sự không có bất kỳ công việc xử lý não được yêu cầu Thành phần gây lãng phí thời
gian thực sự là I/O
SQL Server cố giảm tối thiểu số lần mà nó phải đọc dữ liệu từ đĩa bằng cách giữ lại một bản sao của mỗi phần đữ liệu mà
nó đọc trong một vùng bộ nhớ được gọi là cache Dữ liệu cũ hay
dữ liệu ít thường được sử dụng sẽ dần dần được thay thé trong
cache bằng thông tin mới hơn, nhưng trong khi một hạng mục
có ở đó, SQL Server có thể truy tim nó từ cache thay vì đi đến
đĩa
Bạn có thể thấy SQL Server sử dụng đĩa được bao nhiêu
phần, và cache được sử dụng với mức độ như thế nào, trong dòng đầu tiên của khối số liệu thong ké sau cùng có chúa các phần sau đây:
2 Logical reads: Bao nhiêu lần ma SQL Server can dữ liệu từ đĩa 2 Physical reads: Bao nhiêu lần mà dữ liệu cần thiết phải được đẹc
Trang 7160 Bài 11: Cai tiến khả năng thực th của query
7 = Read-ahead reads: Bao nhiéu lan ma SQL Server doc nhiều dữ liệu trong cache hơn so với mức yêu câu, dự đoán trước như cầu
Về việc SỬ dụng nó sau này
Trong ví dụ, SQL Server đã thực hiện một công việc tốt
trong việc đọc dữ liệu vì nó yêu cầu dữ liéu 4.118 lan (logical reads) nhung chi cung cap 1.674 physical reads Query van mat
một thời gian dài do lượng dữ liệu mà nó phải lấy từ đĩa
Kế hoạch thực thi text hữu dụng nếu bạn phải sử dụng một công cụ thay vì Query Analyzer (vi du, néu ban cũng có các
client SQL Server 6.5), nhưng Query Analyzer cung cấp một
giao diện dễ truy cập hơn nhiều trong màn hình sơ đồ thực thi đồ họa của nó Việc chọn Show Execution Plan trên menu Query Sẽ mở tính năng này Điều này không giống như việc mở tùy
chọn Show query plan trong hộp thoại Connection options; thực tế, bạn không thể sử dụng công cụ này cùng một lúc với các tùy
chọn pian (sơ đồ) và statistics (số liệu thống kê)
Khi bạn chạy một query với sơ đồ thực thi đồ họa được mở,
bạn sẽ có một tab khác bên dưới khung results được gọi là Ex-
ecution Pian Việc chọn tab này sau khi query hoàn tất sẽ trình bày cho bạn sự biến đổi sự thực thị của query bằng hình ảnh
Để hiển thị sơ đồ query trong hình 11.2, thực thi query sau đây trong cơ sở dữ liệu pubs bang sơ đồ thực thi đồ họa được mổ:
SELECT au_Iname, title
FROM authors
Trang 8Bài 11: Cải tiến khả năng thực thi ciia query 161
Hình 11.2 Ké hoach thuc thi do hoa trong Query Analyzer
Màn hình đồ họa trình bày các bước tương tự mà bạn thấy
trong kế hoạch thực thi text: Mỗi biểu tượng trong màn hình hiển thị một bước trong tiến trình và mỗi mũi tên biểu thị dữ liệu được truyền từ bước này sang bước khác Biểu tượng ở phía bên trái là câu lệnh gốc mà bạn đã thực thi và các hoạt động bên phải là
các bước mà SQL Server phân chia các hoạt động thành những bước đó Nếu bạn di chuyển chuột lên trên một bước xử lý, một
Trang 9162 Bài 11: Cải tiến khả năng thực thi của querw
Bảng 11.1 Thông tin về mật bưếc xử lý Description Physical Operation Logical Operation Row Count Fstimated Row Size LO Cost CPU Gost Total Subtree Cost Cost Manber of execttes Argument Mô tả .Mf chủng, Đước là gi Những gì nà Bước thực biện
Hoạt động XỌI mà nó thực biên
Số bàng dược tạo n4 Đi HẾu trình này
Kích cũ bàng tưng ĐÌNh đưục lao tạ Thời gian được sử dung cho civ boat dong dia
The: gian met CPU xii lh thong tin Thoi gian trong bree ney
Thời giản trong bước này
Số hìn mà bước dược lap lai
tệnh mà bước sẽ thực biện
Nếu bạn di chuyển cursor lên trên một trong những mũi tên, bạn thấy kích cỡ và số hàng được truyền từ hoạt động cấp thấp hơn đến hoạt động cấp cao hơn (nghĩa là từ phải sang trái) Bằng cách nhân kích cỡ với số hàng, bạn có thể ước tính lượng dữ liệu được truyền từ bước xử lý thấp hơn đến bước xử lý cao hơn
Đây là một công cụ hữu dụng và dễ sử dụng trong việc hiển
Trang 10Bài 11: Cải tiến khả năng thực thử của querw 163
Bây giờ hãy xem cách bạn có thể sử dụng các index để thay đổi khả năng thực thi của các query
PHAN TICH INDEX
Nhu bạn có thể tưởng tượng, khả năng thực thị của query vượt trội hơn nhiều so với thởi gian mà nó mất Trong query quét
table tủ inetlog, phần lỏn thời gian thực thi có liên quan đến việc đọc dữ liệu tu đĩa: thoi gian CPU có thể bỏ qua Trong các trình ứng dụng client/server, thường có ba vùng mà bạn có thể cải
tiến khả năng thực thi: Z2 Sử gao liêp chent/Seruer
2 - Thời gian CPU Cua server A The gian cia server
Việc cải tiến sự giao tiếp client-server được điều khiển bởi sự lưu thông mạng giữa server cơ sở dữ liệu và client, phần lớn sẽ đòi hỏi bạn truy tìm chỉ dữ liệu mà bạn cần từ cơ sở dữ liệu,
chỉ vói mức độ thưởng xuyên mà bạn cần Thời gian CPU của
server thường không phải là một yếu tổ lớn trong khả năng thực thi của cơ sở dữ liệu, mặc dù có thể là như vậy nếu bạn kết hợp một lượng lớn đữ liệu hay thực hiện nhiều phép tính
Vấn đề gây khó khăn cho bạn thường là đĩa Cách dễ truy cập nhất để cải tiến các tần thực thí câu lệnh là thường với một
index (hoặc nhiều index) Như đã thảo luận, một index là một
Trang 11164 Bài 11: Cái tiến khả năng thực thì của quer
được lưu trữ trong bộ nhớ Trong trường hợp tệ nhất, nó có thể
phải đọc index từ đĩa, nhưng nó đọc ít dữ liệu hơn nhiều như nó thưởng thực hiện nếu nó phải đọc toàn bộ table
Các hoạt động vốn nhận được sự chú ý là những hoạt động
đòi hỏi một lượng lớn các nguồn tài nguyên và một tỷ lệ lớn chí
phi của query Nếu việc sử dụng nguồn tài nguyên chính của
tiến trình là thởi gian CPU, bạn có thể thử tính trước dữ liệu bằng
cách đặt nó trong một table riêng biệt mà bạn làm mới tại các
khoảng thởi gian Thông thường hơn, bạn sẽ tìm thấy mội tiến
trình có một chỉ phí l/O lớn; đối với những vấn đề này, bạn có thể thử rằng buộc query phải giảm đi lượng dữ liệu được truy tim
trong bước đó hoặc sử dụng một index để tăng tốc tiến trình đó Sau đây là cú pháp để tạo mội index:
Cú pháp
CREATE [UNIQUE] {CLUSTERED } NONCLUSTERED] INDEX indexname ON tableref( columnret [, columnref .]
[ WITH options |
Một index UNIQUE ngan cam việc chèn dữ liệu bản sao
trong các cột mà nó †ạo index Việc tao mét index UNIQUE trén
một cột sẽ không tạo một constraint UNIQUE trén cét, nhung
việc bổ sung một constraint UNIQUE sẽ tạo một index tương
ứng
Một index CLUSTERED chỉ là một index có thể được tạo trên một table, sắp xếp thứ tự các hàng như chúng được lưu trữ trong file cơ sở dữ liệu Các index NONCLUSTERED được lưu
Trang 12Bài 11: Cải tiến khả năng thực thi cia query 165 của table; có thể có đến 249 index trong những index này trên
méi table
Ghi chú
Có nhiều tùy chọn mã bạn có thể sử dụng kÌi tạo một index để chỉnh sửa cách nó được lưu trì dược sứ dụng bởi SQL Server Chú để nảy nằm
ngoài phạm vị của bài này bởi vì nó đối hỏi kien
lưu trữ vật lý của cơ sở đữ liệu nhiều hơn
những gi ma bai nay trinh bay cho bạn Tuy nhiền, các tùy chọn thường không được sử dụng do dó
bạn có thé thoải nưái bỏ qua chúng
Ví dụ sau đây tạo một nonclustered index có tên là idx
clientHost trên cột ClientHost của table inetlog:
CREATE INDEX idx ClientHost ON inetlog ( ClientHost )
Nói chung, bạn nên tạo một index khi một bước xử lý trong
sơ đồ query chỉ định một tiến trình quét table tạo ra một số lớn lần đọc đĩa Ví dụ, trong table inetlog, việc đếm các giá trị duy nhất của cột Clien†Host mất 5.81 giây trên máy tính mà không
có một index, trong đó 4.5 giây được sử dụng để quét table trên
đĩa Việc tạo một index như được trình bày trước đó đã giảm tổng thởi gian xuống 1.38 giây bởi vì nó đã thay thế tiến trình quét table bằng một tiến trình quét chỉ đòi hỏi 0.8 giây nhưng chia đôi lượng dữ liệu được sử dụng bởi các tiến trình cao hơn Mội lần nữa, bất cứ những gì bạn thực hiện, hãy đánh giá kết quả Phương pháp thường được sử dụng nhiều để đạt được những kết quả nhanh là sử dụng ba của sổ trong Query Ana-
Trang 13166 Bài 11: Cai tiến khả năng thực thì của querụ Mở màn hình sơ đồ thực thi trong cửa sổ 1 và thực thi query mà bạn cần cải tiến
Trong cửa sổ thứ hai, tao index
Khi tiến trình tạo kết thúc, hãy đi đến cửa số thứ ba, mổ màn hình sơ đồ thực thi và thực thi cùng một query như ở
buớc 1 Bây giờ bạn có một cửa sổ hiển thị sơ đồ thực thi và các số liệu thống kê mà không có index và một của sổ trình bày khả năng thực thi với nó Bạn có thể di chuyển
qua lại giữa hai màn hình này để so sánh kết quả
Tại sao index không phải là mọi thứ? Có những vấn để sau
đây:
7 Dinhiên, các index chiếm khoảng trống đĩa, do đó việc tao chúng
khắp nơi mà không mang lại khả năng thực thị HH là một sự
lãng phí
Bộ tối tu hóa có thể không đạt được bất cứ điều gì tử rộ! index,
Bởi vì index được để nghị giảm số hay kích cỡ của các hàng vốn
phải được xử lý bởi server, một index trên một hàng có kiểu dữ
liệu này có thể giảm đi khả năng thực thí bằng cách tăng lượng ⁄O mà server phải thực hiện
Một index làm chậm các hoạt động cập nhật chèn và xóa bỏi tì SQL Server phải chỉnh sửa index ngoài table ra Hay nhớ: dánh
Trang 14Bài T1: Cải tiến khá năng thực thi cia query 167
TOM LUOC
Thông tin trong bài này ít quan trọng hơn đổi với bạn nếu pan làm việc với các cơ sở dữ liệu nhỏ với một số người dùng
giới hạn
Trong bài này, bạn đã học cách SQL Server lap sd dé va thực thí các query của bạn và cách sử dụng Query Analyzer để
Trang 15168 Bài 12: Phân tích dữ liệu bằng SQL Microsoft @ aL Server TÔ BAND, Phân tích đữ liệu bang SQL
Trong bài này, bạn sẽ học những tính năng cao cấp của câu
lệnh SELECT mà bạn có thể sử dụng để phân tích dữ liệu và tạo các
report một cách trực tiếp từ cơ sở dữ liệu Như bạn đã học, SQL là một ngôn ngữ mạnh mẽ để xử lý dữ liệu Bạn biết cách sử dụng SQL để Z Tập hợp nhanh chóng dữ liệu liên quan từ các table lưu trữ thông tin về các thực thể khác nhau
Z - Tạo các tập hợp dữ liệu mới từ các query
Trang 16Bài 12: Phân tích dữ liệu bằng SQL 169
Trong bài này, bạn sẽ khai thác hai tính năng bổ sung của SOL Thứ nhất, mặc dù có nhiều tùy chọn trong các công cụ
báo cáo, nhưng bản thân SQL cung cấp những tính năng tổng kết và báo cáo đơn giản nhưng đa năng Bằng cách thực hiện
các chức năng phân tích trên server càng nhiều càng tốt, do
những giới hạn về các nguồn tài nguyên của nó, bạn có thể giảm đi đáng kể mức năng suất mạng và các nguồn tài nguyên
cần thiết cho client workstation của bạn
Thứ hai, mặc dù tất cả query mà bạn đã xem xét cho đến thời điểm này được thực thi ở một mức độ duy nhất, các query có thể tạo ra, bản thân những query này chứa những query
khác, do đó nhiều bước để phân tích dữ liệu có thể được kết hợp, được tự động hóa và được thực thi bởi server
CAC ROLLUP VA RAN TONG KET
Khi bạn đã vấn tin cơ sở dữ liệu trước đó, bạn đã nhận được
tất cả hàng vốn phù hợp với một tập hợp tiêu chuẩn, nhưng bạn
sẽ thường muốn nhiều hơn - ví dụ, bạn có thể muốn các tổng cho một loạt các cột số Bạn có thể chọn (SELECT) các hang và sau đó cộng chúng lại, nhưng SQL cung cấp cho bạn một
chuỗi hoạt động để gộp các hàng và thực hiện các phép tính
Bạn đã thấy một ví dụ của một hàm gộp Hàm COUNT được
sử dụng để đếm số hàng trong một kết quả được tìm trong các
hang tu SELECT, đếm chúng và sau đó tạo số hàng dưới dạng giá trị gộp Các hàm gộp do SQL Server cùng cấp được minh
Trang 17170 Bài 12: Phân tích dữ liệu bằng SQL
Bang 12.1 Úác hầm hộp trong SQL Server
Hàm Mô tả
AVG Tính trung bình của các gi trị
COUNT Den số giá tị hay bàng
TIVNHNCT toại bỏ các gki trị bạn bàng lấp lai
VAN Tính giá tị lần nhất của các gki trí
1V Tinh gid trị nhỗ nhất của các gi trị
STDEV, STDEVP Tĩnh độ lệch chuẩn, độ lệch cbuẩu tap bop SUM Tính tổng của các gid Dị
VAR VARP Tink phuong sat phitong sai tdp bop
Những hăm này có thể được sử dụng trong bất kỳ hàm nào
nơi mà một tập hợp hàng được mong đợi, ví dụ:
SELECT SUM( price * ytd sales } FROM titles
Query này tạo một tổng số nhằm trình bày tất cả số lượng
bán hàng được ghi lại trong table titles; đây thường không phải là một số hữu dụng cho lắm Do đó, hãy cố tìm tên của các tác giả và số sách mà họ bán được là bao nhiêu:
SELECT au fname + ' ' + au Jnane Name, price*ytd_sales Sales
FROM authore
Trang 18Bài 12: Phân tích dit liéu bang SQL 171 Name Abraham Bennet 681859, 0506 Reginald Blotchet -Halls 180397 2000 Cheryl Carson 201581 3000 Michel DeFrance 66515 54060 Innes dei Castillo 40619.6800 Ann Dull 81908 0080 Marjorie Green 81859.0500 Marjorie Green 55978 7880 Burt Gringlesby 61384.0500 Sheryl Hunter 81900 0080 Livia Karsen 8886.2506 etc,
Câu lệnh này sẽ truy tìm mỗi sách cho mỗi tác giả, và in số lượng bán ra cho mỗi sách
Nhập vào SQL, sau đây là cú pháp tổng hợp hơn của câu
lệnh:
SELECT { * | columref [, columnaref ] } UINTO newtablename |
FROM tableref [, tableref .]
[[INNER } {LEFT { RIGHT} OUTER ] JOIN tabieref
ON columaref = columnref .]
[WHERE expression [{AND | OR} expression .})}
[GROUP BY { ALL | columnref [, columnref .] } ]
[HAVING expression }
[ORDER BY columref, |, columnref .j {DESC]] (COMPUTE agg func [, agg_func ]
Trang 19172 Bài 12: Phân tích dữ liệu bằng SQL Hạng mục mới đầu tiên, INTO, don gian nhat: SELECT
INTO tao mét table mdi Kết quả của query sẽ được lưu trữ vào
một table có tên là newtablename
GROUP BY là tiêu điểm của ví dụ giới thiệu Bạn sử dụng
mệnh đề này để thực hiện một rollup, hay sự tổng kết hàng của dữ liệu, bằng cách sử dụng một hay nhiều hàm gộp để tóm 'ắt các cột được nhóm lại Trong ví dụ, các sách của Marjorie tao nhiều hàng với các tổng cho mỗi sách
SELECT au_Tname+' '+ au Iname 'Author Name', SUM(ytd_sales * price) Sales
FROM authors
Trang 20Bài 12: Phân tích dữ liệu bằng SQL 173 Đầu tiên, bí danh Name đã được thay thế bằng ‘Author
Name' để làm cho chu thích dễ hiểu hơn, vì các khoảng trống có
nghĩa trong SQL, các dấu trích dẫn đơn phải được đặt xung
quanh nó để cho SQL Server biết rằng cả hai từ được đưa vào bí danh Kế tiếp, hãy yêu cầu SQL Server tính tổng số tiền Biểu
thức yid_sales." price trong một hép gop SUM được bao bọc Sau cùng, mệnh đề GROUP BY ở cuối được thêm vào để yêu
cầu SQL Server kết hợp các hàng có các tên tác giả giống nhau
Kết quả, SQL Server phân loại các hàng trước khi cho ra
chúng, và sau đó kết hợp chúng trên các cột trong danh sách
GROUP BY, đồng thời thực hiện các phép tính được yêu cầu với các hàm hộp Cuối cùng, Mariorie có được một dòng với tổng của tất cả sách của cô ta
SQL Server cần biết tất cả chỉ tiết về cách kết hợp các hàng
trong kết quả Do đó, khi bạn sti dung GROUP BY, bạn phai dat tất cả cột vào danh sách GROUP BY vốn không được bao bọc
trong một hàm gộp, ngay cả nếu dữ liệu sẽ không tạo các bản sao trên một cột khác
HAVING toại bỏ các hàng sau bước gôm nhóm theo cùng môt cách mà WHERE loại bỏ chúng ra khỏi các hàng được trả
về từ SELECT Ví dụ, nếu bạn theo dõi GROUP BY trong ví dụ
trước có HAVING và một tiêu chuẩn, bạn sẽ có được những kết
Trang 21174 Bài 12: Phân tích dữ liệu bằng SQL
SELECT au_fname+' ‘+ au_iname ‘Author Name’, SUM(ytd_sales * price) Sales
FAOM authors
JOIN titleauthor ON authors.au_id = titleauthor.au_id JOIN titles ON titleauthor.title_id +itles.titie_id
GROUP BY authors.au_fname, authors.au_Iname
HAVING SUM(ytd_ sales * price) > 100000 Author Name Sales Reginald Blotchet-Halls 180397 2000 Cheryl Garson 201501 2000 Marjorie Green 137837 6300 Michael O'Leary 107702 2500 (4 row(s) affected)
Chú ý rằng bạn không thể sử dung bi danh trong HAVING,
bạn phải sử dụng biểu thức mà bạn đã sử dụng trong SELECT để tạo ra giá trị
ORDER BY phân loại dữ liệu xuất theo các cột mà bạn xác
định Để phân loại theo thứ tự đảo ngược (“giảm dần”), bạn sử dụng từ khóa DESC
COMPUTE [BY) tạo các tổng phụ của dữ liệu trong các hàng dữ liệu xuất sau khi tổng kết va phân loại trong các phép toán
GROUP BY va ORDER BY Để chỉ tổng kết các số lượng bán
Trang 22Bài 12: Phân tích đữ liệu bang SQL 175
SELECT au fname+' '+ au Iname 'Author Name", SUM(ytd_sales * price) ‘Sales’
FROM authors
JOIN titieauthor ON authors.au_id = titleauthor.au_id JOIN titles ON titleauthor.title_id = titles.title_id GROUP BY au_fname, au_lnane
ORDER BY ‘Author Name!
COMPUTE SUM( SUM(ytd_sales * price) Author Name Sales Abraham Bennet 81859 0500 Akiko Yokomoto 61384.0500 Sheryl Hunter 1900.0000 Stearns Macfeather 54414.4500 Sylvia Panteley 7856, 2500 1476368 618
Câu lệnh này cho ra cùng một rowset như trước đó, và sau
đó báo cáo tổng của tất cả số lượng bán hàng sau cùng COMPUTE BY hơi kỳ lạ trong đó nó đòi hỏi dữ liệu được phân loại, do đó bạn phải sd dung ménh dé ORDER BY dé
chuẩn bị dữ liệu cho nó Nó sẽ tính các hàng dữ liệu theo một cách tương tự như GROUP BY ngoại trừ nó cũng sẽ trình bày cho bạn đữ liệu nguồn SQL sau đây sẽ tính các tổng phụ theo
Trang 23176 Bài 12: Phân tích dữ liệu bằng SQL
mm
SELECT au fname+' '+ au_Jname 'Author Name’, ytd_sales * price FROM authors JOIN titleauthor ON authors.au_id =
JOIN titles ON titleauthor.title_id GROER BY ‘Author Name’
COMPUTE SUM( ytd_sales * price ) BY ‘Author Name! titleauthor.av_id = titles, title_id eri Author Name Abraham Bennet 81859 8500 sum 81859 8500 Marjorie Green 81859 0500 Marjorie Green 55978 7800 197837 8300 Sylvia Panteley 7856.2500 sum 7856 2500
Sự cân bằng của câu lệnh SELECT, những mệnh đề được
trình bày ở đây, có thể nhanh chóng tạo ra các báo cáo và bản tổng kết từ cơ sở dữ liệu Mặc dù bạn có thể đạt được những kết quả tương tự bằng các gói phần mềm lập báo cáo, nhưng chúng
Trang 24Bài 12: Phân tích dữ liêu bang SQL 177 LIÊN KẾT DỮ LIEU UOT CAC QUERY CON
Cac query ma ban đã thấy cho đến thời điểm này có tiêu
chuẩn cụ thể trong việc liên kết các table và xác định các hàng
để truy tìm Đây là một yêu cầu thông thường, nhưng cũng có những tình huống trong đó bạn sẽ không cỏ sẵn dữ liệu mà ban cần để tìm kiếm, Ví dụ, nhiều lúc tiêu chuẩn mà bạn muốn sử dụng để giới hạn các hàng trong phần WHERE của SELECT sẽ
xuất phát từ một table hay query khác nào đó
Bất cứ nơi nào mà bạn đặt một biểu thức trong query của
ban, ban có thể sử dụng một query khác thay vào đó Ví dụ,
trong query để truy tìm các tổng số lượng bán hàng tử phần trước Giả sử bạn muốn thưởng cho các tác giả có số sách bán
chạy nhất, những người có số lượng sách bán cao hơn giá trị trung bình, bạn cỏ thể vấn tin mức trung bình từ table và sau đó
sử dụng nó trong mệnh đề WHERE của một select thứ hai, những điều này làm lãng phí thời gian và công sức, đặc biệt nếu query của bạn được cung cấp trong một chương trình hay script ASP mà bạn viết Thay vào đó, nơi mà bạn sẽ đặt giá trị cho mệnh đề WHERE, hãy thay thế nó bằng query cho giá trị trung bình trong các dấu ngoặc đơn:
SELECT CONVERT( varchar (25),
au fname + ' ` + au_iname ) Name, price*ytd_sales Sales, Title FROM authors
Trang 25us Bat đà: Phản tích dữ liệu bằng SQL
Emm
Name Sales Title
Cheryi Carson 201581 2080 But Is It User Frien Reginald @lotchet-halls 180397 2000 Fifty Years an Bucki
Aan Duli 81900 e000 Secrets of Silicon Vv Sheryl Hunter 81900 0800 Secrets of Silicon Vv Macjorie Green 81859 0506 The Busy Executive's Abraham Bennet 81859 0500 The Busy Executive's Dean Straight 81859, 0500 Straignt Talk About Johnson White 81399 2800 Prolonged Data Depri Michel DeFrance 66515 5400 The Gourmet Microwav Anne Ringer 66515.5400 The Gourmet Microwav Do đó có các số lượng sách bán chạy nhất được phân loại theo các số lượng bán giảm dần
Bạn cũng có thể tham chiếu query chính (query bên ngoài)
từ query con (query bên trong) Dạng câu lệnh này được gọi là một query con tương quan hiếm khi có bởi vì hầu hết các hoạt động mà bạn xem xét một query con tương quan có thể được thực hiện bằng cách sử dụng các phần nối; nếu có một mối
quan hệ để liên kết query bên trong và query bên ngoài, nó có
thể thường được đơn giản hóa bằng một phần nối thay vào đó
Các query con tương quan hữu dụng chủ yếu nơi chỉ có một mối
quan hệ không chặt chẽ giữa các table mà phải được so sánh để chọn
Ví dụ, câu lệnh sau đây truy tìm các tác giả có tên phù hợp
Trang 26Bài 12: Phân tích dữ liện bang SQL 179
SELECT au_fname, au lnane FROM Authors au
WHERE EXISTS (
SELECT au_id FROM Authors au2
WHERE au2.au lname LIKE au.aU Inane + '%' AND au2.au_id <> au.au_id ) au_tname au_1nane Marjorie Green Albert Ringer Anne Ringer
Để ám chỉ query bên ngoài, bạn phải tạo bí danh cho bất kỳ table chung, như đã trình bày Điều quan trọng cần nhớ khi sử dụng một query con là câu lệnh bên trong sẽ thực thì một lần
cho mỗi hàng trong câu lệnh bên ngoài Do đó, khi câu lệnh bên
trong của bạn được thực thi, nó có thể tham chiếu các giá trị
trong hàng hiện hành trong query bên ngoài Trong ví dụ này,
query bên ngoài chọn tất cả các hàng authors, và sau đó đối với
mỗi hàng, thực thi query bên trong Các query SELECT bên
trong cho bất kỳ tác giả khác có các tên tương tự; hàm EXIST cho ra true nếu bất kỳ phần tương xứng nào được tìm thấy (nghĩa
là, nếu SELECT bên trong cho ra bất kỳ hàng nào) Tiêu chuẩn
Trang 27IS0 Bài 12: Phần tích dữ liệu bằng SQL <> au.au_id, ngân nó khỏi phù hợp với cùng một tác giả hiện có
trong câu lệnh bên ngoài,
TÓM Lược
Trong bài này, bạn đã học phần còn lại của câu lệnh SE- LECT cua SQL Các query con là những query mà bạn có thể xếp lồng trong các query để thực hiện phép phân tích phức tạp
Trang 28Bài 13: Ấn định dữ liệu 181 Microsoft ® SQL Server 79 BANS, Ấn định đữ liệu
Trong bài này, bạn sẽ vượt khói phạm ví sứ dụng các cơ sở dữ
liệu hiện có và học cách tạo cơ sở dữ liệu riêng của bạn
Bài này sẽ trình cho bạn cách SQL Server lưu trữ dữ liệu của bạn và cách tạo, chỉnh sửa và xóa các đối tượng trong cơ sở dữ liệu
Cú dữ SỞ DỮ LIỆU, FILE, UÑ NHOM FILE
Mỗi cơ sở dữ liệu bạn làm việc với có ít nhất hai phần phụ: sự lưu trữ dữ liệu và sự ghi ghép giao tác (transaction log) Sự lưu trữ dữ liệu là nơ mà cơ sở dữ liệu lưu trữ tất cả các đối tượng
trong cơ sở dữ liệu của bạn, kể cả các phần ấn định table, dữ
liệu table, các phần ấn định view, các thủ tục được lưu trữ, login,
mọi thứ Transaction log lưu trữ mọi thứ bạn thực hiện đối với cơ
Trang 2912 Bài 13: Ấu định dữ liệu
Transaction toy
Bài 4 đã trình bày cho bạn cách sử dụng một giao tác (trans- action) để thử nghiệm một câu lệnh mà không áp dụng những thay đổi mà nó đã thực hiện đối với cơ sở dữ liệu Cơ chế nền
tảng để thực hiện điều này khác đơn giản về mặt khái niệm Khi bạn bắt đầu một câu lệnh (chẳng hạn như một UPDATE) vốn sẽ thay đối dữ liệu trong cơ sở dữ liệu, server tạo một hạng mục giao tác mới trong transaction log Trước khi nó thực hiện bất kỳ thay đổi, nó ghi tất cả thay đổi mà nó sẽ thực hiện vào transac-
tion record đó, với bất kỳ thông tin cần thiết để undo, hay tré vé những thay đổi Chỉ sau khi dữ liệu giao tác được lưu trữ trong
transaction log, nó sẽ thực hiện những thay đổi đối với dữ liệu trong các tabie cơ sở dữ liệu Khi các thay đổi được hoàn tất, nó
đánh dấu hạng mục giao tác trong transaction log là được chuyển giao (committed), hay hoan chinh (complete) va cé dinh (perma- nent)
Theo cách này, cơ sở đữ liệu giữ lại tính toàn vẹn dữ liệu,
ngay cả nếu một sự cố xảy ra vào giữa giai đoạn của một thay đổi Nếu sự cố điện xảy ra khi đang ở giai đoạn ghi transaction Sang Transaction log, server sẽ chỉ xóa transaction khi nó khởi động trong lần kế tiếp Nếu sự cố xảy ra khi nó thay đổi dữ liệu trong các table cơ sở dữ liệu (bước thứ hai), nó có thể sử dụng
Trang 30Bài 13: Ấn định dữ Hie
$ự lu tr tlữ liệu
Môi cơ số dữ liệu được lưu trữ trong một hay nhiều nhị m file, mỗi nhóm file sử dụng một hay nhiều file dữ liệu trên cia
cứng để chứa dữ liệu từ cơ sở dữ liệu (hình 13.1) Database Database Obecte LL PRIMARY File Group Another File Group = tủa — Hình 13.1 Mối quan hệ của các cơ sở dữ liệu, hồm file và file \ [
Khi bạn tạo một cd sở dữ liệu trong SQL Server, bạn phải cung cấp cho nó tên các file mà nó sẽ su dung va transaction
log Những tên này sẽ được tạo trong nhóm file PRIMARY và
được sử dụng để lưu trữ cả dữ liệu lẫn thông tin vốn mô tả cơ sở