我有需要优化的vw_pharmacy_contracts视图中的查询:
DROP VIEW IF EXISTS vw_pharmacy_contracts_per_period;
CREATE VIEW vw_pharmacy_contracts_per_period AS
SELECT
inn_prod.pharmacy_inn,
inn_prod.period_id,
SUM(CASE WHEN marketing_contract_types_id = 1 THEN 1 ELSE 0 END) AS zentiva_marketing_count,
SUM(CASE WHEN marketing_contract_types_id = 2 THEN 1 ELSE 0 END) AS direct_marketing_count,
SUM(CASE WHEN marketing_contract_types_id = 3 THEN 1 ELSE 0 END) AS rx_marketing_count,
SUM(CASE WHEN marketing_contract_types_id = 4 THEN 1 ELSE 0 END) AS diabetes_marketing_count,
CAST(GROUP_CONCAT(DISTINCT inn_prod.marketing_contract_types_id SEPARATOR ',') AS CHAR (63) CHARSET UTF8) AS marketing_contract_types,
CAST(GROUP_CONCAT(DISTINCT marketing_contracts.type_name SEPARATOR ',') AS CHAR (255) CHARSET UTF8) AS marketing_contract_types_name
FROM inn_to_marketing_products inn_prod
LEFT JOIN marketing_contract_types marketing_contracts ON (inn_prod.marketing_contract_types_id = marketing_contracts.id)
group by inn_prod.pharmacy_inn, inn_prod.period_id;
DROP VIEW IF EXISTS vw_pharmacy_contracts;
CREATE VIEW vw_pharmacy_contracts AS
SELECT pharma_state.period_id, pharma_state.pharmacy_id, pharma.inn,
case when cnt.zentiva_marketing_count > 0 then true else false end as zentiva_marketing,
case when cnt.direct_marketing_count > 0 then true else false end as direct_marketing,
case when cnt.rx_marketing_count > 0 then true else false end as rx_marketing,
case when cnt.diabetes_marketing_count > 0 then true else false end as diabetes_marketing,
case when (cnt.marketing_contract_types IS NOT NULL) then true else false end as has_contract,
cnt.marketing_contract_types AS marketing_contract_types,
cnt.marketing_contract_types_name AS marketing_contract_types_name
FROM pharmacy_state pharma_state
left join pharmacy pharma on pharma.id = pharma_state.pharmacy_id
left join vw_pharmacy_contracts_per_period cnt on cnt.pharmacy_inn = pharma.inn and cnt.period_id = pharma_state.period_id;
explain from vw_pharmacy_contracts
explain from vw_pharmacy_contracts_per_period
以下是vw_pharmacy_contracts]的回复:>:responce。查询的持续时间约为21-23秒。我需要加快这些视图之一的速度。如果有人帮助,我会很高兴。
我有需要优化的来自vw_pharmacy_contracts视图的查询:如果存在vw_pharmacy_contracts_per_period,请删除视图;创建视图vw_pharmacy_contracts_per_period AS SELECT inn_prod ....
我怀疑vw_pharmacy_contracts_per_period
正在不断地计算数据。也就是说,每次使用它时,它都会扫描所有数据并得出相同的结果。同时,这需要很短的时间。