2012-11-29 29 views
5

Tôi đã có khái niệm rằng việc gọi truy vấn truy vấn nhanh hơn truy vấn từ cơ sở dữ liệu, vì sự chậm lại trong giao tiếp giữa cf và db. Điều này có đúng không.CF - QoQ vs Truy vấn

Điều đó có nghĩa là QoQ trong vòng lặp có thể chấp nhận được hay không, trong khi truy vấn trong vòng lặp thì không.

Trả lời

13

DBMS đầy đủ được tối ưu hóa cao để xử lý các truy vấn [được viết thích hợp], và trên mạng hiện đại, chi phí sẽ không lớn.

QoQ được thực hiện bằng cơ sở dữ liệu được nhúng, có thể hoặc không được tối ưu hóa tốt, tùy thuộc vào loại truy vấn đang được thực hiện.

Vì vậy, nếu cơ sở dữ liệu nằm trên một máy khác, trên một mạng chậm, QoQ có thể ít chậm hơn trong một số trường hợp. Nếu bạn đang nhấn cơ sở dữ liệu, bạn lý tưởng muốn mọi thứ được xử lý một cách thích hợp ở đó, trong một yêu cầu và tránh cả hai chuyến đi khứ hồi và xử lý lại trong một vòng lặp.

Tất nhiên, lợi ích lớn của QoQ là bạn có thể sử dụng nó để xử lý dữ liệu không đến từ cơ sở dữ liệu - chẳng hạn như kết quả của cfdirectory hoặc tệp CSV đã được chuyển đổi thành truy vấn.


ColdFusion thực hiện QoQ bằng cách phân tích cú pháp SQL theo cách thủ công và sau đó lặp qua bản ghi. Điều này làm cho nó hiệu quả đối với các phép toán đơn giản, chẳng hạn như nối hai bàn với các khóa khớp, nhưng ít hiệu quả hơn cho các kết hợp phức tạp (khi kết hợp sử dụng nhiều cột và/hoặc không phải là so sánh thẳng a = b). (Brief info here.)

Sử dụng đường sắt H2. H2 tuyên bố sẽ nhanh chóng, và trang web của họ cung cấp một số speed comparisons cho thấy nó nhanh hơn Derby và MySQL - nhưng tất nhiên tốt nhất là nên tìm các thử nghiệm độc lập của bên thứ ba, chưa kể rằng các thử nghiệm này không đảm bảo hiệu suất QoQ (mà tôi nghi ngờ wont có chỉ mục, ví dụ).


Nói chung: không thực hiện bất kỳ quyết định khó khăn mà không làm hiệu suất thử nghiệm để xác định rằng bạn thực sự cần phải cải thiện hiệu suất, và để có thể khách quan xác định phương pháp thực sự là nhanh hơn.

+0

Derby không được sử dụng trong các tính năng QoQ của ACF. Derby được bao gồm với nó cho việc dễ dàng truy cập vào một cơ sở dữ liệu trên không thấp. QoQ của ACF sử dụng một cái gì đó giống như phân tích cú pháp SQL thủ công và lặp lại để thay đổi các tập bản ghi. –

+2

Eww. :/Có thêm thông tin nào về việc bạn có thể chỉ ra, vì vậy tôi có thể cập nhật câu trả lời cho phù hợp không? –

+0

Tôi không có bất kỳ tài nguyên bên ngoài, ngoài các cuộc hội thoại tôi đã có với nhân viên Adobe và nhiều năm kinh nghiệm: P –

3

Tôi nhận thấy rằng việc sử dụng q OF q có thể nhanh hơn so với việc kéo DB từ truy vấn.

Ví dụ: tôi tôn trọng sử dụng QoQ trên báo cáo bán hàng. Tôi có một báo cáo bán hàng sẽ được kéo trong phạm vi ngày quý 1, có thể hiển thị số liệu Bán hàng theo đại lý bán hàng và cũng có thể hiển thị số liệu bán hàng theo sản phẩm đã bán.

Trong DB của tôi, các bảng/trường giống nhau sẽ được sử dụng cho cả hai phần sẽ xuất hiện trên cùng một báo cáo.

Tôi truy vấn bảng chính cho dữ liệu của mình dựa trên phạm vi ngày và sau đó tôi truy vấn các kết quả đó để xây dựng từng phần trong báo cáo của tôi.

Tôi thấy phương pháp này nhanh hơn trên cả hai máy chủ với DB cục bộ và từ xa.

+1

Bạn đã xem DBA về cơ sở dữ liệu và truy vấn của mình chưa? Báo cáo bán hàng hàng quý có khả năng có nhiều dữ liệu và là thứ mà DBMS có thể được tối ưu hóa. –

+0

Tôi đã có kết quả tương tự. Đôi khi cơ sở dữ liệu chậm vì bất kỳ lý do nào. Đôi khi bạn muốn tham gia hoặc kết hợp các truy vấn của mình trong CF. Đôi khi QoQ là cách nhanh hơn. Cảm ơn Steve. –

4

Tùy thuộc vào khả năng của máy Coldfusion của bạn so với máy chủ cơ sở dữ liệu của bạn và vấn đề bạn đang cố giải quyết.

QofQ nói chung sẽ rất nhanh đối với các tập dữ liệu nhỏ vì tất cả đều xảy ra trong bộ nhớ máy chủ của bạn.Nếu bạn cố gắng sử dụng QofQ trên một tập dữ liệu lớn, máy chủ của bạn sẽ bắt đầu gặp sự cố do phí tổn liên quan đến việc lưu giữ và xử lý dữ liệu đó trong bộ nhớ.

Truy vấn cơ sở dữ liệu thường sẽ hoạt động tốt hơn QofQ trên tập dữ liệu lớn vì đó là những gì chúng được thiết kế cho. Cơ sở dữ liệu rất giỏi trong việc xử lý số lượng lớn dữ liệu rất nhanh. Sử dụng chúng cho điều đó.

Nếu bạn đang xem xét truy xuất tập hợp kết quả lớn từ cơ sở dữ liệu và phân tích cú pháp bằng QofQ, đó có thể là cách sai để thực hiện. Thay vào đó, làm cho cơ sở dữ liệu giảm kết quả cho bạn. Nếu bạn yêu cầu máy chủ cơ sở dữ liệu cho thông tin này thường xuyên, hãy lưu nó vào máy chủ của bạn.

Hãy nhớ rằng đây là tất cả chủ quan và sẽ phụ thuộc rất nhiều vào vấn đề, tải, cơ sở dữ liệu và khả năng máy chủ cụ thể của bạn.

3

lần sử dụng QofQ

  • Khi bạn có hai datasources và vì những lý do khác nhau mà bạn có thể sử dụng các máy chủ liên kết
  • Khi dữ liệu được lấy qua WDDX hoặc JSON và bạn phải làm một tham gia
  • Khi thực tế lưu trữ dữ liệu trong truy vấn được lưu trong bộ nhớ cache và thực hiện QofQ dựa trên truy vấn được lưu trong bộ nhớ cache
  • Khi bạn phải tham gia kết quả của danh mụcList() trên cơ sở dữ liệu

lần không sử dụng QofQ

  • Khi bạn có thể tải dữ liệu vào một struct thay vì
  • Khi làm làm một số lượng lớn các lần lặp
  • Khi một trong những bộ nguồn dữ liệu là rất lớn
  • Khi bạn cần làm một trái, phải, hoặc bên ngoài tham gia

để biết thêm chi tiết, xem

http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec0e4fd-7ff0.html

này là dành cho CF 9 nhưng QofQ đã về cùng một từ CF 6

+0

ah có, tôi đã bỏ bê đề cập đến rằng Q của tôi là sử dụng một tham gia, mà không đóng một vai trò lớn – Daniel

+0

Bạn có thể làm tham gia bên trong –

+0

Danh sách tuyệt vời, cũng đã nêu! –

0

Dude! Chỉ cần sử dụng cachedwithin.

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