Bộ câu hỏi phỏng vấn SQL Server phần 4

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 joinUDF 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ác row trong bảng tương ứng, các thao tác tương tự sẽ phải được thực hiện đối với index của bạn. Hãy nhớ rằng một index 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ác heterogeneous servers (máy chủ không đồng nhất). Sử dụng các linked 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ác linked server có sẵn trên máy chủ.

DMV và DMF là gì?


Data management viewsdata 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ậtAd 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ư truefalse), 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.

Avatar Techmely Team
VIẾT BỞI

Techmely Team