2009-08-10 26 views
7

Mỗi lần tôi phát hiện ra rằng hiệu suất truy xuất dữ liệu từ cơ sở dữ liệu của tôi chậm. Tôi cố gắng tìm ra phần nào trong truy vấn SQL của mình có vấn đề và tôi cố gắng tối ưu hóa nó và cũng thêm một số chỉ mục vào bảng. Nhưng điều này không phải lúc nào cũng giải quyết được vấn đề.Điều gì có thể gây ra hiệu suất máy chủ SQL xấu?

Câu hỏi của tôi là:

Có bất kỳ thủ đoạn khác để làm cho hiệu suất máy chủ SQL tốt hơn?

Lý do khác khiến hiệu suất máy chủ SQL tồi tệ hơn là gì?

+0

Chạy hồ sơ, và để cho nó cho bạn biết nơi truy vấn là chậm. –

+0

Đây cũng phải là CW. Tôi chỉ đang nói. – Kredns

+0

Tôi có thể biết tại sao nó được đánh dấu gần không? – pang

Trả lời

20
  • thiết kế
  • file Auto-phát triển
  • Quá nhiều chỉ số được duy trì trên bảng
  • Quá ít chỉ mục trên một bảng
  • Không chọn đúng clustered index của bạn
  • Index truy vấn không hiệu quả phân mảnh do bảo trì kém
  • Phân mảnh đống do không có chỉ mục nhóm
  • FILLFACTORs Quá cao được sử dụng trên các chỉ số, gây tách trang quá mức
  • Quá thấp của một fillfactor sử dụng trên các chỉ số, gây ra việc sử dụng không gian quá mức và tăng thời gian quét
  • Không sử dụng các chỉ số bao phủ nơi thích hợp
  • chỉ số Non-chọn lọc được sử dụng
  • bảo dưỡng không đúng cách thống kê (trong số liệu thống kê ngày)
  • Cơ sở dữ liệu không bình thường đúng
  • bản ghi giao dịch và chia sẻ dữ liệu các cọc ổ cùng
  • Bộ nhớ sai cấu hình
  • Quá ít bộ nhớ
  • Quá ít CPU
  • chậm ổ cứng
  • Không ổ cứng hoặc phần cứng khác
  • bảo vệ màn hình
  • Một 3D trên máy chủ cơ sở dữ liệu của bạn nhai lên CPU của bạn
  • Sharing máy chủ cơ sở dữ liệu với các quy trình khác cạnh tranh cho CPU và bộ nhớ
  • Khóa tranh chấp giữa các truy vấn
  • Truy vấn quét toàn bộ bảng lớn
  • mã kết thúc trước những tìm kiếm dữ liệu một cách inefficent (vòng lồng nhau, từng hàng)
  • con trỏ đó là không cần thiết và/hoặc không FAST_FORWARD
  • Không đặt NOCOUNT khi bạn đã bàn lớn được cursored xuyên qua.
  • Sử dụng một mức cô lập giao dịch mà là quá cao (ví dụ như sử dụng SERIALIZABLE khi nó không cần thiết)
  • Quá nhiều chuyến đi vòng giữa các khách hàng và SQL Server (một giao diện tán gẫu)
  • Một truy vấn máy chủ liên kết không cần thiết
  • một truy vấn máy chủ liên kết mà nhắm vào một bảng trên một máy chủ từ xa không có khóa chính hoặc ứng cử viên được xác định
  • Lựa chọn quá nhiều dữ liệu
  • recompilations truy vấn quá

oh và có thể có một số người khác nữa.

+0

Tôi thích những câu trả lời hình thức điểm –

+0

Đó là một danh sách helluva. ;-) – Kredns

+0

LOL có lẽ ngày mai tôi có thể thêm một số chi tiết :) –

0

Nếu bạn mới làm quen với cơ sở dữ liệu và bạn có quyền truy cập vào trình tư vấn điều chỉnh công cụ cơ sở dữ liệu, bạn có thể điều chỉnh cơ sở dữ liệu của bạn một cách khủng khiếp.

Bạn về cơ bản nắm bắt các truy vấn SQL đang chạy với DB của bạn trong SQL Profiler, sau đó nạp chúng vào DETA. DETA chạy các truy vấn một cách hiệu quả (không thay đổi dữ liệu của bạn) và sau đó tìm ra thông tin nào mà cơ sở dữ liệu của bạn bị thiếu (các khung nhìn, các chỉ mục, các phân vùng, các số liệu thống kê, vv) để thực hiện các truy vấn tốt hơn.

Sau đó, bạn có thể áp dụng chúng cho bạn và theo dõi chúng trong tương lai. Tôi không nói rằng giả sử rằng DETA luôn đúng hoặc làm những việc mà không hiểu, nhưng tôi nhận thấy rằng đó là cách tốt để xem truy vấn của bạn đang làm gì, họ mất bao lâu và cách bạn có thể lập chỉ mục DB thích hợp.

PS: Với tất cả những gì đã nói, tốt hơn hết là đầu tư vào một DBA tốt khi bắt đầu dự án để bạn có cấu trúc tốt và lập chỉ mục để bắt đầu. Nhưng đó không phải là vị trí mà bạn đang ở ngay bây giờ ...

2

Khi tôi nói chuyện với các nhà phát triển mới gặp sự cố này, tôi thường thấy rằng đó là do một trong hai vấn đề. Cả hai đều được cố định nếu bạn làm theo 2 quy tắc này.

Trước tiên, không truy xuất bất kỳ dữ liệu nào bạn không cần. Ví dụ: nếu bạn đang phân trang thì không mang lại 100 hàng và sau đó tính toán những hàng nào thuộc về trang. Có được lưu trữ proc con số nó ra và chỉ lấy 10 bạn cần.

Thứ hai, không có gì nhanh hơn công việc bạn không làm. Ví dụ: tôi đã làm việc trên một hệ thống có vai trò và quyền đầy đủ cho người dùng được truy xuất với mọi trang được yêu cầu - đây là 100 hàng cho một số người dùng. Thậm chí chỉ cần lưu trạng thái phiên này vào yêu cầu đầu tiên và sau đó sử dụng nó từ đó cho các yêu cầu tiếp theo đã giảm cân có ý nghĩa khỏi cơ sở dữ liệu.

0

Đề nghị bạn có được một cuốn sách hay về Điều chỉnh hiệu suất cho cơ sở dữ liệu bạn sử dụng (đây là rất nhiều cơ sở dữ liệu cụ thể). Đây là một chủ đề vô cùng phức tạp và không thể được trả lời khác ngoài các khái quát chung trên web. Ví dụ, Dave markle cho bạn biết các truy vấn không hiệu quả có thể gây ra vấn đề và có nhiều cách để viết các truy vấn không hiệu quả và nhiều cách khác để khắc phục chúng.

0

Đây là một câu hỏi rất rộng. Và đã có rất nhiều câu trả lời. Tôi vẫn muốn thêm một yếu tố quan trọng - Page Split. Vấn đề là - có sự phân chia tốt và chia tách xấu.Sau đây là bài viết tốt giải thích làm thế nào để sử dụng transaction_log kiện mở rộng để xác định xấu/trang nasty Tách

  1. Tracking Problematic Pages Splits in SQL Server 2012 Extended Events - Jonathan Kehayias
  2. Tracking page splits using the transaction log - Paul Randal

Bạn nói:

tôi cố gắng tối ưu hóa nó và cũng thêm một số chỉ mục

Tuy nhiên, đôi khi việc xóa các chỉ mục không được nhóm không sử dụng có thể giúp cải thiện hiệu suất vì nó giúp giảm nhật ký giao dịch. Đọc Top Reasons for Log Performance Problems

Wait statistics, or please tell me where it hurts đưa ra ý tưởng về cách sử dụng thống kê chờ để phân tích hiệu suất.

Để xem một số ý tưởng mới cho hiệu suất, hãy nhìn vào Performance Considerations - sqlmag.com

  1. bảng riêng biệt trong tham gia vào các đĩa khác nhau (ví đĩa song song I/O - filegroups).
  2. Tránh tham gia trên các cột có ít giá trị duy nhất.

Để hiểu JOIN, đọc Advanced JOIN Techniques

+0

Gỡ rối sự kiện mở rộng [Gỡ rối truy vấn chạy chậm sử dụng sự kiện mở rộng Sự kiện thông tin chờ đợi] (https://blogs.msdn.microsoft.com/sqlsakthi/2011/02/20/troubleshooting-slow-running-query-using-extended-events -wait-info-event /) – Lijo

Các vấn đề liên quan