以下是我的情况:
我的问题是:
应用继承优化查询是否可行/有益?我可以有一个视图,它是对我所有4个主要查询所依赖的2-3个公共表的查询,然后有4个较小的查询只应用它们唯一的额外表格和条件?
优点:
缺点:
以下是两个类似查询的示例:
SELECT
SUM(visitor_cart_items.quantity * (TRIM(REPLACE(visitor_cart_items.price, '$', '')) + 0.0))
FROM
(SELECT DISTINCT
visitor_cart_items.id,
visitor_cart_items.price,
visitor_cart_items.quantity
FROM
messages_sent
JOIN session_guid ON session_guid.visitor_forms_id = messages_sent.visitor_forms_id
JOIN session_guid sessions ON sessions.session_guid = session_guid.session_guid
JOIN visitor_cart_items ON visitor_cart_items.cart_id = sessions.visitor_forms_id
WHERE
sessions.status_type_id = 1
AND sessions.website_id = 7
AND messages_sent.status_id = 1
AND sessions.updated_timestamp BETWEEN '2015-05-01' AND '2015-05-08') visitor_cart_items;
和
SELECT
COUNT(DISTINCT sessions.visitor_forms_id) all_saves
FROM
messages_sent
JOIN session_guid ON session_guid.visitor_forms_id = messages_sent.visitor_forms_id
JOIN session_guid sessions ON sessions.session_guid = session_guid.session_guid
JOIN visitor_forms ON visitor_forms.id = sessions.visitor_forms_id
WHERE
sessions.status_type_id = 1
AND sessions.website_id = 7
AND visitor_forms.form_type_id = 1 #1 for forms, 2 for carts
AND sessions.updated_timestamp BETWEEN '2015-05-01' AND '2015-05-08';
答案 0 :(得分:0)
我的经验是尝试在数据库级别应用继承/ OO风格思维是一件非常糟糕的事情。
一般来说,更简单的视图往往是正常的...不同DBMS上的查询优化器擅长“煮沸”视图并为您提供良好的性能。
但是,当您变得更复杂并开始使用具有聚合函数,用户定义函数和其他勘误的视图来实现代码重用时,它通常会带来巨大的I / O和查询计划开销。我们走了那条路,不得不撕掉那些东西然后撤退。在我看来,这是不值得的。与可怕的查询计划相比,代码重复是一个更好的问题。