Skip to content

⚡ Optimize OrderController N+1 Query#2

Closed
sayuru-akash wants to merge 1 commit intomainfrom
performance/optimize-order-controller-n-plus-one-5844958393419955840
Closed

⚡ Optimize OrderController N+1 Query#2
sayuru-akash wants to merge 1 commit intomainfrom
performance/optimize-order-controller-n-plus-one-5844958393419955840

Conversation

@sayuru-akash
Copy link
Copy Markdown
Member

Refactored OrderController::update to eliminate N+1 query issue when processing order items.

💡 What

  • Collected all product_variant_ids from request items.
  • Eager loaded ProductVariant with product relationship in a single query using whereIn.
  • Replaced the loop's find() call with a lookup from the pre-loaded collection.

🎯 Why

  • The previous implementation executed ProductVariant::with('product')->find($id) for each item in the loop.
  • For 10 items, this resulted in ~40 additional queries (20 fetches + overhead).
  • This caused performance degradation as the number of items increased.

📊 Measured Improvement

  • Baseline: 66 queries (for an order with 10 items).
  • Optimized: 39 queries.
  • Reduction: 27 queries (~41% reduction).
  • Verified correctness of stock decrement and order processing via new feature test tests/Feature/OrderUpdatePerformanceTest.php.

PR created automatically by Jules for task 5844958393419955840 started by @sayuru-akash

- Replaced loop-based `find()` with batch `whereIn()` fetch.
- Eager loaded `product` relationship.
- Reduced DB queries for order update with 10 items from 66 to 39.
- Added performance regression test `tests/Feature/OrderUpdatePerformanceTest.php`.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
@google-labs-jules
Copy link
Copy Markdown

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 35911a3cf8

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


// 3. Measure Queries
DB::flushQueryLog();
DB::enableQueryLog();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Disable query logging after performance assertion

DB::enableQueryLog() is turned on for this test but never turned off, so the same connection can keep logging queries for later tests in the same PHPUnit process. That can silently accumulate large query logs in memory and slow or destabilize unrelated tests; this test should disable logging after reading DB::getQueryLog() (or use a scoped listener) to avoid cross-test side effects.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant