# Key Concepts & Architecture Oxla enables data processing, analytics, and storage solutions that are easily scalable, highly reliable, cheaper, easier to use, and faster than the other OLAP solutions. We are an advanced distributed analytical database with robust analytical processing. We store data using several file systems, such as AWS S3, Ceph, and GCS. Hero Light Hero Dark Oxla is designed to support analytical query workloads, also known as Online Analytical Processing (OLAP). These workloads are complex queries that analyze a stored dataset, such as joins between numerous extensive databases or aggregations across large tables. The current build of the Oxla database allows users to import data using .csv and run SQL queries using CLI with various supported clauses, data types, and functions. # Oxla Architecture Oxla has a uniform architecture that contains the node leader that can distribute workloads equally among replicas and partitions. Data can be processed directly from data warehouses into the OLAP database management system without going through the terminal messaging cluster. Our cutting-edge technology allows users to process data faster with less infrastructure. Users will be able to request data using queries and receive data in real time. Oxla’s unique architecture uses the Dynamic Oxla cluster in the query processing layer. This cluster can expand and shrink dynamically depending on the analytical demand for data processing. Within the cluster, a node leader coordinates activities across Oxla. It performs key activities such as authentication, query parsing, optimization, etc. Our architecture consists of two layers, **query processing**, and a **database storage layer**. We separate the computing layer, *a.k.a* query processing layer, with the database storage layer to provide our customers greater flexibility and cost savings for big data and advanced analytics. ![Architecture](https://mintlify.s3-us-west-1.amazonaws.com/oxla/assets/Key%20Concepts%20&%20Architecture_architecture.png) ## Example Use Cases Benefits: Let’s say a large corporation wants to improve the customer journey by driving insights and running more queries/analyses from their existing customer’s data, such as purchase transactions, social data, etc. They need to process and transform a large amount of data in real-time resulting in the need to improve the computing power and not the storage. In this use case, our decoupled storage and compute design will benefit the corporation since they only need to upgrade the query processing and not include the database storage. ### 🔑 Our Key Benefits: 1. No need for external metastore. 2. No need for a queue for batching insertions. 3. Simpler deployment and maintenance. 4. Fewer people are needed to manage and maintain the database, which results in cheaper labor costs. ## Oxla Cluster Our Dynamic Oxla cluster technology allows you to store and run SQL queries faster with less cost. There are two main components in our cluster: * **Node leader:** the component that distributes the workload to run the SQL queries to all the worker nodes and appoints any node to store the data. * **Worker node:** the component that executes the SQL queries and stores the data. There shall be always a single node per machine. ![cluster](https://mintlify.s3-us-west-1.amazonaws.com/oxla/assets/Key%20Concepts%20&%20Architecture_cluster.png) ## Our Main Differentiator ### ⚡️ High Availability (No Single Point of Failure) If the node leader fails, the cluster can appoint one of the worker leaders to be the new node leader. It allows you to run SQL queries with high availability and redundancy. ### 💨 Fast Query Processing Oxla performs query execution using our query engine. Our database technology was specifically designed for big data analytics. Four critical aspects within our architecture allow us to run the queries faster than other solutions, they are: **Self-contained architecture** Our architecture only needs distributed storage as the external component. It does not require other additional components such as distributed message queue, external metastore, etc. Oxla processes the queries using the worker nodes that the node leader leads. When a client app wants to initiate a query request, it connects to any node within our cluster. Once connected, it will send an SQL query request containing a string with SQL query. The node leader will parse the string and create an execution plan. This execution plan will then get distributed to all the worker nodes to execute the query. Each worker node is an independent compute node that does not share compute resources with other worker nodes. It allows each worker node to efficiently execute the query without impacting others. It provides high availability and redundancy with no single point of failure. ![self contained architecture](https://mintlify.s3-us-west-1.amazonaws.com/oxla/assets/Key%20Concepts%20&%20Architecture_self-contained-architecture.png) **The radically vectorized query engine** Big Data usually contains very complex and high volumes of data. It usually has workloads with queries that touch across a subset of columns but a large number of rows for those columns. Our vectorized query engine can perform complex computations faster than the traditional database. **"JOIN" and "GROUP BY" improved algorithms** Oxla is designed explicitly with improved “JOIN“ and “GROUP BY“ algorithms using custom data structures optimized for highly optimized lookups. Our hashmap implementation has better performance in typical SQL query operations. It reduces the lookup time and allows a faster response. **All-level code optimizations** We have designed our technology from scratch to provide the best solutions for big data analytics. We performed a holistic improvement and approach to design and develop the entire technology resulting in fast query processing time and fewer data storage for big data analytics. ### 🔋 Efficient Data Storage Our Oxla cluster technology automatically selects and detects which worker node should be responsible for handling data insertion. Combining it with our unique data insertion algorithm, our users will be able to: * Handle large amounts of data insert operations; * Store large amounts of data efficiently, which results in lesser data storage and cheaper cost; * Provide data resiliency if any node fails. Oxla stores data in optimized columnar format whenever the users load data into Oxla. The typical data warehouse solutions require users to insert data in large batches. Our technology enables users to insert large amounts of data even with single rows. We handle all key aspects of data storage, including file organization, compression, structure, and database metastore. ### 💸 Cheaper Cost The typical OLAP solutions require terminal messaging clusters such as Kafka to distribute workloads. Each cluster usually comprises more than one Broker to maintain load balance. Maintaining the cluster state requires additional ZooKeeper, another infrastructure to maintain. Our Oxla cluster and data insertion technologies already provide efficient distribution workload technology to distribute workloads among the worker nodes. It eliminates the need for both Kafka clusters and ZooKeeper. Ultimately, you will save the cost of purchasing these infrastructures and reduce the man-hour cost of maintaining them by using our solution. ![database structure comparison](https://mintlify.s3-us-west-1.amazonaws.com/oxla/assets/Key%20Concepts%20&%20Architecture_database-structure-comparison.png) ### 👩🏻‍💻 Improved Scalability Our Oxla cluster is also dynamic, allowing you to scale quickly without having the hassle of upgrading the data warehouse whenever you want to store more data or run more queries for your business. Our cluster will automatically expand or shrink depending on the number of queries or data you store. **For example,** from 9 AM to 5 PM, when your data analyst runs a lot of queries, our cluster will expand to cover the needs of more analytical power. After 5 PM, when there are not that many queries to do, our cluster will shrink back to adjust. This flexibility will save you time and cost in managing the database infrastructure # **Did You Know…?** Oxla was designed and written from scratch, we explored and analyzed why organized data is important to accelerate business outcomes with rapid comprehension and reach the maximum edge of your potential in data and analytics. At Oxla, we use big data analytics and approach the speed of commercial database management systems while scaling to the size of your business. > ***Fast, Trustworthy, Cost-Effective… That’s Us!*** 🙋🏻‍♂️ Data has never been more important. Get in touch with [us](https://www.oxla.com/contact) # OLTP vs OLAP This article explains the differences between OLTP and OLAP technology. It helps you to further understand the use cases of our technology and why we chose OLAP for data analysis. ## What is OLTP? ### Definition Online Transaction Processing, shortly known as OLTP, supports transaction-oriented applications under a 3-tier architecture (could be a [3NF](https://en.wikipedia.org/wiki/Third_normal_form) approach). OLTP usually administers day-to-day transactions through a relational database. The main purpose is data processing and not data analysis. ### Usage Examples OLTP usage can be found in every consumer-market approach. Some of the daily use cases for transactional processing are as follows: * **Payment:** using a debit or credit card, online or offline payment. * **Online Transaction**: any reservation, ticketing, and booking system which requires the OLTP methods. * **ATM and Online Banking**: cash withdrawals or online banking operations represent simple day-to-day transactions. * **Record Entry**: store data like a student’s score record, products in the warehouse, or customer service ticketing systems requiring fast-paced management. * and many more…💨 ## What is OLAP? ### Definition OLAP stands for Online Analytical Processing and provides data analysis for business decisions. With OLAP, users can get information on multiple databases and data types with the ability to analyze them at the same time, even with complex queries. The main objective is data analysis and not data processing. ### Usage Examples OLAP method can be found in every part of business, especially in data analytics. Some of the usage examples are: * **Niche:** it can be seen on a personalized homepage, on the e-commerce page, movie streaming app, and on any other platform that fits users' unique needs or preferences. * **Sales Analytic:** usually used to compare sales in a different period which is stored in separate databases. * **Customer Behavior:** helps in determining customer behavior in some industries. * **Trend Analysis:** provide statistical analysis across several sectors to assist in decision-making. * and many more…💨 **Did you know?🧐**
The Microsoft Excel and Microsoft SQL Server's Analysis Services are also using OLAP features!
## OLTP & OLAP Comparison The table below outlines the main differences between OLTP & OLAP: | **Parameters** | **OLTP** | **OLAP** | | -------------------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------- | | **Stands for** | Online Transactional Processing | Online Analytical Processing | | **Process** | A transactional mechanism for controlling database modifications. | Online analysis and data retrieving process. | | **Characteristic** | Large numbers of online transactions characterize it. | A large volume of data characterizes it. | | **Method** | Traditional DBMS. | Data warehouse. | | **Database normalization** | Normalized | Unnormalized or denormalized | | **Operation** | `INSERT`, `DELETE` and `UPDATE` commands. | Mostly `SELECT` operations. | | **Response Time** | Milliseconds | Seconds to minutes (It depends on the data amount that has to be processed) | | **Storage size** | Small database | Large database | | **Response** | It offers quick results for frequently utilized data. | It offers a consistently faster response to requests. | | **Audience** | Market-oriented information. | Customer-oriented information. | ### 🆚 OLAP vs. OLTP: Key Differences * OLAP analyzes data stored in a database, while OLTP supports transaction-oriented operations. * OLAP handles all business and data analysis, while OLTP is usually used to administer daily transactions. * OLAP can integrate different data sources, while OLTP uses traditional DBMS. ## Conclusion The OLTP and OLAP, both, deal with information in their discipline. While OLTP is useful for business operations, OLAP is advantageous for analyzing data and providing important information for a business’ growth. We certainly want significant business growth, and OLAP is a system you should consider. One of the finest recommended database management systems which can help is Oxla. Oxla will help you achieve your goal with a fast-distributed analytical database and robust analytical processing! 🚀 # Our Key Features This article lists our prominent features supported in the current release: ## Data Storage, Import & Export * A distributed storage system that provides high availability and redundancy. * Support for large data loading and unloading into/out of tables. * Exporting/ importing data from .csv files. * Decoupled storage and computing. * Internal metastore detection to provide information about the database ## Integration * Connect Oxla to external data sources with JDBC. * Support PostgreSQL library. * We are fully integrated with Amazon S3 storage ## Supported SQL | **Name** | **Description** | **Example** | | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `SELECT` | The `SELECT` statement is used to select data from a database. The data returned is stored in a result table called the result set. | The following query will select all the columns from the **Products** table: `SELECT * FROM Products;` | | `INSERT INTO` | The `INSERT INTO` query adds new rows to an existing table using a `SELECT` statement or explicitly stating input values. | `INSERT INTO distance_table (distance, unit) VALUES (2000, 'kilometers'), (1000, 'meters'), (5, 'miles');` | | `DROP` | The` DROP` statement is used to delete objects like an existing database or table. | The following query will delete a table named **testTB**: `DROP TABLE testTB;`
The following query will delete a database named **testTB**: `DROP DATABASE testDB;` | | `CREATE TABLE` | The `CREATE TABLE `statement is used to create a table in a database with a defined column and each column's data type. | `CREATE TABLE book (bookID int, bookTitle text, bookCategory text, bookPublisher text, bookPages int;)` | | `CREATE INDEX` | The `CREATE INDEX` is used to create a single index on an empty table. | | | `SHOW TABLES` | The `Show` statements allow you to obtain information about existing tables. | `SHOW TABLES;` | | `DESCRIBE` | The `Describe` statement show columns within a table and tables within a database. | `DESCRIBE TABLE part;`
`DESCRIBE DATABASE;` | | `SHOW NODES` | The `SHOW NODES` returns the current state of the cluster. | `SHOW NODES;` | | `SET/SHOW` | The `SET` statement lets you set specific options, and the `SHOW` statement helps you see the current values in Oxla. | `SET extra_float_digits TO 2;``SHOW timezone;` | | `COPY FROM` | The `COPY FROM` statement copies the data from a file into a table. | `COPY table_name FROM 'file_path'` | | `COPY TO` | The `COPY TO` statement is used to export tables, specific columns, or results of select queries into .csv files. | `COPY salary TO '/path/to/exportsalary.csv';` | ## SQL Syntax ### Supported Clauses | **Name** | **Description** | **Example** | | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | `FROM` | The `FROM` clause can return a row set, a table, or a function from any ‘join’ statement. | `SELECT * FROM cars;` | | `JOIN` | A `JOIN` clause combines records from two or more tables based on a related column between those tables. | `SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate FROM Orders JOIN Customers ON Orders.CustomerID=Customers.CustomerID;` | | `LEFT JOIN` | The `LEFT JOIN` joins two or more tables, returns all records from the left table, and matches records from the right table that fulfill the specified join condition. It will return null if there is no matching record from the right table. | `SELECT Customers.CustomerName, Orders.OrderID FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID` | | `RIGHT JOIN` | The `RIGHT JOIN` joins two or more tables and returns all records from the right table and the matched records from the left table that fulfill the specified join condition. It will return null if there is no matching record from the left table. | `SELECT Orders.OrderID, Employees.LastName, Employees.FirstName FROM Orders RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID` | | `OUTER JOIN` | The `OUTER JOIN` joins and returns matched and unmatched values from either one or both tables. | `SELECT Customers.customerName, Orders.orderID FROM Customers OUTER JOIN Orders ON Customers.customerID=Orders.customerID` | | `WHERE` | The `WHERE` clause is used to filter records from a single table or by joining with multiple tables that fulfill the specified condition. | `SELECT * FROM Customers WHERE Country='France';`
`SELECT * FROM Customers WHERE CustomerID=1;` | | `GROUP BY` | The `GROUP BY` clause groups rows with the same values into summary rows. | `SELECT COUNT(CustomerID), Country FROM Customers GROUP BY Country;` | | `HAVING` | The `HAVING` clause is used to filter data according to the conditions provided. The `HAVING` clause is usually executed with the `GROUP BY` clause. | `SELECT Department, sum(Salary) as Salary FROM employee GROUP BY department HAVING SUM(Salary) >= 50000; ` | | `ORDER BY` | The `ORDER BY` sorts the rows of the result set from a SELECT statement. | `SELECT emp_name, emp_div FROM salaryemp ORDER BY emp_div;` | | `LIMIT` | The `LIMIT` clause is an optional clause of the `SELECT` statement that constrains the number of rows the query returns. | `SELECT order_id, prod_name, prod_price FROM comporders ORDER BY order_id LIMIT 4;` | | `OFFSET` | The `OFFSET` is a clause that skips some records from the result set. | `SELECT * FROM oxlafunctions ORDER BY func_name LIMIT 5 OFFSET 2;` | | Set Operations | Set operations are used for comparisons, combinations, and distinctions among sets. | It includes the following operations: `UNION`, `EXCEPT`, `INTERSECT`. | ### Supported Datatypes | **Data Types** | **Definition** | **Format** | | ----------------------------- | ---------------------------------------------------------- | ---------------------------------------------- | | `BOOL` | Boolean value. | `True` or `False`. | | `TEXT` | UTF8 encoded string with Unicode support. | 'text' | | `DATE` | Date value. | `YYYY-MM-DD` | | `TIMESTAMP WITHOUT TIME ZONE` | Time and date values without a time zone. | `YYYY-MM-DD [HH:MM:SS[.SSSSSS]]` | | `TIMESTAMP WITH TIME ZONE` | Date and time values, including the time zone information. | `YYYY-MM-DD HH:MM:SS.SSSSSS+TZ` | | `TIME` | Time values without any date information. | `HH:MM:SS[.SSSSSS]` | | `JSON` | A value in JSON standard format. | `variable_name JSON` | | `INTERVAL` | Encodes a span of time | `year-month (YYYY-MM); day-time (DD HH:MM:SS)` | | `INT` | 32-bit signed integer | one or more digits "0" to "9" | | `BIGINT` | 64-bit signed integer | large numeric/decimal value | | `REAL` | 32-bit floating point number | `float(n)` | | `DOUBLE PRECISION` | 64-bit floating point number | `decimal(p, s)` | ## Functions ### Numeric functions | **Name** | **Description** | | --------------------- | ---------------------------------------------------------------------------------------------------------------- | | `CEIL` | This function rounds up to the nearest positive or negative integer value greater than or equal to the argument. | | `ABS` | This function returns the absolute value of an argument, regardless of whether it is positive or negative. | | `SQRT` | This function returns the square root of its argument. | | `CBRT` | The function calculates and returns the cube root of a given number. | | `RANDOM` | This function returns a random number between 0 (inclusive) and 1 (exclusive). | | `FLOOR` | This function returns a number rounded down that is less than or equal to the specified argument. | | `LN` | This function returns the exponential value of its argument. | | `SIN` | This function returns the trigonometric sine value of a specified angle in radians. | | `GREATEST` | This function extracts the greatest or largest value from a set of values. | | `LEAST` | This function returns the least or smallest value in a list of values. | | `ROUND` | This function rounds numbers to the nearest integer or to a specified number of decimal places. | | `EXP` | This function returns the exponential value of a number specified in the argument. | | `LOG` | The function returns the base-10 logarithm or logarithm of the specified base of a given number. | | `POWER` | This function returns the value of a number raised to the power of another number specified in the arguments. | | `TO_CHAR` from number | This function formats a number into a string using a given format. | ### Aggregation functions | **Name** | **Description** | | ---------- | --------------------------------------------------------------------------------------------------------------------- | | `SUM` | Calculates the sum of values. Input must be numeric. If the input type is 32-bit, then the result will be 64-bit. | | `MIN` | Returns the smallest value. Input must be numeric. | | `FOR_MIN` | Returns a value corresponding to the minimal metric in the same row from a set of values. | | `MAX` | Returns the largest value. Input must be numeric | | `FOR_MAX` | Returns a value corresponding to the maximum metric in the same row from a set of values. | | `AVG` | Calculates the average of values. Input must be numeric. If the input type is 32-bit, then the result will be 64-bit. | | `COUNT` | Counts the number of rows. | | `BOOL_AND` | False if at least one of aggregated rows is False. Input must be bool. | | `BOOL_OR` | True if at least one of aggregated rows is True. Input must be bool. | ### String functions | **Name** | **Description** | | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `LENGTH` | Returns the number of characters in the string. The number of characters might be different from the byte length. | | `LOWER` | Makes string lowercase. It supports Unicode, so *ß* is changed into *ss*. | | `UPPER` | Makes string upper case. Supports Unicode. | | `STARTS_WITH` | It returns true if the first argument starts with the second argument. E. g. `STARTS_WITH(“abc,” “ab”)` returns true. | | `ENDS_WITH` | It returns true if the first argument ends with the second argument. E. g. `STARTS_WITH(“abc,” “bc”)` returns true. | | `CONCAT` | Concatenates all inputs e. g. `CONCAT(123, “abc”)` returns “123abc”. Inputs might be of any type. | | `SUBSTR` | Retrieves substring. E. g. `SUBSTR(“abcd”, 2)` returns “cd”, `SUBSTR(“abcd”, 2, 1)` returns “c”. | | `STRPOS` | Returns position at which the second argument starts within the first argument or 0 if the first argument does not contain the second argument E. g. `STRPOS(“abcd”, “ab”)` return 2, `STRPOS(“abcd”, “ac”)` returns 0. | | `REGEXP_REPLACE` | Substitutes new text for substrings that match POSIX regular expression patterns. | | `REPLACE` | Finds and replaces a substring with a new one in a string. | | `POSITION` | Returns the position of the first occurrence of a substring in a string. | ### Timestamp functions | **Name** | **Description** | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `CURRENT_TIMESTAMP` | Returns current timestamp. | | `FORMAT_TIMESTAMP` | Formats timestamp. Format string documentation: [date](https://howardhinnant.github.io/date/date.html#from_stream_formatting). Example: `FORMAT_TIMESTAMP('the date is: %F', CURRENT_TIMESTAMP())` would produce “the date is: 2022-12-19” | | `UNIX_SECONDS` | Converts the given timestamp to Unix timestamp in seconds. | | `UNIX_MILLIS` | Converts the given timestamp to Unix timestamp in milliseconds. | | `UNIX_MICROS` | Converts the given timestamp to Unix timestamp in microseconds. | | `TIMESTAMP_SECONDS` | Converts Unix timestamp in seconds to timestamp. | | `TIMESTAMP_MILLIS` | Converts Unix timestamp in milliseconds to timestamp. | | `TIMESTAMP_MICROS` | Converts Unix timestamp in microseconds to timestamp. | | `TIMESTAMP_TRUNC()` | Truncates a given timestamp to the nearest time parts. Supported time parts are YEAR, MONTH, DAY, HOUR, MINUTE, and SECOND | | `EXTRACT` | Extracts are given time part from Timestamp. Supported time parts are YEAR, MONTH, DAY, HOUR, MINUTE, and SECOND. e. g. EXTRACT(YEAR FROM TIMESTAMP '2020-10-15 10:15:23') will return 2020. | | `TO_TIMESTAMP` | Converts a string into a timestamp based on the provided format. | | `DATE_TRUNC` | Truncates intervals or timestamps/time zones to a specified field. | | `TO_CHAR` from timestamp | Formats a timestamp into a string using a given format. | ### Boolean function | **Name** | **Description** | | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `IF` | Three arguments function. It expects that the first argument is of type BOOL, 2nd and 3rd has a matching type E. g. `IF(2 < 5, “smaller,” “greater”)` would produce “smaller.” | ### JSON functions | **Name** | **Description** | | ------------------------ | -------------------------------------------------------------------------------------- | | `JSON_EXTRACT_PATH` | It extracts JSON sub-object at the specified path. | | `JSON_EXTRACT_PATH_TEXT` | It returns text referenced by a series of path elements in a JSON string or JSON body. | | `JSON_ARRAY_LENGTH` | It returns the number of elements in the outer array of a JSON string or JSON body. | | `JSON_ARRAY_EXTRACT` | It returns the JSON array as a set of JSON values.  | ### Other functions | **Name** | **Description** | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------- | | `CURRENT_SCHEMA` | It returns the schema's name first in the search path. | | `CURRENT_DATABASE` | It returns the current database's name. | | `COALESCE` | It returns the first argument that is not null, while the remaining arguments from the first non-null argument are not evaluated. | | `NULLIF` | It replaces a given value with null if it matches a specific criterion. | | `pg_total_relation_size` | It retrieves the size of a table. | | `has_schema_privilege` | It checks whether the current user has specific privileges on a schema. | | `pg_get_expr` | It retrieves the internal form of an individual expression, such as the default value for a column. | | `pg_typeof` | It retrieves the data type of any given value. | ### Trigonometric functions | **Functions** | **Description** | | ------------- | ------------------------------------------------------------------------------------------------ | | `acos` | It calculates the inverse cosine of a given argument, where the output is expressed in radians. | | `acosd` | It calculates the inverse cosine of a given argument, where the output is expressed in degrees. | | `asin` | It calculates the inverse sine of a given argument, where the output is expressed in radians. | | `asind` | It calculates the inverse sine of a given argument, where the output is expressed in degrees. | | `atan` | It calculates the inverse tangent of a given argument, where the output is expressed in radians. | | `atand` | It calculates the inverse tangent of a given argument, where the output is expressed in degrees. | | `atan2` | It calculates the inverse tangent of y/x, where the output is expressed in radians. | | `atan2d` | It calculates the inverse tangent of y/x, where the output is expressed in degrees. | | `cos` | It calculates the cosine of a given argument, where the argument is in radians. | | `cosd` | It calculates the cosine of a given argument, where the argument is in degrees. | | `cot` | It calculates the cotangent of a given argument, where the argument is in radians. | | `cotd` | It calculates the cotangent of a given argument, where the argument is in degrees. | | `sin` | It calculates the sine of a given argument, where the argument is in radians. | | `sind` | It calculates the sine of a given argument, where the argument is in degrees. | | `tan` | It calculates the tangent of a given argument, where the argument is in radians. | | `tand` | It calculates the tangent of a given argument, where the argument is in degrees. | We still have a long road to go. We will keep you posted with our soon-to-be-released features to boost your experience. Stay tuned! # Oxla vs. Other OLAP Solutions There are several different types of distributed database management systems (DBMS). But there isn't a database system that works for everyone. Each makes different compromises to suit particular situations. In this section, we attempt to explain how Oxla differs from other OLAP-using systems. ## The Comparison The comparison tests were performed on a single node; using more nodes will significantly improve the results. Below are the detailed prototype test results on AWS between Oxla and selected alternatives *(ClickHouse, Presto, Parquet)*: ### a) Performance | **Oxla** | **ClickHouse** | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | | Supports a lot of Clauses, Data Types, and Functions. Such as `GROUP BY`, `JOIN` (`INNER JOIN`, `LEFT JOIN`, `RIGHT JOIN`, `OUTER JOIN`). We also support uncorrelated subqueries e.g. `SELECT num, COUNT(*) as num FROM user GROUP BY age`. | Non-standard SQL-like query language with several limitations. | | Oxla has homogeneous architecture: there are no workers, data, or master nodes. One of the nodes is dynamically selected as the leader with no single point of failure. | On-premise with dedicated clusters, no elasticity. We need to migrate into bigger/smaller clusters. | ### b) Cost | **Oxla** | **ClickHouse** | | -------------------- | ------------------- | | \$0.023 per GB/month | \$0.24 per GB/month | ## Conclusion Our tests show that Oxla's performance surpasses all other distributed database management systems with the following results: * Oxla processes a large number of data at an extremely high data processing speed. * Oxla can reduce 80% of data infrastructure costs compared to the others. * Oxla will not be affected by the massive data you have. The storage (RAM) needed will stay low with a small cost you pay. ![comparison](https://mintlify.s3-us-west-1.amazonaws.com/oxla/assets/Oxla%20vs%20Other%20OLAP%20Solution_comparison.png) ## Now What? Understanding Oxla and then comparing it with other solutions made us realize that there are a lot of choices in today’s database market - but in the end, there will be only one . We suggest you take a step back and evaluate your products, team talents, market, and needs before deciding what to use for your business. Choosing the right technology today can make a huge difference now and in the future. Choose an architecture that will grow with you rather than one that makes you start over. We, at Oxla, will be super pleased to support you in achieving your goal with our dazzling distributed DBMS ✨ **Are you curious about Oxla? Contact [us](https://www.oxla.com/contact)** # JAVA JDBC ## Overview [Java Database Connectivity (JDBC)](https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/) is an application programming interface (API) for the Java programming language which defines how a client may access a database. It is a Java-based data access technology used for Java database connectivity, which supports PostgreSQL protocol implemented in Oxla and provides consistent interface for accessing databases in Java or Kotlin. This page and its sections describe how to use Kotlin JDBC with Oxla and also lists unsupported functions and structures. ## Establishing connection ```Kotlin /** * @brief Establishes connection to a database at a given address and port. * @param address Address at which database is located (Can be in URL, IPv4 or IPv6 format). * @param port Port at which database is located (in [0, 65535] range). * @param databaseName Name of the database to connect to. * @param user (optional) Name of a user to connect as. * @param password (optional) Password of the given user. * @return Result containing a Connection object if connection was established successfully, otherwise Result(Failure) with an error message. */ fun connect( address: String, port: Int, databaseName: String, user: String? = null, password: String? = null ): Result { if (port !in 0..65535) { return Result.failure(IllegalArgumentException("Port must be in 0 - 65535 range.")) } try { return Result.success(DriverManager.getConnection("jdbc:postgresql://$address:$port/$databaseName", user, password)) } catch (e: SQLException) { return Result.failure(SQLException("Failed to establish connection to a database, because: $e")) } catch (_: SQLTimeoutException) { return Result.failure(SQLTimeoutException("Failed to establish connection to a database. Request timed out.")) } } ``` Support for SSL/TLS is not mandated in the JDBC specification. So you cannot expect it in every driver. ## Example usage This example shows basic query execution, once the connection has been established: ``` val statement: Statement = connection.createStatement() statement.queryTimeout = QUERY_TIMEOUT val query: String = "SELECT $columnName FROM $table" try { // Execute the query and... val result: ResultSet = statement.executeQuery(query). also { // ... print the results. while (it.next()) { println(it.getString(1)) } } } catch (e: SQLException) { System.err.println("Failed to execute the following query: $query, error: $e") } ``` ## Unsupported Functions & Structures Here you can find a list of functions and potentially related structures, that we currently do not support when working with Oxla and Kotlin JDBC: * `JDBC.Connection`, [createArrayOf](https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#createArrayOf-java.lang.String-java.lang.Object:A-) * `JDBC.Connection`, [getTransactionIsolation](https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#getTransactionIsolation--) * `JDBC.Connection`, [prepareStatement with intArray (JDBC does not support)](https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#prepareStatement-java.lang.String-int:A-) * `JDBC.Connection`, [setSavepoint](https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#setSavepoint--) * `JDBC.Connection`, [setTransactionIsolation](https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#setTransactionIsolation-int-) * `JDBC.ResultSet`, [deleteRow](https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#deleteRow--) * `JDBC.ResultSet`, [insertRow](https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#insertRow--) * `JDBC.ResultSet`, [refreshRow](https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#refreshRow--) * `JDBC.ResultSet`, [updateRow](https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#updateRow--) * `JDBC.ResultSet`, [moveToCurrentRow](https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#moveToCurrentRow--) * `JDBC.ResultSet`, [moveToInsertRow](https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#moveToInsertRow--) * `JDBC.Statement`, [RETURN\_GENERATED\_KEYS](https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#RETURN_GENERATED_KEYS) * `JDBC.Statement`, [invalid autoGeneratedKeys (JDBC does not throw)](https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#executeUpdate-java.lang.String-int-) * `JDBC.Statement`, [execute witch intArray (JDBC does not support)](https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#execute-java.lang.String-int:A-) * `JDBC.Statement`, [cancel (issues after cancel)](https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#cancel--) * `JDBC.PreparedStatement`, [setDate](https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html#setDate-int-java.sql.Date-) * `JDBC.PreparedStatement`, [setObject](https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html#setObject-int-java.lang.Object-) * `JDBC.PreparedStatement`, [setString(1, PGInterval("1 day").toString())](https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html#setString-int-java.lang.String-) # PHP PDO ## Overview [The PHP Data Objects (PDO)](https://www.php.net/manual/en/book.pdo.php) is an extension, which supports PostgreSQL protocol implemented in Oxla and provides consistent interface for accessing databases in PHP. This page and its sections describe how to use PHP PDO with Oxla and also lists unsupported functions and structures. ## Establishing connection ```PHP conn = new PDO( "pgsql:host={oxla_host};port={oxla_port};dbname=oxla", {oxla_user}, {oxla_password}, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => true, ]); ``` Note that the `PDO::ATTR_EMULATE_PREPARES` attribute is set to `true`, which is required in Oxla to ensure stability of query execution. Without this attribute setup, you may encounter `prepared statement` errors during queries execution: ``` ERROR: prepared statement [...] ``` If you are running Oxla Cloud, you can append `sslmode=verify-full;sslrootcert=\{path to ssl cert from SaaS\}` to the first parameter of PDO to ensure full SSL endpoint verification and encryption. ## Example usage This example shows basic query execution, once the connection has been established: ``` $stmt = $conn->prepare("SELECT :number as num;", [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]); $stmt->execute(['number' => 1234]); $res = $stmt->fetchAll(); print_r($res) ``` ## Unsupported Functions & Structures Here you can find a list of functions and potentially related structures, that we currently do not support when working with Oxla and PHP PDO: * `PDO::pgsqlLOBCreate`, `pgsqlLOBOpen` - [Large Objects](https://www.postgresql.org/docs/current/largeobjects.html) * `PDO::pgsqlGetPid` - [returning processes ID](https://www.php.net/manual/en/function.pg-get-pid.php) * `PDO::pgsqlCopytFromFile`, `PDO::pgsqlCopytFromArray` - [copy from STDIN](https://www.postgresql.org/docs/current/sql-copy.html) * `PDO::pgsqlCopytToFile` - [copy to STDIN](https://www.postgresql.org/docs/current/sql-copy.html) * `PDO::pgsqlCopytToArray` - [copy to STDOUT](https://www.postgresql.org/docs/current/sql-copy.html) * `PDO::pgsqlGetNotify` - [`LISTEN`](https://www.postgresql.org/docs/current/sql-listen.html) and [`NOTIFY`](https://www.postgresql.org/docs/current/sql-notify.html) channel commands * `PDO::lastInsertId` - [SEQUENCES](https://www.postgresql.org/docs/current/sql-createsequence.html) * `PDO::beginTransaction`, `PDO::inTransaction`, `PDO::commit`, `PDO::rollBack` - [Transactions](https://www.postgresql.org/docs/current/tutorial-transactions.html) * `PDOStatement::rowCount` - returns improper number of rows for `DELETE`, `UPDATE`, `INSERT INTO ... (SELECT)` and `COPY` statements # Data Task Stability ## Overview The `oxla_data_task_stability` table provides information about the stability of data tasks for tables within Oxla. * Data tasks are background processes responsible for normalizing and maintaining data layouts. * The stability status indicates whether the table's files have been processed and are up-to-date. ## Example 1. Run the following command: ```sql SELECT * FROM oxla_internal.oxla_data_task_stability; ``` 2. Here’s an example of the output you might see: ```sql table_id | namespace_id | database_id | is_stable ----------+--------------+-------------+----------- 16384 | 0 | 0 | t (1 row) ``` **Table schema** | Column Name | Data Type | Constraints | Description | | -------------- | --------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `table_id` | `BIGINT` | `NOT NULL` | Unique identifier for the table | | `namespace_id` | `BIGINT` | `NOT NULL` | Identifier for the namespace that the table belongs to | | `database_id` | `BIGINT` | `NOT NULL` | Identifier for the database where the table is located | | `is_stable` | `BOOL` | `NOT NULL` | Indicates the state of the data task. `false` means the files are either being processed or queued for processing. `true` means the files have been processed and are stable, and this state persists until the user updates the data in the table | You can join the `table_id`, `namespace_id`, and `database_id` columns with other virtual tables to obtain human-readable names for the table, namespace, and database. # Multi-node Deployment Over the following steps, we'll show you how to set up and deploy Oxla multi-node database. Let’s get started! In this tutorial, we will show you how to deploy Oxla with three nodes. If you want to deploy more than that, simply update and adjust the yaml configuration per tutorial below. ## Prerequisite ⚠️ There shall be always a single node per machine. ⚠️ Install Docker. Please refer to [this page](https://docs.docker.com/engine/install/) for further details. ⚠️ x86 64bit CPU (Intel or AMD). ⚠️ Install PostgresSQL-client-14 for psql connection. Please refer to [this page](https://www.postgresql.org/download/). ⚠️ Grab N machines with ssh access to them. The N number refers to the number of nodes that you want to deploy. ⚠️ Configure the networking so that all nodes can connect to each other. ## Installation on Each Node * Open your terminal command and execute this command to check if you have installed your docker properly. ```dockerfile docker ps ``` If it returns “Bad response from Docker engine”, this means there is an issue with your docker engine. Try re-install your docker. * Execute the following command to create a file that contains docker compose file: ```dockerfile vim multi_node.yml ``` * Input the following code into the docker compose file for **each node**: ```dockerfile version: '3.5' volumes: oxla_data: services: oxla_node: image: public.ecr.aws/oxla/release:latest security_opt: - seccomp:unconfined ulimits: nofile: soft: 40000 hard: 40000 ports: - 5432:5432 environment: - FORCED_REVOKE_TIMEOUT_MS=1500 - BUFFER_TIMEOUT=1 - HOST_NAME=oxla_node_1 - OXLA_NODES=192.168.0.1;192.168.0.2;192.168.0.3 - OXLA_HOME=s3://yourdirectoryname - AWS_DEFAULT_REGION=AWS_DEFAULT_REGION - AWS_ACCESS_KEY_ID=AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY=AWS_SECRET_ACCESS_KEY ``` Don’t forget to replace the following values with appropriate values:
- 192.168.0.1; 192.168.0.2; 192.168.0.3
- s3://yourdirectoryname
- AWS\_DEFAULT\_REGION
- AWS\_ACCESS\_KEY\_ID
- AWS\_SECRET\_ACCESS\_KEY
Please ensure you the three machines that you are using to deploy Oxla is connected in a same network. Depending on your computer's RAM capacity, you may need to adjust the environment variable to optimize performance. You can set `OXLA_MAX_NON_QUERY_MEM` to a custom number.
For example `OXLA_MAX_NON_QUERY_MEM=4194304`
* Execute the following command to create and start the docker container: ```dockerfile docker compose -f multi_node.yml up ``` * Execute the following command to run Oxla: ```dockerfile psql -h IP_ADDRESS ``` Please replace `IP_ADDRESS` with one of the IP addresses that you setup in your yaml file. If you encounter an error response “bash: psql: command not found“, this means that you have not installed PostgreSQL. Please ensure that you repeat all of the steps above on all of the nodes. # Run Oxla in 2 minutes ## Prerequisites * x86 64bit CPU (Intel or AMD) * Linux OS * Docker * PostgreSQL Client ## Installation In order run Oxla in no time, you need to have Docker and PostgreSQL client installed on your local machine. To do that, you need to follow their installation guides, that you can find below: * [Docker](https://docs.docker.com/engine/install/) * [PostgreSQL Client](https://www.postgresql.org/download/linux/ubuntu/) ## Docker Setup Once you're done with installation part, you can open your terminal and execute following command to check if you have installed your Docker instance properly: ```dockerfile docker ps ``` If it returns “Bad response from Docker Engine”, it means there is an issue with your Docker instance and you need to try re-installing it. Then you need to start Oxla Docker instance and expose PostgreSQL port: ```dockerfile docker run --rm -it -p 5432:5432 public.ecr.aws/oxla/release:latest ``` In case of getting an error message about port 5432 being occupied, you need to adjust the above command to utilise a different port (6000 can be used here) ## Connecting to Oxla Once that is done, you can now effectively connect to Oxla by executing one of the following commands, depending on the port you used before: ```dockerfile psql -h localhost ``` ```dockerfile psql -h localhost -p 6000 ``` If you encounter “bash: psql: command not found“ error response, this means that you have not installed PostgreSQL client properly on your machine and you need to try reinstalling it # Run Oxla on Azure Blob Storage Over the following steps, we’ll set you up with an Oxla server using the Azure Blob Storage. ## Prerequisite ⚠️ Install Docker. Please refer to [this page](https://docs.docker.com/engine/install/) for further details. ⚠️ We recommend you use a Linux OS computer to deploy an Oxla server. ⚠️ Install PostgresSQL-client-14 for psql connection. Please refer to [this page](https://www.postgresql.org/download/). ## Installation Steps 1. Open your terminal and execute this command to check if you have installed your docker properly: ```typescript docker ps ``` If it returns “Bad response from Docker engine”, this means there is an issue with your docker engine. Try re-install your docker. 2. Execute the following command to create a file that contains docker compose file: ```typescript vim one_node.yml ``` 3. Input the following code into the docker compose file: ```typescript version: '3.5' volumes: oxla_data: services: oxla_node: image: public.ecr.aws/oxla/release:latest security_opt: - seccomp:unconfined ulimits: nofile: soft: 40000 hard: 40000 volumes: - oxla_data:/data ports: - 5432:5432 environment: - AZURE_ACCOUNT_NAME=${AZURE_ACCOUNT_NAME?err} - AZURE_TENANT_ID=${AZURE_TENANT_ID?err} - AZURE_CLIENT_ID=${AZURE_CLIENT_ID?err} - AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET?err} ``` 4. Execute the following command to create and start the docker container: ```typescript docker compose -f one_node.yml up ``` 5. Execute the following command to run Oxla: ```typescript psql -h localhost ``` If you encounter an error response “bash: psql: command not found“, this means that you have not installed PostgreSQL. 6. When you get the following result, you are now in the Oxla server✅ ```typescript psql (14.4, server Oxla 1.0) HP=> ``` Encountered an error? We got you! Head over [here](https://docs.oxla.com/5-error-handling/error-handling) to see your troubleshooting resolutions! # Run Oxla on Google Cloud Storage Over the following steps, we’ll set you up with an Oxla server using the Google Cloud Storage. ## Prerequisite ⚠️ Install Docker. Please refer to [this page](https://docs.docker.com/engine/install/) for further details. ⚠️ We recommend you use a Linux OS computer to deploy an Oxla server. ⚠️ Install PostgresSQL-client-14 for psql connection. Please refer to [this page](https://www.postgresql.org/download/). ## Installation Steps 1. Open your terminal and execute this command to check if you have installed your docker properly: ```typescript docker ps ``` If it returns “Bad response from Docker engine”, this means there is an issue with your docker engine. Try re-install your docker. 2. Execute the following command to create a file that contains docker compose file: ```typescript vim one_node.yml ``` 3. Input the following code into the docker compose file: ```typescript version: '3.5' volumes: oxla_data: services: oxla_node: image: public.ecr.aws/oxla/release:latest security_opt: - seccomp:unconfined ulimits: nofile: soft: 40000 hard: 40000 volumes: - oxla_data:/data ports: - 5432:5432 environment: - GOOGLE_APPLICATION_CREDENTIALS=${GOOGLE_APPLICATION_CREDENTIALS?err} ``` 4. Execute the following command to create and start the docker container: ```typescript docker compose -f one_node.yml up ``` 5. Execute the following command to run Oxla: ```typescript psql -h localhost ``` If you encounter an error response “bash: psql: command not found“, this means that you have not installed PostgreSQL. 6. When you get the following result, you are now in the Oxla server✅ ```typescript psql (14.4, server Oxla 1.0) HP=> ``` Encountered an error? We got you! Head over [here](https://docs.oxla.com/5-error-handling/error-handling) to see your troubleshooting resolutions! # Run Oxla on S3 ## Prerequisites * Docker * Linux OS * PostgreSQL Client ## Installation To run Oxla on S3, you need to have Docker and the PostgreSQL client installed on your local machine. * [Docker](https://docs.docker.com/engine/install/) * [PostgreSQL Client](https://www.postgresql.org/download/) ## Docker Setup Once you’re done with installation, you can open your terminal and execute following command to check if you have installed your Docker instance properly: ```typescript docker ps ``` If it returns “Bad response from Docker Engine”, it means there is an issue with your Docker instance and you need to re-install it. Refer to our [troubleshooting guide](https://docs.oxla.com/5-error-handling/error-handling) to learn more about common errors and how to resolve them. ## Docker Compose File Execute the command below to create a `docker compose` file: ```typescript vim one_node.yml ``` Then, update the file with the following code: ```typescript version: '3.5' volumes: oxla_data: services: oxla_node: image: public.ecr.aws/oxla/release:latest security_opt: - seccomp:unconfined ulimits: nofile: soft: 40000 hard: 40000 volumes: - oxla_data:/data ports: - 5432:5432 environment: - OXLA_HOME=s3://yourdirectoryname - AWS_DEFAULT_REGION=AWS_DEFAULT_REGION - AWS_ACCESS_KEY_ID=AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY=AWS_SECRET_ACCESS_KEY ``` Don't forget to replace environment variable placeholder values with the ones from your AWS instance. ## Docker Container Once you successfully followed the steps described above, you can execute the following command to create and start the docker container: ```typescript docker compose -f one_node.yml up ``` Now you are able to run Oxla server by executing the code below: ```typescript psql -h localhost ``` If you encounter an error such as: “bash: psql: command not found“, it means that the PostgreSQL client is not installed correctly and you need to re-install it. Refer to our [troubleshooting guide](https://docs.oxla.com/5-error-handling/error-handling) to learn more about common errors and how to resolve them. By now you should have successfully run the Oxla server: ```typescript psql (14.4, server Oxla 1.0) HP=> ``` # Run Oxla via AWS Over the following steps, we’ll guide you on how to deploy and configure Oxla on AWS. ## Prerequisite ⚠️ You need to have an active AWS account.  ⚠️ Ensure that your billing details are up-to-date. AWS Marketplace charges will appear on your AWS bill. ⚠️ Your IAM user account should have permissions to subscribe to and manage software in the AWS Marketplace. ⚠️  Ensure the product is available in the AWS region where you intend to deploy it ## Steps ### Step 1: Subscribe to Oxla 1. Go to the [AWS Marketplace](https://aws.amazon.com/marketplace) and type **Oxla** in the search field. 2. Select **Oxla** from the search results. 3. Click on the **Subscribe** button. ### Step 2: Manage Subscriptions After subscribing, you will find Oxla in the Manage Subscriptions page. ### Step 3: Launch Oxla Cluster 1. From the Manage Subscriptions page, click on **Launch CloudFormation stack** to configure Oxla. 2. You will go to the “Configure this software” prompt, where you need to configure the following: * Under the fulfillment option, select **Oxla Cluster Stack**. * Select the latest software version. * Choose a region where you want to deploy Oxla. 3. Click **Continue to Launch**. 4. You will go to the “Launch this software” page. Select **Launch CloudFormation**. 5. Click **Launch** to proceed. ### Step 4: Specify Stack Details 1. On the “CloudFormation template” page, you don’t need to change anything, so click **Next**. 2. Fill in the Stack details: | Fields | Details | | -------------------- | ----------------------------------------------------------------------------------------------- | | Stack name | The stack name. | | AvailabilityZone | Availability zone of your choice. This field is mandatory. | | ExistingS3BucketName | The S3 bucket name. You can also leave this field empty to allow AWS to create a new S3 bucket. | | InstanceType | The instance type. Available options are c5a.2xlarge, c5a.4xlarge, c5a.8xlarge. | | IsPubliclyAccessible | Set to true or false, depending on whether you want the cluster to be publicly accessible. | | NodeNumber | The node number. Minimum value is 1 and maximum value is 16. | | OxlaVersion | The default oxla version. | | OxlaWhitelistedCidr | The CIDR range. Only specified CIDR will have access to the Oxla cluster. | 3. Click **Next** to continue by adjusting the configuration to your personal needs. ### Step 5: Accessing Oxla 1. Once the stack is successfully deployed, go to **CloudFormation** → **Stacks** →select your stack. 2. Find the **OxlaEndpoint** in the **Outputs** section. 3. Connect to your Oxla cluster using PSQL, for example: ```psql psql -h [OxlaEndpoint] -p 5432 ``` # SET/SHOW statement ## **Overview** The `SET` statement lets you set specific options, and the `SHOW` statement helps you see the current values in Oxla. ## **Syntax** **SET Syntax** ```sql SET