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

6 Truy vấn sự cố làm chậm cơ sở dữ liệu của bạn

Hiệu suất cơ sở dữ liệu kém là một cái gai đối với mọi mặt của DBA. Và không phải lúc nào cũng dễ dàng xác định nguyên nhân gốc rễ của các vấn đề về hiệu suất, điều này chỉ làm tăng thêm căng thẳng.

Điều chỉnh cơ sở dữ liệu SQL Server của bạn là một cách tuyệt vời để giải quyết một số vấn đề về hiệu suất của bạn, nhưng có thể không phải lúc nào bạn cũng rõ ràng nên bắt đầu quá trình tối ưu hóa ở đâu. Nếu bạn loại trừ dung lượng ổ đĩa, bộ nhớ cũng như các chất tiêu diệt hiệu suất phần cứng và mạng khác, đồng thời hiệu suất Máy chủ SQL của bạn vẫn bị chậm, thì đã đến lúc tìm hiểu các truy vấn của bạn.

Các truy vấn không được tối ưu hóa có thể gây ra vô số vấn đề về hiệu suất cho hệ thống của bạn. Về mặt sáng sủa, một vài lỗi truy vấn phổ biến là nguyên nhân dẫn đến phần lớn sự suy giảm hiệu suất cơ sở dữ liệu.

Nếu các truy vấn của bạn gặp phải bất kỳ vấn đề nào trong số sáu vấn đề này, hãy sẵn sàng cho một số điều chỉnh hiệu suất nghiêm trọng.

Truy vấn vấn đề số 1:Giống như các biểu thức với các ký tự đại diện hàng đầu

Các ký tự đại diện hàng đầu ngăn MySQL sử dụng các chỉ mục, buộc phải quét toàn bộ bảng ngay cả khi bạn đã lập chỉ mục một trường trong bảng. Việc quét tất cả các hàng trong bảng làm chậm đáng kể việc phân phối kết quả truy vấn của bạn, vì vậy hãy loại bỏ ký tự đại diện đứng đầu để cải thiện hiệu quả.

Truy vấn vấn đề số 2:Các cột không được lập chỉ mục được sử dụng trong các điều khoản "Ở đâu" và "Nhóm theo"

Việc lập chỉ mục các cột giúp trả về kết quả truy vấn nhanh hơn vì nó loại bỏ nhu cầu quét toàn bộ bảng. Lập chỉ mục cũng giúp sắp xếp các bản ghi khi chúng được trả về và đảm bảo các bản ghi đó có thể nhận dạng duy nhất, điều này đặc biệt hữu ích trong các bảng có hơn 10 hàng.

Để có một chút quan điểm, hãy cân nhắc chạy câu lệnh “giải thích” trong phân tích truy vấn của bạn trước và sau khi lập chỉ mục. Điều này sẽ cung cấp cho bạn ý tưởng về số lượng hàng quét mà bạn vừa tự lưu.

Truy vấn vấn đề số 3:Giống như các câu lệnh sử dụng toán tử ‘hoặc’ thay vì mệnh đề liên hợp

Chạy truy vấn bằng toán tử so sánh “hoặc” trên các trường hoặc cột trong bảng có thể hữu ích, nhưng việc áp dụng “hoặc” quá thường xuyên trong mệnh đề “where” là một cách nhanh chóng khác để quét toàn bộ bảng.

Một mệnh đề liên hiệp có thể làm cho truy vấn SQL chạy nhanh hơn, đặc biệt nếu các chỉ mục khác nhau đang tối ưu hóa mỗi bên của truy vấn. Về cơ bản, toán tử liên hợp lấy kết quả của hai truy vấn nhanh, được lập chỉ mục và hợp nhất chúng thành một.

Truy vấn vấn đề số 4:Tìm kiếm theo ký tự đại diện

Nếu bạn bị mắc kẹt trong một tình huống mà bạn cần tìm kiếm bằng các ký tự đại diện nhưng bạn không muốn đạt được hiệu suất, hãy thử sử dụng tìm kiếm toàn văn bản MySQL. Tìm kiếm toàn văn bản nhanh hơn đáng kể so với tìm kiếm bằng các ký tự đại diện và bạn nhận được lợi ích bổ sung từ các kết quả phù hợp hơn khi tìm kiếm cơ sở dữ liệu khổng lồ.

Truy vấn vấn đề số 5:Lược đồ cơ sở dữ liệu chưa được tối ưu hóa

Bạn chỉ có thể cải thiện hiệu suất truy vấn SQL rất nhiều nếu bạn cũng không tối ưu hóa lược đồ cơ sở dữ liệu của mình. Dưới đây là một số mẹo để cải thiện:

Chuẩn hóa bảng

Sự dư thừa dữ liệu làm ảnh hưởng đến hiệu suất, vì vậy hãy đảm bảo chỉ thể hiện một sự kiện một lần trong cơ sở dữ liệu. Ví dụ:nếu tham chiếu một khách hàng trong nhiều bảng, chỉ sử dụng “customer_name” một lần, sau đó sử dụng “customer_ID” cho các tham chiếu tiếp theo.

Sử dụng các loại dữ liệu tối ưu

Một số điểm quan trọng cần nhớ khi nói đến kiểu dữ liệu:

  • Ngắn hơn sẽ tốt hơn khi thiết kế bảng. Ví dụ:sử dụng kiểu dữ liệu “TINYINT” cho trường “user_id” cho bảng người dùng hệ thống có ít hơn 100 người dùng.
  • Sử dụng kiểu dữ liệu “date_time” nếu một trường yêu cầu giá trị ngày tháng để bạn không phải chuyển đổi các bản ghi sang định dạng ngày tháng.
  • MySQL hoạt động tốt hơn với các giá trị số nguyên so với các kiểu dữ liệu văn bản, bao gồm cả varchar.

Tránh các giá trị rỗng

Giá trị rỗng trong một cột có thể ảnh hưởng đến kết quả truy vấn của bạn, vì vậy bạn có thể cần phải chỉ định giá trị mặc định cho các trường mà bản ghi không yêu cầu giá trị bắt buộc.

Không sử dụng quá nhiều cột

Các bảng rộng (hơn 100 cột) yêu cầu nhiều CPU và tài nguyên để xử lý. Trừ khi bạn hoàn toàn phải bao gồm một bảng rộng, tốt hơn là bạn nên chia nó thành các bảng nhỏ hơn, hợp lý.

Tối ưu hóa tham gia

Các câu lệnh SQL có quá nhiều phép nối (và phép nối với quá nhiều bảng) ảnh hưởng tiêu cực đến hiệu suất. Bắn không quá 12 liên kết cho mỗi truy vấn.

Truy vấn vấn đề số 6:Truy vấn MySQL chưa được lưu trong bộ đệm ẩn

Các trang web và ứng dụng thực hiện nhiều truy vấn chọn lọc sẽ được hưởng lợi từ việc lưu vào bộ nhớ đệm các truy vấn MySQL. Bộ nhớ đệm truy vấn MySQL tăng tốc hiệu suất trong quá trình đọc vì nó lưu vào bộ nhớ đệm truy vấn chọn cùng với tập dữ liệu kết quả và tìm nạp từ bộ nhớ (không phải đĩa) nếu truy vấn được thực thi nhiều lần.

Điều chỉnh hiệu suất là điều cần thiết để duy trì tính khả dụng cao cho cơ sở dữ liệu SQL Server của bạn và đảm bảo người dùng cuối của bạn hài lòng. Nhưng thật không may, không phải lúc nào cũng rõ ràng nơi cần điều chỉnh nhất. Nếu bạn đã loại bỏ các nguồn phần cứng và mạng rõ ràng gây ra các vấn đề về hiệu suất, hãy chuyển trọng tâm sang các truy vấn của bạn.

Nếu bạn đã làm việc với tư cách là DBA trong bất kỳ khoảng thời gian nào, bạn có thể gặp phải một (hoặc tất cả) trong số các truy vấn vấn đề này. Bây giờ bạn đã biết những gì cần lưu ý, hãy chủ động trong sáng kiến ​​cải thiện hiệu suất của mình và khắc phục những điểm khó khăn của truy vấn phổ biến này để bạn có thể gặt hái được thành quả từ việc tối ưu hóa truy vấn SQL Server.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Salesforce SOQL từ SQL Server

  2. Cài đặt cụm chuyển đổi dự phòng SQL Server -1

  3. Chèn các ký tự vào giữa chuỗi trong SQL Server (T-SQL)

  4. SQL chọn nơi không có trong truy vấn con không trả về kết quả

  5. Làm cách nào để liệt kê tất cả các cột trong một bảng?