У меня есть большой запрос с несколькими СОЕДИНЕНИЯМИ, и я просматриваю этот запрос.
Если я заказываю запрос по dis.id (есть индекс), это занимает полсекунды.
Однако, если я закажу в представлении, это займет около 20 секунд. Я предполагаю, что postgres выполняет запрос, а затем упорядочивает и ограничивает, поэтому это занимает так много времени.
Это отчет, поэтому его можно отсортировать по другому полю или можно изменить с AS C на DES C.
Могу ли я использовать представление, упорядочивать в представлении без потери производительности?
Вид:
SELECT
id_cm, modelo_cm, descripcion_estado_cm, hfc_cm, usb_cm,
mta_cm, eth_cm, serial_cm, id_cli, denominacion_cli,
direccion_cli, descripcion_estado_efectivo_ser
FROM
plg_1000_cm_listado_cms_clientes
LIMIT 50
Запрос представления plg_1000_cm_listado_cms_clientes
:
SELECT
dis.id AS id_cm,
(mar.nombre::text || ' '::text) || mod.descripcion::text AS modelo_cm,
dis.estado AS estado_cm, est.descripcion AS descripcion_estado_cm,
ded.valor AS hfc_cm,
(SELECT tec_dispositivos_etiquetas_dispositivos.valor
FROM tec_dispositivos_etiquetas_dispositivos
WHERE tec_dispositivos_etiquetas_dispositivos.id_dispositivo = dis.id
AND tec_dispositivos_etiquetas_dispositivos.id_etiqueta = 1003) AS usb_cm,
(SELECT tec_dispositivos_etiquetas_dispositivos.valor
FROM tec_dispositivos_etiquetas_dispositivos
WHERE tec_dispositivos_etiquetas_dispositivos.id_dispositivo = dis.id
AND tec_dispositivos_etiquetas_dispositivos.id_etiqueta = 1004) AS mta_cm,
(SELECT tec_dispositivos_etiquetas_dispositivos.valor
FROM tec_dispositivos_etiquetas_dispositivos
WHERE tec_dispositivos_etiquetas_dispositivos.id_dispositivo = dis.id
AND tec_dispositivos_etiquetas_dispositivos.id_etiqueta = 1005) AS eth_cm,
(SELECT tec_dispositivos_etiquetas_dispositivos.valor
FROM tec_dispositivos_etiquetas_dispositivos
WHERE tec_dispositivos_etiquetas_dispositivos.id_dispositivo = dis.id
AND tec_dispositivos_etiquetas_dispositivos.id_etiqueta = 1001) AS serial_cm,
cli.id AS id_cli, cli.denominacion AS denominacion_cli,
cli.responsable AS responsable_cli, lc.calle AS calle_cli,
lc.numero AS numero_cli, domicilio_locacion(lc.id) AS direccion_cli,
lcp.estado AS estado_pack, lcps.estado AS estado_ser,
estado_servicio(lcps.id) AS estado_efectivo_ser,
est1.descripcion AS descripcion_estado_efectivo_ser
FROM
tec_modelos mod
JOIN
tec_marcas mar ON mar.id = mod.id_marca
JOIN
tec_dispositivos dis ON dis.id_modelo = mod.id
JOIN
lang_sys_estados est ON est.id_tipo_estado = 3
AND est.id_estado = dis.estado
AND est.id_idioma = valor_variable_de_session('id_idioma'::text, '1'::text)::integer
JOIN
tec_dispositivos_etiquetas_dispositivos ded ON ded.id_dispositivo = dis.id AND ded.id_etiqueta = 1002
LEFT JOIN
svc_servicios_propiedades sp ON sp.valor = dis.id::text AND sp.id_propiedad = 1003
LEFT JOIN
com_locaciones_clientes_packs_servicios lcps ON lcps.id = sp.id_locacion_cliente_pack_servicio
LEFT JOIN
com_locaciones_clientes_packs lcp ON lcp.id = lcps.id_locacion_cliente_pack
JOIN
lang_sys_estados est1 ON est1.id_tipo_estado = 1
AND est1.id_estado = estado_servicio(lcps.id)
AND est1.id_idioma = valor_variable_de_session('id_idioma'::text, '1'::text)::integer
LEFT JOIN
com_locaciones_clientes lc ON lc.id = lcp.id_locacion_cliente
LEFT JOIN
com_clientes cli ON cli.id = lc.id_cliente
WHERE
mod.id_tipo_dispositivo = 1000;