thắc mắc Cách tối ưu query cho query sql?

Nếu muốn làm triệt để hài hòa cả performance lẫn clean code thì câu query mẫu có thể có input là list các field muốn query, mỗi feature nào cần dùng sẽ tự truyền các field mình muốn lấy, vẫn thỏa điều kiện phần code build query gốc không thay đổi :big_smile:
 
Nếu muốn làm triệt để hài hòa cả performance lẫn clean code thì câu query mẫu có thể có input là list các field muốn query, mỗi feature nào cần dùng sẽ tự truyền các field mình muốn lấy, vẫn thỏa điều kiện phần code build query gốc không thay đổi :big_smile:
pls don't, it's another bad coding practice :big_smile:
 
Mình lại ủng hộ select * vì có thể tái sử dụng câu sql này cho nhiều api cần các field khác nhau, mỗi api sẽ tự transform để lấy 1 số field nó cần, và câu sql gốc không cần chỉnh sửa, thêm bớt field :big_smile: Mình nghĩ đó mới là clean code :boss:
Đó là lười biếng không phải là cleancode :)))), cleancode dễ đọc và dễ maintain cái select * chả được đạt cái nào ỏ trong cái đó cả. Thậm chí bác chẳng biết lấy chính lý luận của Uncle Bob, là small code của ổng để lý luận thì có lẽ bác chả biết tí gì về cleancode r
 
Nếu muốn làm triệt để hài hòa cả performance lẫn clean code thì câu query mẫu có thể có input là list các field muốn query, mỗi feature nào cần dùng sẽ tự truyền các field mình muốn lấy, vẫn thỏa điều kiện phần code build query gốc không thay đổi :big_smile:
Nếu thế thì tha viết raw query còn tốt hơn, còn phải thêm where, order ... nữa mà.
 
thực ra dùng ORM thì làm gì có cơ hội nó sinh ra câu query 'select *' mà lo
V3so9BC.png
 
Mình cũng khá mù mờ về vụ này, vậy các thím giải quyết như thế nào nhỉ :big_smile: Mỗi use case sẽ viết lại 1 câu query mới nhỉ?
 
Nếu muốn làm triệt để hài hòa cả performance lẫn clean code thì câu query mẫu có thể có input là list các field muốn query, mỗi feature nào cần dùng sẽ tự truyền các field mình muốn lấy, vẫn thỏa điều kiện phần code build query gốc không thay đổi :big_smile:

Nếu thế thì tha viết raw query còn tốt hơn, còn phải thêm where, order ... nữa mà.
Nếu app code mà được tuỳ biến fields trong query đến DB thì quá nhiều rủi ro về security như SQL injection, expose những field cần bảo mật vì tôi đoán để dựng lại query với input fields thím sẽ dùng CONCAT. Thím hãy coi DB là 1 service như các service bình thường khác, data whitelisting chứ không phải blacklisting.

Nhưng vấn đề lớn hơn sẽ là performance. Không biết các RDBMS khác thế nào, nhưng với MySQL hoặc MariaDB, nếu các fields là variable thì câu query sẽ không được lên execution plan và optimize, index bị bỏ qua và worst case sẽ là full table scan.

Mình cũng khá mù mờ về vụ này, vậy các thím giải quyết như thế nào nhỉ :big_smile: Mỗi use case sẽ viết lại 1 câu query mới nhỉ?
Trong API, nói chung mỗi method nên dùng 1 query riêng. Thím có thể xem xét dùng chung query cho các version khác nhau của cùng 1 method và các version phải backward compatible
 
Confirm. Từng maintain một dự án mà phần code chỉ là 1 layer mỏng. Có bao nhiêu business logic tụi nó nhét dưới sp hết. Mỗi lần đọc hiểu logic khóc tiếng mán luôn, chưa nói đến việc sửa.
Nói mới nhớ, cách đây mấy năm tôi đã phải maintain 1 con stored procedure khoảng 1500 lines. Sau quyết định đập đi hết, chuyển logic vào java code.
 
Mình cũng chỉ toàn dùng ORM Entity framework Code first. Giờ EF6 mới ra nghe nói cải thiện hơn 90% performance so với EF5 nên chắc sau này cũng ít cơ hội đụng tới mấy món SQL, SP... này.
 
Mình cũng chỉ toàn dùng ORM Entity framework Code first. Giờ EF6 mới ra nghe nói cải thiện hơn 90% performance so với EF5 nên chắc sau này cũng ít cơ hội đụng tới mấy món SQL, SP... này.
CodeFirst chỉ áp dụng cho C# thôi hả bạn. Có áp dụng cho NodeJs, PHP, Java được không ạ.
 
Với kinh nghiệm và kiến thức của em thì khi gặp vấn đề performance sql query em sẽ xử lý như sau:

  • thường phổ biến nhất là dùng index
  • nolock
  • với mấy cái rule khi viết sql như tránh select *, tránh union, tránh nested select
  • hoặc dùng store procedure nếu query đó chạy nhiều lần

Mấy thím có solution nào khác chỉ giúp em với?
  • Index => OK, nhưng nhớ xài execution plan để biết cái j cần index
  • NoLock => Có chắc là bạn cần nolock không. Nếu chấp nhận dirty data thì xài NoLock.
  • Tránh viết câu phức tạp. Tốt nhất là xài Execution Plan để biết cái phần nào của query tốn nhiều cost.
  • SP sẽ khó maintain.
  • Nên Xài Limit
  • Xài Partition (Partition theo zone hoặc theo datetime)
 
Last edited:
Mình cũng chỉ toàn dùng ORM Entity framework Code first. Giờ EF6 mới ra nghe nói cải thiện hơn 90% performance so với EF5 nên chắc sau này cũng ít cơ hội đụng tới mấy món SQL, SP... này.
Bình thường với ORM, thím check performance như thế nào? Tìm câu query do framework generate ra trong log rồi chạy thử manually à?
 
Bình thường với ORM, thím check performance như thế nào? Tìm câu query do framework generate ra trong log rồi chạy thử manually à?
Em chỉ làm mấy hệ thống nhỏ và không đòi hỏi cao nên chưa check performance kỹ bao giờ bác à. Em test ở localhost nếu response của API trả về < 300 ms là đối với em nó ok rồi :D
 
Em chỉ làm mấy hệ thống nhỏ và không đòi hỏi cao nên chưa check performance kỹ bao giờ bác à. Em test ở localhost nếu response của API trả về < 300 ms là đối với em nó ok rồi :D
Nên làm stress test để tìm bottleneck.
 
Em chỉ làm mấy hệ thống nhỏ và không đòi hỏi cao nên chưa check performance kỹ bao giờ bác à. Em test ở localhost nếu response của API trả về < 300 ms là đối với em nó ok rồi :D
Nói thím đừng buồn chứ test và optimize DB perf trên localhost, data không đủ lớn mà lại gọi qua API thì gần như là vô nghĩa.

Trước tôi có maintain 1 dự án doctrine 1 thời gian, phải tìm câu query trong log rồi chạy manually trên DB để xem perf như thế nào, đặt index ở đâu cho hợp lý.
 
Back
Top