Skip ke Konten

Materialize view in Odoo

Materialized View in PostgreSQL: Implementation in Odoo, Advantages, and Disadvantages

What is a Materialized View in PostgreSQL?

A Materialized View in PostgreSQL is a database object that stores the result of a query physically. Unlike a standard view, which is a virtual table, a materialized view allows you to cache the query results for faster retrieval. This is particularly useful for complex queries or reports that are not frequently updated.

How to Create a Materialized View

Syntax:

CREATE MATERIALIZED VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition
WITH DATA;

Example:

Suppose you have a table named sale_order:

CREATE TABLE sale_order (
    id SERIAL PRIMARY KEY,
    customer_name VARCHAR(100),
    date_order DATE,
    total_amount NUMERIC
);

To create a materialized view for high-value orders:

CREATE MATERIALIZED VIEW high_value_orders AS
SELECT id, customer_name, total_amount
FROM sale_order
WHERE total_amount > 1000
WITH DATA;

This view can now be queried like a table:

SELECT * FROM high_value_orders;

Refreshing the Materialized View

Since the data in a materialized view is static, it needs to be refreshed to reflect changes in the underlying tables:

REFRESH MATERIALIZED VIEW high_value_orders;

You can refresh the view manually or schedule it using a cron job.

Advantages of Materialized Views

  1. Improved Query Performance: Materialized views precompute and store query results, reducing the execution time for complex queries.
  2. Optimized Reporting: Ideal for dashboards and reports that require aggregated or filtered data.
  3. Data Decoupling: Queries against the materialized view do not impact the performance of the base tables.
  4. Custom Scheduling: Refresh schedules can be tailored to business requirements.

Disadvantages of Materialized Views

  1. Stale Data: Unless refreshed, the data may not reflect recent changes in the underlying tables.
  2. Storage Overhead: Materialized views consume additional disk space as they store query results physically.
  3. Maintenance Complexity: Refreshing and managing materialized views can add overhead, especially in systems with frequent updates.
  4. Limited Flexibility: Cannot be updated directly; modifications must be done in the base tables and then refreshed.

Implementing Materialized Views in Odoo

Materialized views can enhance the performance of reporting and analytics in Odoo by reducing the time required to retrieve data for complex queries.

Example: Materialized View for Sales Analysis

Step 1: Create the Materialized View in PostgreSQL

CREATE MATERIALIZED VIEW sales_analysis AS
SELECT
    partner_id,
    SUM(amount_total) AS total_sales,
    COUNT(id) AS order_count
FROM
    sale_order
GROUP BY
    partner_id
WITH DATA;

Step 2: Refresh the Materialized View Automatically

Use a cron job to refresh the view periodically:

REFRESH MATERIALIZED VIEW sales_analysis;

Step 3: Define the Materialized View in Odoo

Create an Odoo model to access the materialized view:

from odoo import models, fields

class SalesAnalysis(models.Model):
    _name = 'sales.analysis'
    _description = 'Sales Analysis'
    _auto = False  # Indicates this is a database view

    partner_id = fields.Many2one('res.partner', string='Customer', readonly=True)
    total_sales = fields.Float(string='Total Sales', readonly=True)
    order_count = fields.Integer(string='Order Count', readonly=True)

    def init(self):
        self.env.cr.execute("""
            CREATE OR REPLACE MATERIALIZED VIEW sales_analysis AS (
                SELECT
                    partner_id,
                    SUM(amount_total) AS total_sales,
                    COUNT(id) AS order_count
                FROM
                    sale_order
                GROUP BY
                    partner_id
            )
        """)

Step 4: Access the Data in Odoo

Once the module is installed, you can use the sales.analysis model for reports or dashboards in Odoo.

Use Cases for Materialized Views in Odoo

  • Complex Reports: Aggregate data for sales, inventory, or financial summaries.
  • Dashboard Performance: Precompute data for widgets and charts to improve load times.
  • Data Aggregation: Simplify queries for KPIs and business metrics.

Conclusion

Materialized views in PostgreSQL are a powerful tool for optimizing data retrieval in Odoo. While they offer significant performance benefits for complex queries, careful consideration is required to manage their limitations, such as stale data and storage overhead. By integrating materialized views into Odoo, businesses can achieve faster reporting and a more responsive user experience.

di dalam ODOO
View Table Postgresql in Odoo