2008-09-14 33 views
10

Tôi biết đây là một câu hỏi rộng, nhưng tôi đã thừa hưởng một số người biểu diễn kém và cần tối ưu hóa chúng một cách tồi tệ. Tôi đã tự hỏi các bước phổ biến nhất liên quan đến việc tối ưu hóa là gì. Vì vậy, những gì các bạn làm một số bước khi phải đối mặt với tình hình tương tự?Các bước nào cần thiết để tối ưu hóa truy vấn hoạt động kém?

Câu hỏi liên quan:
What generic techniques can be applied to optimize SQL queries?

+0

Trông rất giống với [câu hỏi cũ này] (http://stackoverflow.com/questions/39331/what-generic-techniques-can-be-applied-to-optimize-sql-queries#39344). – Unsliced

Trả lời

14
  1. Nhìn vào kế hoạch thực hiện trong phân tích truy vấn
  2. Xem gì bước tốn nhất
  3. Tối ưu hóa các bước!
  4. Quay trở lại bước 1 [thx để Vinko]
+0

4 nên đọc 'Chuyển đến bước 1' –

+1

Đây là vòng lặp và vòng lặp không hợp lệ trong sql. :) Tôi kid .. Tôi kid .. Yêu câu trả lời này. –

+0

Nếu bạn cần thêm chi tiết, bạn cũng có thể kiểm tra đầu ra dấu vết (sử dụng 'SET AUTOTRACE ON' trong Oracle). Điều này sẽ cho phép bạn thấy những thứ như đọc vật lý, vv. Tôi chỉ sử dụng nó sau khi làm theo lời khuyên của roman. –

3

chỉ số có thể là một nơi tốt để bắt đầu ...

Quả treo thấp có thể được tháo rời với SQL Server Index chỉnh Wizard.

+0

Tôi đồng ý rằng đây có thể là một nơi tốt để bắt đầu, nhưng sau một thời gian tôi nhận thấy rằng nó có một chút mâu thuẫn với chính nó. Nó muốn xóa các chỉ mục mà nó đã tạo cho một lần thử điều chỉnh trước đó. –

2

Nhìn vào các chỉ số trên bảng mà làm cho các truy vấn. Có thể cần một chỉ mục trên các trường cụ thể tham gia vào mệnh đề where. Cũng xem xét các trường được sử dụng trong các phép nối trong truy vấn (nếu tham gia tồn tại). Nếu các chỉ mục đã tồn tại, hãy xem loại chỉ mục.

Không làm điều đó (vì có âm tính khi sử dụng gợi ý khóa) Xem gợi ý khóa và đặt tên rõ ràng chỉ mục để sử dụng trong kết nối. Sử dụng NOLOCKS rõ ràng hơn nếu bạn nhận được rất nhiều giao dịch bế tắc.

Làm những gì người La Mã và Andy S đã đề cập trước.

7

Trong SQL Server, bạn có thể xem Kế hoạch truy vấn trong Trình phân tích truy vấn hoặc Phòng quản lý. Điều này sẽ cho bạn biết tỷ lệ phần trăm thời gian đã sử dụng trong mỗi lô câu. Bạn sẽ muốn tìm kiếm những điều sau:

  • Quét bảng; điều này có nghĩa là bạn hoàn toàn thiếu chỉ mục
  • Quét chỉ mục; truy vấn của bạn có thể không sử dụng các chỉ mục chính xác
  • Độ dày của mũi tên giữa mỗi bước trong truy vấn cho bạn biết có bao nhiêu hàng được tạo bởi bước đó, mũi tên rất dày có nghĩa là bạn đang xử lý nhiều hàng và có thể cho biết rằng một số kết nối cần được tối ưu hóa.

Một số lời khuyên chung khác:

  • Một số lượng lớn các báo cáo có điều kiện, chẳng hạn như nhiều lệnh if-else, có thể gây ra SQL Server để liên tục xây dựng lại kế hoạch truy vấn. Bạn có thể kiểm tra điều này bằng Profiler.
  • Đảm bảo rằng các truy vấn khác nhau không chặn nhau, chẳng hạn như câu lệnh cập nhật chặn câu lệnh chọn. Điều này có thể tránh được bằng cách xác định gợi ý (nolock) trong các câu lệnh SQL Server select.
  • Như những người khác đã đề cập, hãy thử trình hướng dẫn Chỉnh sửa hiệu suất trong Management Studio.

Cuối cùng, tôi khuyên bạn nên tạo một tập hợp các bài kiểm tra tải (sử dụng Visual Studio 2008 Test Edition), mà bạn có thể sử dụng để mô phỏng hành vi của ứng dụng khi xử lý một lượng lớn yêu cầu. Một số tắc nghẽn hiệu năng SQL chỉ thể hiện trong những trường hợp này và việc tái tạo chúng có thể dễ dàng sửa chữa hơn.

1

Kế hoạch thực hiện là một khởi đầu tuyệt vời và sẽ giúp bạn tìm ra phần nào của truy vấn bạn cần giải quyết.

Khi bạn tìm ra nơi, đã đến lúc giải quyết cách thức và lý do. Hãy xem loại truy vấn bạn đang cố gắng tạo sẵn. Tránh các vòng bằng mọi giá vì chúng chậm. Tránh các con trỏ bằng mọi giá vì chúng chậm. Stick để thiết lập các truy vấn dựa trên khi nào có thể.

Có nhiều cách để đưa ra gợi ý sql về loại tham gia để sử dụng nếu bạn đang sử dụng kết nối. Tuy nhiên, hãy thận trọng ở đây, trong khi một gợi ý có thể tăng tốc truy vấn của bạn một lần, nó có thể làm chậm truy vấn của bạn gấp 10 lần trong lần tiếp theo tùy thuộc vào dữ liệu và thông số.

Cuối cùng, hãy đảm bảo cơ sở dữ liệu của bạn được lập chỉ mục tốt. Một nơi tốt để bắt đầu là bất kỳ trường nào được chứa trong mệnh đề where có lẽ nên có chỉ mục trên đó.

2

Tôi không chắc về cơ sở dữ liệu khác, nhưng đối với SQL Server tôi khuyên bạn nên thực hiện Kế hoạch thực hiện. Nó rất rõ ràng (mặc dù với rất nhiều cuộn dọc và ngang, trừ khi bạn đã có một màn hình 400 "!) Cho thấy những gì các bước truy vấn của bạn là mút thời gian.

Nếu bạn có một bước điên 80%, sau đó có thể một chỉ số có thể được thêm vào, sau đó sau khi tinh chỉnh chỉ mục, hãy chạy lại Kế hoạch thực hiện để tìm bước lớn nhất tiếp theo của bạn để tìm bước tiếp theo lớn nhất tiếp theo của bạn. [IMG] từ những người khác, tức là chúng chiếm 1-2%, nếu đó là trường hợp, sau đó bạn có thể cần phải xem liệu có cách nào bạn có thể cắt giảm lượng dữ liệu được đưa vào truy vấn của bạn hay không, thực hiện bốn triệu đơn đặt hàng đã đóng cần phải được bao gồm trong truy vấn "Đơn đặt hàng đang hoạt động"? Không, vì vậy loại trừ tất cả những người có STATUS = 'C' ... hoặc một cái gì đó tương tự .

Một cải tiến khác bạn sẽ thấy từ Kế hoạch thực hiện là tra cứu dấu trang, về cơ bản nó tìm thấy một kết quả trong chỉ mục, nhưng sau đó SQL Server phải nhanh chóng tìm kiếm thông qua bảng để tìm bản ghi mà bạn muốn. Hoạt động này đôi khi có thể mất nhiều thời gian hơn là chỉ quét bảng ở nơi đầu tiên sẽ có, nếu đúng như vậy, bạn có thực sự cần chỉ mục đó không?

Với chỉ mục và đặc biệt với SQL Server 2005, bạn nên xem xét mệnh đề INCLUDE, về cơ bản cho phép bạn có một cột trong chỉ mục mà không thực sự nằm trong chỉ mục, vì vậy nếu tất cả dữ liệu bạn cần cho truy vấn của mình là trong chỉ mục của bạn hoặc là một cột được bao gồm thì SQL Server thậm chí không cần phải nhìn vào bảng, một sự đón nhận hiệu suất lớn.

2

Có một vài điều bạn có thể xem để tối ưu hóa hiệu suất truy vấn của mình.

  1. Đảm bảo rằng bạn chỉ có tối thiểu dữ liệu. Đảm bảo bạn chỉ chọn các cột bạn cần. Giảm kích thước trường xuống mức tối thiểu.

  2. Cân nhắc de-bình thường hóa cơ sở dữ liệu của bạn để giảm kết hợp

  3. Tránh vòng lặp (ví dụ: lấy con trỏ), dính vào thiết lập hoạt động.

  4. Triển khai truy vấn dưới dạng thủ tục được lưu trữ vì thao tác này được biên dịch trước và sẽ thực thi nhanh hơn.

  5. Đảm bảo rằng bạn đã thiết lập chỉ mục chính xác. Nếu cơ sở dữ liệu của bạn được sử dụng chủ yếu để tìm kiếm thì hãy xem xét nhiều chỉ mục hơn.

  6. Sử dụng kế hoạch thực hiện để xem cách xử lý được thực hiện. Những gì bạn muốn tránh là một bảng quét vì điều này là tốn kém.

  7. Đảm bảo rằng Thống kê tự động được đặt thành bật. SQL cần điều này để giúp quyết định thực thi tối ưu. Xem bài đăng tuyệt vời của Mike Gunderloy để biết thêm thông tin. Basics of Statistics in SQL Server 2005

  8. Hãy chắc chắn rằng chỉ số của bạn không bị phân mảnh Reducing SQL Server Index Fragmentation

  9. Hãy chắc chắn rằng bảng của bạn không bị phân mảnh. How to Detect Table Fragmentation in SQL Server 2000 and 2005

+0

Bằng mọi cách, hãy nghĩ lại toàn bộ kiến ​​trúc cơ sở dữ liệu của bạn để điều chỉnh một truy vấn đơn lẻ. De-normalizing không phải là bước điều chỉnh truy vấn. Quét bảng không tốn kém khi lựa chọn khác đang thực hiện quét chỉ mục, sau đó truy cập bảng bằng rowid khi bạn cần 100% số hàng ở vị trí đầu tiên. –

+0

Có thể vấn đề là kiến ​​trúc cơ sở dữ liệu. –

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