2009-08-26 20 views

Trả lời

28

Giảm lượng dữ liệu được trả về, chỉ trả lại các trường bắt buộc và chỉ trả về các hàng được yêu cầu. Điều này là phổ biến nhất, khi bạn làm điều đó cho mọi truy vấn trả về dữ liệu.

Thêm chỉ mục. Điều này không được thực hiện thường xuyên, vì một số bảng không cần bất kỳ chỉ mục nào khác ngoài chỉ mục được tạo cho khóa chính.

+1

+1 chỉ trả lại các cột bạn cần –

+0

+1 để nêu rõ các sự kiện hiển nhiên nhưng rất quan trọng, mà mọi người có xu hướng quên – Yottagray

0
  1. lập chỉ mục tối ưu hóa phổ biến nhất
  2. Để chuẩn hóa bảng.
  3. Loại bỏ những hạn chế (chỉ khi bạn biết những gì bạn đang làm)
+1

Xóa ràng buộc là một điều thú vị. Nó có thể giúp thực hiện các thay đổi, nhưng có thể làm tổn thương hiệu suất của các truy vấn. –

+1

ràng buộc được sử dụng bởi động cơ sql để có được kế hoạch truy vấn tối ưu nhất và loại bỏ sau đó có thể gây ra mất hiệu suất như Rob đã chỉ ra. –

+0

Tôi nghĩ rằng việc loại bỏ các ràng buộc sẽ giúp khi có rất nhiều lần chèn đang diễn ra. –

1

Giảm mức cô lập giao dịch để có được xung quanh ổ khóa bảng cho các truy vấn người dùng. Không phải tất cả thời gian, nhưng đối với hiển thị thông tin chung của gui nó hoạt động tuyệt vời.

5

Đầu ra bộ nhớ đệm db. Tránh áp lực cơ sở dữ liệu ở tất cả dường như là một tối ưu hóa thận trọng.

+1 memcached.

1

Nếu bạn đang nói chung như trong thực tế phổ biến thì chỉ số là điều đầu tiên bật lên trong đầu của tôi.

Chúng là một kỹ thuật mạnh mẽ thường bị hiểu lầm và thường bị lạm dụng.

Sau đó, tôi sẽ đặt không chuẩn hóa có thể bổ sung thêm một chút hiệu suất cho nhiều cơ sở dữ liệu.

Tối ưu hóa truy vấn là thứ ba và nó cũng giúp ích rất nhiều. Tôi sử dụng MySQL những ngày này và truy vấn đăng nhập giúp rất nhiều cho tối ưu hóa.

Memcached chắc chắn là không phổ biến, mặc dù bộ nhớ đệm của một số loại là một phần của nhiều trang web ở cuối kịch bản (ASP.Net hoặc PHP).

24

danh sách ưa thích của tôi của tips (explained in detail here) như sau

  1. Cố gắng hạn chế các truy vấn tập hợp kết quả bằng cách sử dụng mệnh đề WHERE.
  2. Cố gắng hạn chế tập hợp kết quả truy vấn bằng cách chỉ trả về các cột cụ thể từ bảng chứ không phải tất cả các cột của bảng.
  3. Sử dụng chế độ xem và quy trình được lưu trữ thay vì truy vấn nặng.
  4. Bất cứ khi nào có thể, hãy cố gắng tránh sử dụng con trỏ SQL Server.
  5. Nếu bạn cần trả lại tổng số hàng của bảng, bạn có thể sử dụng một cách thay thế thay cho câu lệnh SELECT COUNT (*).
  6. Cố gắng sử dụng các ràng buộc thay vì trình kích hoạt, bất cứ khi nào có thể.
  7. Sử dụng các biến bảng thay vì các bảng tạm thời.
  8. Cố gắng tránh mệnh đề HAVING, bất cứ khi nào có thể.
  9. Bất cứ khi nào có thể, hãy cố tránh sử dụng mệnh đề DISTINCT.
  10. Đưa câu lệnh SET NOCOUNT ON vào các thủ tục đã lưu của bạn để dừng thông báo cho biết số hàng bị ảnh hưởng bởi một câu lệnh T-SQL.
  11. Sử dụng các câu lệnh chọn với từ khóa TOP hoặc câu lệnh SET ROWCOUNT nếu bạn chỉ cần trả lại n hàng đầu tiên.
  12. Sử dụng gợi ý bảng FAST number_rows nếu bạn cần nhanh chóng trả về hàng 'number_rows'.
  13. Cố gắng sử dụng câu lệnh UNION ALL thay vì UNION, bất cứ khi nào có thể.
  14. Không sử dụng gợi ý trình tối ưu hóa trong truy vấn của bạn.
+0

Không chắc chắn ý bạn là gì bởi lượt xem thay vì truy vấn nặng.Theo quan điểm chỉ là một truy vấn phụ được lưu trữ, nó sẽ không tạo ra bất kỳ sự khác biệt nào ngoại trừ việc dễ đọc. Ngoài ra, điều khoản HAVING là tốt nếu giải pháp của bạn cần nó. –

+0

Rob sử dụng chế độ xem thay vì truy vấn nặng, có thể giảm lưu lượng mạng vì máy khách của bạn sẽ gửi tới máy chủ chỉ các thủ tục được lưu trữ hoặc xem tên thay vì văn bản truy vấn lớn. Điều này có thể được sử dụng để tạo thuận lợi cho việc quản lý quyền cũng vì bạn có thể hạn chế quyền truy cập của người dùng vào các cột trong bảng mà họ không thấy. – RRUZ

+0

Ah - do đó, nhiều hơn dọc theo dòng "Không sử dụng truy vấn đặc biệt khi bạn có thể truy vấn một lượt xem hoặc sử dụng một proc được lưu trữ." Chắc chắn, rằng tôi đồng ý với ... –

1

Đảm bảo các bảng được kết hợp theo đúng thứ tự.

+0

Động cơ cơ sở dữ liệu không tự động thực hiện điều này ?! Tôi luôn nghĩ rằng họ sắp xếp lại các truy vấn trước khi thực hiện ... – Jim

+0

Vâng loại. Trong trường hợp của Sybase ASE, trình tối ưu hóa sẽ cố gắng chọn thứ tự kết hợp tối ưu dựa trên chi phí của truy vấn. Thông thường (nếu số liệu thống kê được cập nhật), nó sẽ tham gia đúng thứ tự. Nhưng tôi đã thấy nhiều trường hợp thứ tự tham gia không được phát hành chính xác. Ngoài ra, thứ tự bảng trong truy vấn có thể tạo sự khác biệt nếu bạn có một số lượng lớn các bảng, vì DBMS thường xem xét x số hoán vị bảng tại một thời điểm. Tôi luôn luôn cố gắng liệt kê các bảng của tôi theo thứ tự mà tôi muốn họ tham gia (cũng có ích nếu bạn cần phải ép buộc thứ tự tham gia). – Allethrin

2

1) Tôi đã chưa tìm thấy một tình huống mà

SELECT Field1, Field2, (SELECT Count(*) FROM tblLinked WHERE tblLinked.Field3 = tblSource.Field3) AS TheTotal 
FROM tblSource 

không được cải thiện bởi một LEFT JOIN vào một bảng có nguồn gốc.

SELECT Field1, Field2, IsNull(Linked.TheTotal,0) AS TheTotal 
FROM tblSource 
LEFT JOIN (SELECT Field3, Count(*) AS TheTotal 
    FROM tblLinked 
    GROUP BY Field3) AS Linked ON tblSource.Field3 = Linked.Field3 

2) Không sắp xếp kết quả trên máy chủ trừ khi ứng dụng tiêu thụ không thể thực hiện việc này. Điều này áp dụng ít thường xuyên hơn cho các ứng dụng web, nhưng đối với các ứng dụng dành cho máy tính để bàn, máy tính khách thường có nhiều nguồn điện sẵn có và có thể thực hiện một cách vui vẻ.

3) Sử dụng EXISTS thay vì kiểm tra Tổng số mục nhập phù hợp.

4) Không bị ám ảnh khi thực hiện truy vấn chỉ trong một mệnh đề SELECT. Việc sử dụng các biến bảng (và đôi khi các bảng tạm thời) một cách thận trọng có thể giảm một cách ồ ạt các hàng được xử lý.

+1

Re 1) ... cần được xử lý theo cùng một cách. Bạn đang sử dụng DBMS nào? –

+0

Máy chủ SQL. Các phép chọn chạy chậm hơn nhiều so với các truy vấn sử dụng các bảng dẫn xuất trong trải nghiệm của tôi. – MartW

8

Cho đến nay trở lên: Làm chỉ số bao gồm

Một chỉ số bao phủ bao gồm tất cả các cột truy vấn sẽ cần, do đó tránh được sự cần thiết phải làm tra cứu trên kết quả của một chỉ mục tìm kiếm. Điều này sau đó sẽ tránh cảm giác hệ thống giống như một lần quét có thể nhanh hơn (nhanh hơn rất nhiều so với chi phí tra cứu).

Nhưng cũng đáng nhắc đến:

Có chỉ mục cho phép hợp nhất tham gia. Tham gia MERGE có thể xảy ra khi tham gia hai bảng được sắp xếp theo các điều kiện tham gia. Nhưng tất nhiên, khi nói 'bảng', chúng tôi thực sự có nghĩa là 'chỉ mục', phải ...

Đồng thời - loại bỏ các chức năng vô hướng và sử dụng các hàm có giá trị thay thế ... vì chức năng vô hướng không thể đơn giản hóa .

Ngoài ra - đặt chỉ mục duy nhất trên cột mà bạn biết là duy nhất, cho phép trình tối ưu hóa truy vấn sử dụng kiến ​​thức này để thực hiện các lựa chọn tối ưu hóa tốt hơn. Cũng áp dụng cho các ràng buộc NOT NULL.

Đồng thời - sử dụng đối chiếu nhị phân khi so sánh các chuỗi trong trường hợp đã biết, sao cho hệ thống không phải xem xét các tùy chọn trường hợp khác nhau.

Dĩ nhiên tôi có thể đi vào tất cả các ngày ...

Rob

+0

Giá trị chỉ ra rằng điều chức năng vô hướng có thể là cục bộ cho SQL Server. Nhưng những người khác là trên hầu hết các hệ thống cơ sở dữ liệu. –

+0

Rob Tôi thấy blog của bạn, bạn có các bài viết tuyệt vời. ;) – RRUZ

+0

:) Cảm ơn RRUZ. Các chỉ mục bao gồm truy vấn chắc chắn đáng giá, vì chúng có thể làm cho các truy vấn chạy nhanh hơn hàng nghìn lần. –

1

Hai điều quan trọng nhất trong kinh nghiệm của tôi ít tham gia và truy vấn ít hơn. Ngoài những thứ có nhiều công cụ cụ thể DB, COUNT (*) tương đối chậm trên PgSQL, các lựa chọn con là con chó chậm trên MySQL, v.v.

0

Vài gợi ý: Sử dụng

delete from table where id>=1 and id<=3; 

thay vì

delete from table where id=1; 
delete from table where id=2; 
delete from table where id=3; 

Cũng sử dụng 'trong' thay vì 'OR' cú pháp

+0

làm thế nào về: xóa từ bảng nơi id giữa 1 và 3 - dường như bao giờ ngắn gọn hơn –

+0

Có, có thể, nhưng ý tưởng là: không sử dụng các truy vấn cycled. –

1

Các tối ưu hóa lớn nhất tôi sử dụng gần đây nơi khá đơn giản .

Giữ càng nhiều logic nghiệp vụ càng gần máy chủ sql càng tốt. Aka giữ cho bạn mã kinh doanh trên cùng một máy như máy chủ sql. Hãy để logic kinh doanh của bạn trả lại càng ít càng tốt mã trở lại cho khách hàng cuối cùng.

Giữ truy vấn SQL của bạn là 'ngắn nhất có thể' như Frost cho biết, sử dụng các câu lệnh cập nhật đơn trên nhiều câu lệnh.

Chỉ sử dụng các giao dịch khi bạn cần chúng

Tạo bảng tạm thời cho một phần tham gia để tăng tốc độ tham gia (không quên chỉ số họ)

1

Tôi đã đọc tất cả các câu trả lời và tôi không tìm thấy LIMIT và Các gợi ý sử dụng OFFSET. Nó được sử dụng rất phổ biến trong phân trang với các liên kết "prev" và "next". Nhưng việc hiển thị màn hình như vậy có thể tiêu thụ nhiều tài nguyên hơn so với toàn bộ phần còn lại của trang web. Khi bù trừ các mục số lớn, truy vấn có thể trở nên rất chậm. Vì vậy, tránh những truy vấn này.

  • Không tính tổng số mục.
  • Chỉ hiển thị các mục "n" số đầu tiên (ví dụ: chỉ có 100 mục hàng đầu).

Các phương pháp như vậy sử dụng Google, Twitter và các trang web khác. Trong tìm kiếm của Google, không có số kết quả chính xác. Chỉ có số gần đúng. Twitter không cho phép người dùng xem tất cả các tweet trước đây. Nó chỉ hiển thị số n cuối cùng (tôi không thể nhớ bao nhiêu).

Có một số link from MySQL performance blog.

3

Các khóa ngoại chỉ mục!

Có lẽ đây không phải là tối ưu hóa cú pháp truy vấn sql, nhưng tối ưu hóa bộ nhớ hơn. Nhưng tôi thấy nó lại xảy ra mọi lúc & một con thú cưng của nó.

2

Tối ưu hóa tốt nhất mà tôi từng sử dụng SQL là thực sự hiểu những gì cần thiết để thực hiện dữ liệu và REMOVE ton của SQL từ truy vấn.

Truy vấn nhanh nhất là truy vấn không cần phải chạy.

THỰC TẾ THINKY VỀ những gì bạn đang làm với dữ liệu. Bạn đang làm việc theo từng hàng? (sau đó sử dụng mã dựa trên thiết lập).

  • Bạn có thực sự cần tham gia tất cả các bảng đó không?

  • Có thể hai truy vấn nhỏ (đơn giản) thực hiện công việc tốt hơn và nhanh hơn một truy vấn lớn duy nhất?

  • Nếu bạn kết hợp hai truy vấn này thành một truy vấn, nó có thể chạy nhanh hơn không?

Cuối cùng, NHẬP KHẨU truy vấn của bạn (GIẢI THÍCH KẾ HOẠCH hoặc SQL PROFILER) và xem "IO được". Nói chung, bạn muốn giảm số lượng GET xuống một tỷ lệ, chẳng hạn như 10 cho mỗi hàng đầu ra.

0

Tránh sử dụng các chức năng tích hợp như hội tụ, chuỗi ký tự và như vậy trong Chế độ xem của bạn. Nếu bạn không thể đảm bảo rằng dữ liệu ở định dạng hợp lệ, hãy sử dụng các thủ tục được lưu trữ để chạy reguallary để 'dọn sạch' dữ liệu trong các bảng có liên quan của bạn.

này là khó chịu, nhưng nó giúp tiết kiệm thời gian xem tức là giữ cho người sử dụng hạnh phúc ... ^^

0

Đừng đặt những hạn chế nếu không cần thiết như khó khăn sẽ thêm một chỉ số, số lượng nhiều các chỉ số, càng có nhiều thời gian cần để chèn dữ liệu.

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