# Top Full-Scan Queries ## 1. Orders with all relations (no filters) Source: `packages/db_helper_sqlite/src/admin-apis/order.ts:441-499` — `getAllOrders()` ```sql select "id", "user_id", "address_id", "slot_id", "is_cod", "is_online_payment", "payment_info_id", "total_amount", "delivery_charge", "readable_id", "admin_notes", "user_notes", "order_group_id", "order_group_proportion", "is_flash_delivery", "created_at", (select json_array("id","name","email","mobile","created_at") from (select * from "users" where "users"."id" = "orders"."user_id" limit 1)) as "user", (select json_array("id","user_id","name","phone","address_line1","address_line2","city","state","pincode","is_default","latitude","longitude","google_maps_url","admin_latitude","admin_longitude","zone_id","created_at") from (select * from "addresses" where "addresses"."id" = "orders"."address_id" limit 1)) as "address", (select json_array("id","delivery_time","freeze_time","is_active","is_flash","is_capacity_full","delivery_sequence","group_ids") from (select * from "delivery_slot_info" where "delivery_slot_info"."id" = "orders"."slot_id" limit 1)) as "slot", (select coalesce(json_group_array(json_array("id","order_id","product_id","quantity","price","discounted_price","is_packaged","is_package_verified",(select json_array("id","name","short_description","long_description","unit_id","price","market_price","images","is_out_of_stock","is_suspended","is_flash_available","flash_price","created_at","increment_step","product_quantity","store_id",(select json_array("id","short_notation","full_name") from (select * from "units" where "units"."id" = "orders_orderItems_product"."unit_id" limit 1))) from (select * from "product_info" where "product_info"."id" = "orders_orderItems"."product_id" limit 1)))),json_array()) from "order_items" where "order_items"."order_id" = "orders"."id") as "orderItems", (select coalesce(json_group_array(json_array("id","order_time","user_id","order_id","is_packaged","is_delivered","is_cancelled","cancel_reason","is_cancelled_by_admin","payment_state","cancellation_user_notes","cancellation_admin_notes","cancellation_reviewed","cancellation_reviewed_at","refund_coupon_id")),json_array()) from "order_status" where "order_status"."order_id" = "orders"."id") as "orderStatus" from "orders" where "orders"."id" = "orders"."id" order by "orders"."created_at" desc limit ? ``` **Why it's bad**: `where "orders"."id" = "orders"."id"` is an always-true condition — it's a no-op placeholder. When no cursor/slot/filters are provided, this scans ALL orders with 6 levels of nested correlated subqueries, then filters out COD/pending payments in-memory after fetching everything. --- ## 2. Active slots (no date filter) Source: `packages/db_helper_sqlite/src/admin-apis/slots.ts:32-47` — `getActiveSlotsWithProducts()` ```sql select "id", "delivery_time", "freeze_time", "is_active", "is_flash", "is_capacity_full", "delivery_sequence", "group_ids", (select coalesce(json_group_array(json_array("product_id","slot_id",(select json_array("id","name","images") from (select * from "product_info" where "product_info"."id" = "deliverySlotInfo_productSlots"."product_id" limit 1)))),json_array()) from "product_slots" where "product_slots"."slot_id" = "deliverySlotInfo"."id") as "productSlots" from "delivery_slot_info" where "deliverySlotInfo"."is_active" = ? order by "deliverySlotInfo"."delivery_time" desc ``` **Why it's bad**: Only filters `is_active = true`, no `deliveryTime > now` check. Returns past expired slots. Correlated subquery per slot for products. --- ## 3. All slots with products for cache (deep JOINs on every slot) Source: `packages/db_helper_sqlite/src/stores/store-helpers.ts:236-258` — `getAllSlotsWithProductsForCache()` ```sql select "id", "delivery_time", "freeze_time", "is_active", "is_flash", "is_capacity_full", "delivery_sequence", "group_ids", (select coalesce(json_group_array(json_array("product_id","slot_id",(select json_array("id","name","short_description","long_description","unit_id","price","market_price","images","is_out_of_stock","is_suspended","is_flash_available","flash_price","created_at","increment_step","product_quantity","store_id",(select json_array("id","short_notation","full_name") from (select * from "units" where "units"."id" = "deliverySlotInfo_productSlots_product"."unit_id" limit 1)),(select json_array("id","name","description","image_url","created_at","owner") from (select * from "store_info" where "store_info"."id" = "deliverySlotInfo_productSlots_product"."store_id" limit 1))) from (select * from "product_info" where "product_info"."id" = "deliverySlotInfo_productSlots"."product_id" limit 1)))),json_array()) from "product_slots" where "product_slots"."slot_id" = "deliverySlotInfo"."id") as "productSlots" from "delivery_slot_info" where ("deliverySlotInfo"."is_active" = ? and "deliverySlotInfo"."delivery_time" > ?) order by "deliverySlotInfo"."delivery_time" asc ``` **Why it's bad**: Called on every slot lookup (`getSlotById`, `getProductSlots`, `getAllProductsSlots`, `getMultipleProductsSlots`) in `slot-store.ts`. Despite filtering for future active slots, it loads ALL of them with deep nested subqueries (product → unit + store) per product per slot, even when only one slot's data is needed. --- ## 4. Vendor orders (no WHERE at all) Source: `packages/db_helper_sqlite/src/admin-apis/vendor-snippets.ts:171-187` — `getVendorOrders()` ```sql select ... from "orders" left join "users" ... left join "order_items" ... left join "product_info" ... left join "units" ... order by "orders"."created_at" desc ``` **Why it's bad**: Absolutely no WHERE clause. Fetches every single order with deep JOINs on every call. --- ## 5. Product availability (reads ALL products) Source: `packages/db_helper_sqlite/src/user-apis/slots.ts:29-46` — `getProductAvailability()` ```sql select "id", "name", "is_out_of_stock", "is_flash_available" from "product_info" where "product_info"."is_suspended" = ? ``` **Why it's bad**: Called on every `getSlotsWithProducts` page load. Reads every non-suspended product even though only products in active slots are relevant. --- ## 6. searchUsers (no search = all users, no limit) Source: `packages/db_helper_sqlite/src/admin-apis/user.ts:197-216` — `searchUsers()` ```sql select "id", "name", "mobile" from "users" -- no WHERE, no LIMIT ``` **Why it's bad**: When called without a search term, returns the entire `users` table with no limit. --- ## 7. All cache initialization helpers Source: `packages/db_helper_sqlite/src/stores/store-helpers.ts` | Function | Line | Query | |----------|------|-------| | `getAllProductsForCache` | :86 | `select ... from product_info inner join units` — no WHERE | | `getAllStoresForCache` | :115 | `select ... from store_info` — no WHERE | | `getAllProductTagsForCache` | :159 | `select ... from product_tags inner join product_tag_info` — no WHERE | | `getAllTagsForCache` | :187 | `select ... from product_tag_info` — no WHERE | | `getAllTagProductMappings` | :200 | `select ... from product_tags` — no WHERE | | `getAllUserNegativityScores` | :269 | `select ... from user_incidents group by user_id` — no WHERE | **Why it's bad**: Individually these are meant for cache warming, but they're also called on every cache read miss in `product-store.ts`, doing 5 full table scans per product detail page view.