Порядок просмотра (запроса) по VS View (порядок запроса) - PullRequest
0 голосов
/ 01 августа 2020

У меня есть большой запрос с несколькими СОЕДИНЕНИЯМИ, и я просматриваю этот запрос.

Если я заказываю запрос по 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...