Kể tên các loại Triggers trong SQL Server?
Có ba loại Trigger khác nhau:
- DML Triggers có hai loại con:
- Instead of Triggers: Chúng được gọi thay cho hành động triggering như chèn, cập nhật hoặc xóa.
- After Triggers: Chúng được gọi sau hành động triggering như chèn, cập nhật hoặc xóa.
- DDL Triggers: Chúng được gọi để chống lại các câu lệnh DDL. Chúng luôn là After Triggers.
- Logon Triggers: Chúng được gọi khi sự kiện Logon (đăng nhập) xảy ra và trước khi phiên người dùng (user session) được thiết lập.
Giải thích sự khác biệt về cách sử dụng giữa User defined functions (UDF) và Stored procedure?
UDF có thể được sử dụng ở bất kỳ đâu trong các truy vấn, tức là trong phần where/have/select
nơi mà các stored procedures
không thể.
Lưu ý: Các stored procedures
có thể được sử dụng với các câu lệnh insert. UDF cũng có thể được sử dụng trong các hành động join
và UDF
có thể được sử dụng để trả về các bảng có thể được join
với các bảng khác.
Điều gì sẽ xảy ra nếu không có index?
Giả sử chúng ta muốn chạy một truy vấn để tìm tất cả thông tin chi tiết về bất kỳ nhân viên nào có tên là "Abc"? Điều gì sẽ xảy ra nếu không có index
?
SELECT * FROM Employee
WHERE Employee_Name = "Abc"
Giải pháp: phần mềm cơ sở dữ liệu theo nghĩa đen sẽ phải xem xét từng hàng trong bảng Employee để xem liệu Employee_Name của hàng đó có phải là "Abc" hay không. Và, bởi vì chúng ta muốn tất cả các hàng có tên "Abc" bên trong nó, chúng ta không thể ngừng tìm kiếm khi chúng ta chỉ tìm thấy một hàng có tên "Abc", bởi vì có thể có các hàng khác có tên "Abc". Vì vậy, tất cả các hàng phải được tìm kiếm - có nghĩa là hàng nghìn hàng trong kịch bản này sẽ phải được cơ sở dữ liệu kiểm tra để tìm các hàng có tên "Abc". Đây được gọi là full table scan (quét toàn bộ bảng).
Chi phí cho một database index?
- Nó chiếm không gian - và bảng của bạn càng lớn thì
index
của bạn càng lớn. - Một tác động khác đến hiệu suất với các
index
là thực tế bất cứ khi nào bạn thêm, xóa hoặc cập nhật cácrow
trong bảng tương ứng, các thao tác tương tự sẽ phải được thực hiện đối vớiindex
của bạn. Hãy nhớ rằng mộtindex
cần phải chứa cùng một dữ liệu giống như bất kỳ dữ liệu nào trong (các) cột của bảng màindex
bao gồm. - Theo quy tắc chung, một
index
chỉ nên được tạo nếu dữ liệu trong cột được lập index được truy vấn thường xuyên.
Linked server là gì?
Linked server
(máy chủ liên kết) tạo điều kiện để dễ dàng liên kết với cácheterogeneous servers
(máy chủ không đồng nhất). Sử dụng cáclinked server
, bạn có thể thao tác dữ liệu trên các remote server (máy chủ từ xa) và thậm chí tích hợp với dữ liệu cục bộ.- Các stored procedures:
sp_linkedservers
cung cấp cho bạn danh sách cáclinked server
có sẵn trên máy chủ.
DMV và DMF là gì?
Data management views
và data management functions
cung cấp thông tin về trạng thái của Sql Server hay nói cách khác chúng có trách nhiệm cung cấp thông tin về tình trạng của Sql Server.
Deadlock được giải quyết như thế nào?
Deadlock được SQL Server giải quyết một cách tự động. Nó xác định quy trình có ít chi phí hơn và dựa vào đó, nó rollback lại transaction được liên kết với quy trình đó.
Filegroup là gì?
- Filegroup (nhóm tệp) là một tập hợp các tệp dữ liệu (datafiles) được quản lý như một đơn vị duy nhất. Bạn có thể có một filegroup chính cho mỗi cơ sở dữ liệu và nhiều filegroup cho người dùng.
Logfiles
không thể là một phần của filegroup do sự khác biệt về cấu trúc.
Giải thích sự khác biệt giữa exclusive lock và update lock?
Trong trường hợp exclusive lock
, không có lock nào khác có thể được lấy trên hàng hoặc bảng đó. Mọi quá trình phải đợi cho đến khi quá trình giữ lock đó giải phóng nó.
Trong trường hợp update lock, khi đang đọc row hoặc record (bản ghi), bạn có thể có bất kỳ lock khác được liên kết với row hoặc record đó. Trong trường hợp cập nhật record đó, update lock sẽ tự thay đổi thành exclusive lock
và không quá trình nào khác có thể có được lock trên hàng đó cho đến khi lock đó được giải phóng.
Statistics (thống kê) là gì?
Statistics xác định mức độ thực thi của một truy vấn với mức tiêu thụ tài nguyên thấp.
Truncate và Delete ảnh hưởng như thế nào đến Identity?
Truncate reset
lại Identity
về giá trị cơ bản của nó, còn Delete
thì không.
B-trees index hoạt động như thế nào?
Lý do B-tree
là cấu trúc dữ liệu phổ biến nhất cho các index là do chúng hiệu quả về thời gian - bởi vì việc tìm kiếm, xóa và chèn đều có thể được thực hiện theo logarithmic time.
Và, một lý do chính khác khiến B-tree
được sử dụng phổ biến hơn là vì dữ liệu được lưu trữ bên trong B-tree
có thể được sắp xếp.
RDBMS
thường xác định cấu trúc dữ liệu nào thực sự được sử dụng cho một index. Tuy nhiên, trong một số trường hợp với một số RDBMS
nhất định, bạn thực sự có thể chỉ định cấu trúc dữ liệu nào bạn muốn cơ sở dữ liệu của mình sử dụng khi bạn tạo index.
Sự khác biệt giữa UNION, MINUS và INTERSECT?
UNION
kết hợp các kết quả từ 2 bảng và loại bỏ các record trùng lặp khỏi tập kết quả.- Khi được sử dụng giữa 2 bảng,
MINUS
cho kết quả là tất cả các row từ bảng đầu tiên ngoại trừ các row có trong bảng thứ hai. INTERSECT
chỉ trả về cho chúng ta các row phù hợp hoặc chung giữa 2 tập kết quả
Làm cách nào chúng ta có thể chuyển đổi một bảng bằng SQL (thay đổi các rows thành columns hoặc ngược lại)?
Cách thông thường để làm là sử dụng câu lệnh CASE
hoặc DECODE
.
Kể tên một số nhược điểm của Hash index?
Hash tables
không phải là cấu trúc dữ liệu được sắp xếp và có nhiều loại truy vấn mà hash index
thậm chí không thể giúp được. Ví dụ: giả sử bạn muốn tìm hiểu tất cả các nhân viên dưới 40 tuổi.
Làm thế nào bạn có thể làm điều đó với một hash table index
? Chà, điều đó là không thể vì hash table chỉ tốt cho việc tìm kiếm các cặp key-value
, có nghĩa là các truy vấn chỉ để kiểm tra "equality".
Optimistic Locking và Pessimistic Locking là gì?
Optimistic Locking
là một chiến lược trong đó bạn đọc bản ghi, ghi lại version number (các phương pháp khác để thực hiện việc này liên quan đến dates, timestamps hoặc checksums / hashes) và kiểm tra xem phiên bản này (version) có thay đổi không trước khi bạn ghi lại bản ghi (record). Khi bạn ghi lại bản ghi, bạn lọc bản cập nhật trên phiên bản này để đảm bảo rằng nó là nguyên tử (atomic). (tức là chưa được cập nhật trong giữa khoảng thời gian khi bạn kiểm tra phiên bản và ghi bản ghi vào đĩa) và cập nhật phiên bản trong một lần truy cập. Nếu bản ghi bị thay đổi (tức là phiên bản khác với phiên bản của bạn), bạn hủy giao dịch và người dùng có thể bắt đầu lại.
Chiến lược này được áp dụng nhiều nhất cho các hệ thống khối lượng lớn và kiến trúc ba tầng, nơi bạn không nhất thiết phải duy trì kết nối với cơ sở dữ liệu cho phiên của mình. Trong trường hợp này, máy khách thực sự không thể duy trì các khóa cơ sở dữ liệu vì các connections được lấy từ một pool và bạn có thể không sử dụng cùng một connection từ lần truy cập này đến lần truy cập tiếp theo.
Pessimistic Locking
là khi bạn khóa bản ghi cho mục đích sử dụng riêng của mình cho đến khi bạn hoàn thành nó. Nó có tính toàn vẹn tốt hơn nhiều so với Optimistic Locking
nhưng đòi hỏi bạn phải cẩn thận với thiết kế ứng dụng của mình để tránh Deadlocks. Để sử dụng Pessimistic Locking
, bạn cần có một connection trực tiếp đến cơ sở dữ liệu (như trường hợp thường xảy ra trong ứng dụng hai tầng client-server) hoặc ID transaction có sẵn bên ngoài có thể được sử dụng độc lập với connection.
Nhược điểm của Pessimistic Locking
là một resource sẽ bị khóa từ thời điểm nó được truy cập lần đầu trong một giao dịch cho đến khi giao dịch kết thúc, khiến nó không thể truy cập được vào các giao dịch khác trong thời gian đó.
Chọn hàng đầu tiên trong mỗi nhóm GROUP BY (bài toán tìm n lớn nhất trong mỗi group)?
Ta có bảng Purchases:
id | customer | total
---+----------+------
1 | Joe | 5
2 | Sally | 3
3 | Joe | 2
4 | Sally | 1
Viết truy vấn tìm id
của lần mua hàng lớn nhất (total) của một khách hàng. Trả lời:
WITH summary AS (
SELECT p.id,
p.customer,
p.total,
ROW_NUMBER() OVER(PARTITION BY p.customer
ORDER BY p.total DESC) AS rk
FROM PURCHASES p)
SELECT s.\*
FROM summary s
WHERE s.rk = 1
Làm sao insert kết quả của một stored procedure vào một temporary table?
Làm sao ta có thể thực hiện
SELECT * INTO [temp table] FROM [stored procedure]
mà không cần định nghĩa [temp table]
Giải pháp:
Bạn có thể sử dụng OPENROWSET cho việc này. Chúng ta cũng đã bao gồm mã
sp_configuređể bật
Ad Hoc Distributed Queries`, trong trường hợp nó chưa được bật.
CREATE PROC getBusinessLineHistory
AS
BEGIN
SELECT \* FROM sys.databases
END
GO
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
SELECT _ INTO #MyTempTable FROM OPENROWSET('SQLNCLI', 'Server=(local)\SQL2008;Trusted_Connection=yes;',
'EXEC getBusinessLineHistory')
SELECT _ FROM #MyTempTable
Primary key và Unique key có mối quan hệ như thế nào với null?
Primary key
cho phép không có giá trịnull
trong cột được chỉ định.- Trong khi đó
Unique
key cho phép có và chỉ một giá trịnull
trong cột được chỉ định.
Kể tên một số loại index khác?
Các index
sử dụng cấu trúc dữ liệu R-tree
thường được sử dụng để trợ giúp các vấn đề về không gian. Ví dụ: truy vấn như "Tìm tất cả các quán Starbucks cách tôi 2km" sẽ là loại truy vấn có thể phải thực hiện hiệu suất nâng cao nếu bảng cơ sở dữ liệu sử dụng R-tree index
.
Một loại index khác là bitmap index
, nó hoạt động tốt trên các column chứa giá trị Boolean
(như true
và false
), nhưng nhiều trường hợp của 2 giá trị đó - về cơ bản là các columns
có độ chọn lọc thấp.