Possible n+1 queries in dcim-api:interface-list #9035

Closed
opened 2025-12-29 20:44:27 +01:00 by adam · 1 comment
Owner

Originally created by @doc-sheet on GitHub (Jan 3, 2024).

Deployment Type

Self-hosted

NetBox Version

v.3.6.9

Python Version

3.10

Steps to Reproduce

Load /api/dcim/interfaces/ with pynetbox.

Expected Behavior

Probably one big select ¯\_(ツ)_/¯

Observed Behavior

Sentry profiling tool reports there is a (potential?) n+1 query problem in

  • dcim-api:interface-list
  • dcim-api:device-list
  • ipam-api:ipaddress-list

viewsets and suggest this links to get the details:

As far as I understand some Views spawn multiple subqueries in attempts to get full list of interfaces, devices, etc.

Initial query
SELECT COUNT(*) AS __count
FROM dcim_interface
WHERE dcim_interface.id IN
    (SELECT dcim_interface.id
     FROM dcim_interface)
Followed by
SELECT dcim_interface.id, dcim_interface.created, dcim_interface.last_updated,
       dcim_interface.custom_field_data, dcim_interface.device_id, dcim_interface.name,
       dcim_interface.label, dcim_interface.description, dcim_interface.module_id,
       dcim_interface.cable_id, dcim_interface.cable_end, dcim_interface.mark_connected,
       dcim_interface._path_id, dcim_interface.enabled, dcim_interface.mac_address,
       dcim_interface.mtu, dcim_interface.mode, dcim_interface.parent_id,
       dcim_interface.bridge_id, dcim_interface._name, dcim_interface.lag_id,
       dcim_interface.type, dcim_interface.mgmt_only, dcim_interface.speed,
       dcim_interface.duplex, dcim_interface.wwn, dcim_interface.rf_role,
       dcim_interface.rf_channel, dcim_interface.rf_channel_frequency,
       dcim_interface.rf_channel_width, dcim_interface.tx_power, dcim_interface.poe_mode,
       dcim_interface.poe_type, dcim_interface.wireless_link_id, dcim_interface.untagged_vlan_id,
       dcim_interface.vrf_id
FROM dcim_interface
INNER JOIN dcim_device ON (dcim_interface.device_id = dcim_device.id)
WHERE dcim_interface.id IN
    (SELECT dcim_interface.id
     FROM dcim_interface)
ORDER BY dcim_device._name ASC, dcim_device.id ASC, (dcim_interface._name) COLLATE C ASC
LIMIT 500

<...>

Followed by lots of
SELECT dcim_device.id, dcim_device.created, dcim_device.last_updated,
       dcim_device.custom_field_data, dcim_device.description, dcim_device.comments,
       dcim_device.local_context_data, dcim_device.config_template_id, dcim_device.device_type_id,
       dcim_device.role_id, dcim_device.tenant_id, dcim_device.platform_id,
       dcim_device.name, dcim_device._name, dcim_device.serial, dcim_device.asset_tag,
       dcim_device.site_id, dcim_device.location_id, dcim_device.rack_id,
       dcim_device.position, dcim_device.face, dcim_device.status, dcim_device.airflow,
       dcim_device.primary_ip4_id, dcim_device.primary_ip6_id, dcim_device.oob_ip_id,
       dcim_device.cluster_id, dcim_device.virtual_chassis_id, dcim_device.vc_position,
       dcim_device.vc_priority, dcim_device.latitude, dcim_device.longitude,
       dcim_device.console_port_count, dcim_device.console_server_port_count,
       dcim_device.power_port_count, dcim_device.power_outlet_count, dcim_device.interface_count,
       dcim_device.front_port_count, dcim_device.rear_port_count, dcim_device.device_bay_count,
       dcim_device.module_bay_count, dcim_device.inventory_item_count
FROM dcim_device
WHERE dcim_device.id = %s
LIMIT 21
Originally created by @doc-sheet on GitHub (Jan 3, 2024). ### Deployment Type Self-hosted ### NetBox Version v.3.6.9 ### Python Version 3.10 ### Steps to Reproduce Load /api/dcim/interfaces/ with pynetbox. ### Expected Behavior Probably one big select ¯\\\_(ツ)\_/¯ ### Observed Behavior Sentry profiling tool reports there is a (potential?) n+1 query problem in * `dcim-api:interface-list` * `dcim-api:device-list` * `ipam-api:ipaddress-list` viewsets and suggest this links to get the details: * https://docs.sentry.io/product/issues/issue-details/performance-issues/n-one-queries/ * https://blog.sentry.io/finding-and-fixing-django-n-1-problems/ As far as I understand some Views spawn multiple subqueries in attempts to get full list of interfaces, devices, etc. <details> <summary>Initial query</summary> ```sql SELECT COUNT(*) AS __count FROM dcim_interface WHERE dcim_interface.id IN (SELECT dcim_interface.id FROM dcim_interface) ``` </details> <details> <summary>Followed by</summary> ```sql SELECT dcim_interface.id, dcim_interface.created, dcim_interface.last_updated, dcim_interface.custom_field_data, dcim_interface.device_id, dcim_interface.name, dcim_interface.label, dcim_interface.description, dcim_interface.module_id, dcim_interface.cable_id, dcim_interface.cable_end, dcim_interface.mark_connected, dcim_interface._path_id, dcim_interface.enabled, dcim_interface.mac_address, dcim_interface.mtu, dcim_interface.mode, dcim_interface.parent_id, dcim_interface.bridge_id, dcim_interface._name, dcim_interface.lag_id, dcim_interface.type, dcim_interface.mgmt_only, dcim_interface.speed, dcim_interface.duplex, dcim_interface.wwn, dcim_interface.rf_role, dcim_interface.rf_channel, dcim_interface.rf_channel_frequency, dcim_interface.rf_channel_width, dcim_interface.tx_power, dcim_interface.poe_mode, dcim_interface.poe_type, dcim_interface.wireless_link_id, dcim_interface.untagged_vlan_id, dcim_interface.vrf_id FROM dcim_interface INNER JOIN dcim_device ON (dcim_interface.device_id = dcim_device.id) WHERE dcim_interface.id IN (SELECT dcim_interface.id FROM dcim_interface) ORDER BY dcim_device._name ASC, dcim_device.id ASC, (dcim_interface._name) COLLATE C ASC LIMIT 500 ``` </details> <...> <details> <summary>Followed by lots of</summary> ```sql SELECT dcim_device.id, dcim_device.created, dcim_device.last_updated, dcim_device.custom_field_data, dcim_device.description, dcim_device.comments, dcim_device.local_context_data, dcim_device.config_template_id, dcim_device.device_type_id, dcim_device.role_id, dcim_device.tenant_id, dcim_device.platform_id, dcim_device.name, dcim_device._name, dcim_device.serial, dcim_device.asset_tag, dcim_device.site_id, dcim_device.location_id, dcim_device.rack_id, dcim_device.position, dcim_device.face, dcim_device.status, dcim_device.airflow, dcim_device.primary_ip4_id, dcim_device.primary_ip6_id, dcim_device.oob_ip_id, dcim_device.cluster_id, dcim_device.virtual_chassis_id, dcim_device.vc_position, dcim_device.vc_priority, dcim_device.latitude, dcim_device.longitude, dcim_device.console_port_count, dcim_device.console_server_port_count, dcim_device.power_port_count, dcim_device.power_outlet_count, dcim_device.interface_count, dcim_device.front_port_count, dcim_device.rear_port_count, dcim_device.device_bay_count, dcim_device.module_bay_count, dcim_device.inventory_item_count FROM dcim_device WHERE dcim_device.id = %s LIMIT 21 ``` </details>
adam closed this issue 2025-12-29 20:44:27 +01:00
Author
Owner

@jeremystretch commented on GitHub (Jan 3, 2024):

This not an actionable bug report. It is normal and expected for one API request to generate multiple SQL queries.

@jeremystretch commented on GitHub (Jan 3, 2024): This not an actionable bug report. It is normal and expected for one API request to generate multiple SQL queries.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/netbox#9035