SQL Server vs PostgreSQL

SQL Server vs PostgreSQL

With so many databases to choose from, users frequently debate PostgreSQL vs SQL Server to determine which is the better option for their use case. Organizations that use PostgreSQL for their operations may want to consider switching to a database such as Microsoft SQL Server, which primarily caters to various data warehousing solutions, ecommerce, and other lines of business.

Historically, Microsoft SQL Server has been a favorite among organizations that rely on other Microsoft products, but PostgreSQL has risen to the top of the niche not only because of the benefits of going open-source, but also because of its active user community and useful features.

This is what has brought us to this point. Comparing PostgreSQL and SQL Server will help you better understand the benefits and drawbacks of the two systems, as well as which one is better suited for your needs.

Let’s get started!

What Is PostgreSQL?

PostgreSQL has established itself as an enterprise-class, advanced open-source database that can be queried using both JSON (non-relational) and SQL (relational) syntax. Over thirty years of active community development have contributed to this powerful and stable database management system’s reputation for integrity, reliability, resilience, performance, and correctness.

PostgreSQL is the primary data warehouse or data store for a wide range of mobile, web, analytics, and geospatial applications. PostgreSQL also has a long history of supporting advanced data types, as well as performance optimization, which is common among commercial database competitors such as Microsoft SQL Server and Oracle.

PostgreSQL is not only free and open-source, but it is also highly extensible. You can, for example, generate custom functions, define data types, and even write code in various programming languages without having to recompile your database!

History

Here’s a brief overview of PostgreSQL through the years:

  • Ingres was first developed in 1977.
  • Michael Stonebraker and his associates developed Postgres in 1986.
  • In 1990, support for PL/ pgSQL and ACID compliance was added to PostgreSQL.
  • NYCPUG (New York City PostgreSQL User Group) joined the PgUS (United States PostgreSQL Association) back in 2013.
  • In 2014, the PGconf ushered in a new era for PostgreSQL users.

Main Features

Now, let’s look at some of PostgreSQL’s features that make it such an indispensable tool in the market:

  • Standards compliance and reliability: PostgreSQL’s write-ahead logging allows it to stand out as a highly fault-tolerant database. PostgreSQL is also ACID-compliant and provides full support for views, foreign keys, triggers, joins, and stored procedures, in various languages. It includes most SQL: 2008 data types, including BOOLEAN, NUMERIC, INTEGER, DATE, VARCHAR, TIMESTAMP, INTERVAL, and CHAR.
  • Robust extensions: PostgreSQL houses robust feature sets such as point-in-time recovery, multi-version concurrency (MVCC), tablespaces, granular access controls, and online/hot backups. PostgreSQL is also locale-aware for case sensitivity, sorting, and formatting. It is highly scalable in both the quantity of data it can manage and in the number of simultaneous users that can be accommodated.
  • Open-source license: You can avail of the PostgreSQL source code under an open-source license, giving you the freedom to modify, use, and implement it as you see fit, without any charge. On top of this, PostgreSQL incurs no licensing cost, which gets rid of the risk of over-deployment. PostgreSQL’s community of enthusiasts and contributors regularly find fixes and bugs, lending to the overall security of the database system.

Use Cases

Because of PostgreSQL’s versatility, it can be used in a wide variety of applications, including:

  • Federated hub database: PostgreSQL’s JSON support and foreign data wrappers allow it to link with other data stores — including NoSQL data types — and serve as a federated hub for polyglot database systems.
  • General-purpose OLTP database: Large enterprises and startups both use PostgreSQL as the main data store to support their internet-scale applications, products, and solutions.
  • Geospatial database: PostgreSQL supports geographic objects when used with the PostGIS extension. It can also be used as a geospatial data store for geographic information systems (GIS) and location-based services.
  • LAPP open-source stack: PostgreSQL can also run dynamic apps and websites as part of a robust alternative to the LAMP stack. LAPP stands for Linux, Apache, PostgreSQL, Perl, PHP, and Python.

What Is SQL Server?

SQL Server was created by Microsoft as a relational database management system with a long history, 32 years to be exact. Microsoft SQL Server is a software product whose primary function is to retrieve and collate data as requested by other software applications.

These applications may run on different computers connected by a network or on the same computer. Microsoft SQL Server has undergone numerous updates over the years to become one of the best supported and reputed RDBMSs on the market today.

Microsoft is responsible for a large portion of SQL Server’s popularity. Microsoft had already established itself as a tech behemoth when MS SQL Server was in its infancy.

SQL Server has made a name for itself as a database management system thanks to its diverse set of applications and tools that make working with data easier. Its comprehensive graphical user interface (GUI) allows for intuitive and simple database work while also generating statistics for your reports.

History

Here’s a quick look at Microsoft SQL Server over the years:

  • The evolution of SQL Server began in 1988 when Microsoft collaborated with Sybase and Ashton-Tate to develop database maintenance and creation software that would provide an impetus to Microsoft’s business database market.
  • SQL Server 1.0 was rolled out in 1989. Back then, it leveraged the system administrator facility (SAF) to generate databases. It didn’t have any documentation, but it still allowed users to run SQL queries and set parameters. The first code snippet for Microsoft SQL Server was penned by Sybase.
  • Gradually, newer versions were released with more improvements and features. SQL Server 2019, or Aries is the latest addition to a pantheon of comprehensive versions as it focuses on making the database features even more intuitive to use. This includes big data cluster options, giving users the choice to work with giant data sets.

Main Features

Enough with the history lesson. Let’s take a look at a couple of key features that make SQL Server so appealing:

  • Robust security platform: SQL Server allows you to protect your data in motion and at rest with built-in features for data protection, data classification, alerts, and monitoring. With SQL Server, you can easily encrypt sensitive data and perform rich computations on encrypted data, and allow customized role-based data access complete with complex row filtering.
  • Industry-leading performance: SQL Server boasts record-breaking performance on Linux and Windows as it consistently leads across TPC-H data warehousing workload, TPC-E OLTP workload, and real-world application performance benchmarks. You can also use SQL Server’s in-memory database capabilities such as memory-optimized tempdb and persistent memory support to improve performance for your mission-critical workloads.
  • Intelligence across all your data with big data clusters: SQL Server allows you to gain valuable insights from all your data by querying data across your entire data estate — Azure SQL Database, SQL Server, Teradata, MongoDB, Azure Cosmos DB, and many more — without having to replicate or move data. You can even build a shared data lake by combining both unstructured and structured data in SQL Server and accessing the data either through Spark or T-SQL.

Use Cases

SQL Server’s extensibility and performance enable it to be used in a wide range of applications, including:

  • Replication services: SQL Server replication services are utilized by SQL Server to harmonize and replicate database objects, either as a subset of the objects present or in their entirety. Replication services adhere to a subscriber/publisher model, i.e. the modifications are sent out by one database server (publisher) and are collected by others (subscribers).
  • Notification services: Notification services were originally released as a post-release add-on for SQL Server 2000. It is a mechanism for creating data-driven modifications, which are then sent to the notification services subscribers.
  • Machine learning services: SQL Server machine learning services operate within the SQL Server instance, letting people perform data analytics and machine learning without having to move data across the network or be hindered by the memory of their computers.
  • Analysis Services: SQL Server analysis services (SSAS) adds data mining and OLAP capabilities for SQL Server databases. The OLAP engine offers support for relational online analytical processing (ROLAP), multidimensional online analytical processing (MOLAP), and hybrid online analytical processing (HOLAP) storage modes for data. SQL Server analysis services also support XML for the analysis standard as the fundamental communication protocol.

PostgreSQL vs SQL Server: Head-to-Head Comparison

Now that we’ve covered the highlights of SQL Server and PostgreSQL, let’s look at the differences between the two. You can use the factors listed below to determine which database management system best meets your needs.

Availability

PostgreSQL provides a variety of solutions to ensure user availability, including write-ahead log shipping, shared-disk failover, data partitioning, and various replication methods. EDB Postgres Failover Manager, for example, provides automatic failover to ensure high availability by monitoring and identifying database failures.

SQL Server, on the other hand, includes a variety of high availability tools such as log shipping, failover clusters, and replication. SQL Server’s availability groups, which operate 24 hours a day, provide automatic failover when certain conditions are met. However, this feature is only available in SQL Server’s enterprise edition.

Data & Table Structure

For convenience, PostgreSQL provides its users with the PL/pgSQL procedural programming language. In addition to standard SQL, PostgreSQL has user-defined types, custom modules, extensions, JSON support, and additional options for triggers and other functionalities.

SQL Server employs T-SQL, which is similar to standard SQL. T-SQL also includes data and string processing, procedural programming, and local variables.

PostgreSQL isolates processes by treating them as separate OS processes if you want to better understand how the system caches and processes requests. Each database has its own memory and runs its own process. This simplifies monitoring and management while making scaling multiple databases more difficult.

SQL Server employs a buffer pool that can be limited or expanded based on processing requirements. Unlike PostgreSQL, all work is done in a single pool with no multiple pages.

Temporary tables are supported by both PostgreSQL and SQL Server because they allow you to store intermediate results from branched complex logic and complex procedures. By isolating intermediary information from the essential, temporary tables can help improve database organization and performance.

Defragmentation

When developers make changes to different parts of a SQL database, the changes occur at different points in the system and can be difficult to track, read, and manage. Defragmentation — the process of collating the updated database by assigning indexes, generating new pages, and revisiting the structure — should thus be included in maintenance. Databases can then free up disc space that isn’t being used properly, allowing a database to run faster.

PostgreSQL scans a data layer’s tables for empty rows and removes unnecessary elements. As a result, the system frees up disc space. However, this method consumes a significant amount of CPU and may have an impact on the application’s performance.

SQL Server, on the other hand, includes an efficient garbage collector that generates no more than 15-20% overhead. Because garbage collectors are so effective, developers can technically run them indefinitely. In conclusion, SQL Server provides more defragmentation methods than PostgreSQL.

Indexes

The way a database handles indexes demonstrates its usability because indexes are used to pinpoint data without searching for a specific row. Indexes can also be used to refer to multiple columns or rows. You can assign the same index to multiple files, present them in different locations in the database, and retrieve all of these pieces with a single search.

Although PostgreSQL supports index-based table organization, early versions did not support automatic index updates. It also allows you to search multiple indexes in a single search, which means you can find a lot of information.

SQL Server includes extensive automated index management functionality. They can be organized in clusters and maintain the correct row order without the need for manual intervention. Partial indexes and multiple-index searches are also supported by SQL Server.

Features

Unlike other SQL databases, PostgreSQL does not include a built-in job scheduler. External tools such as cron, pgAgent, or pg cron on Linux, and SQLBackupAndFTP or Task Scheduler on Windows, are required for repetitive tasks.

SQL Server tasks, on the other hand, can be easily scheduled through SQL Server Management Studio.

PostgreSQL has a well-developed multi-version concurrency control (MVCC) that allows it to handle multiple procedures at once. MVCC provides database snapshots to avoid displaying inconsistencies caused by concurrent transactions or data locking in other database systems. To ensure transaction isolation, PostgreSQL employs serializable snapshot isolation (SSI).

SQL Server has a less developed multi-version concurrency control system and, by default, relies on data locking to avoid errors from concurrent transactions. SQL Server also includes an optimistic concurrency feature, which assumes that such problems are uncommon. Instead of locking a row, it is checked against a cached version to see if any changes have occurred.

Partitioning and Sharding

When performance gains are required for larger databases and you’ve exhausted your stored procedures, as well as your hardware, you’ll need to distribute the work across multiple servers. Partitioning and sharding come into play here.

While both sharding and partitioning involve dividing a large dataset into smaller subsets, sharding implies that the data is spread across multiple computers, whereas partitioning does not.

PostgreSQL 10.0 introduces declarative partitioning — partitioning by range, list, or hash.

MS SQL Server supports horizontal partitioning, which is the process of dividing a table with many rows into several tables with fewer rows.

MS SQL Server also supports federated sharding. “Federated partitioned views” are views in which tables are distributed across multiple servers to balance processing load.

Certain commands are required to retrieve the records from the servers. These are known as distributed partitioned views. They use standard SQL statements, as well as the keyword UNION, to retrieve data from all of the distributed servers.

Similarly, DML statements (INSERT, UPDATE, and DELETE) can be used when specific rules on the underlying tables are observed. It’s also worth noting that federated partitioned views are only available in enterprise editions.

Though federated partitioned views can be implemented on any other edition because there is no distinguishing syntax for them, they will not be recognized as such. Only enterprise editions have the rules to recognize the view as partitioned across servers.

Most applications benefit from a 20% to 30% increase in performance when using this partitioning technique. As a result, it’s a very useful tool if your company manages a lot of data.

Replication

While partitioning divides the database into smaller subsets and distributes the partitioned tables to different nodes, replication duplicates the database across multiple databases to provide a faster look and faster response time.

PostgreSQL supports primary and secondary replication. This can be done synchronously or asynchronously. Write-ahead logs (WALs) enable asynchronous replication by sharing changes with replica nodes.

Logical replication, streaming replication, and physical replication are the most common types of replication.

  • Logical replication follows a publish and subscribe model. Changes are based on the identity of the data replication, like its primary key, rather than its physical location.
  • Streaming replication essentially streams the WALs as soon as the file is created, thus enabling standby servers to be quickly updated, instead of waiting for the file to be filled.
  • Lastly, physical replication is usually implemented with files and directories, with no regard for the contents within the physical location. PostgreSQL doesn’t offer multi-primary replication natively, but it can be executed with the help of other third-party tools.

SQL Server replication is the process of replicating data from a publisher server to a subscriber server. Depending on the SQL Server edition, it can be synchronous or asynchronous. It provides three replication options: transactional replication, snapshot replication, and merge replication.

  • Transactional replication is typically implemented for server-to-server environments, where modifications are delivered from the publisher to the subscriber as they happen.
  • Merge replication is usually implemented in situations where conflicts might occur, for server-to-client environments, or where data can be changed and tracked on either the subscriber or publisher and is subsequently synchronized.
  • Snapshot replication is implemented when data is updated infrequently, doesn’t need to be altered incrementally, or where data is duplicated exactly as it appears at a specific moment. Furthermore, the enterprise edition offers peer-to-peer replication as an alternative solution to multi-primary node replication.

Language & Syntax

MS SQL is written in C and PostgreSQL is written in C and C++. PostgreSQL is very easy to use and connect to in terms of language binding due to its external API libpq, which is very well-designed and documented.

However, SQL Server external language bindings may be affected by a number of other factors. You may need to install additional drivers or create classes to store the queried data; therefore, you must know what the data looks like at compile time. You’d almost certainly need to consult the documentation, and following up could be time-consuming.

Both PostgreSQL and SQL Server offer robust support for procedural language features. PostgreSQL supports the JSON data type, and thanks to the procedural language feature, users can easily use Python, Java, PHP, Perl, and R with SQL.

While SQL Server does provide support, this feature has yet to be improved due to minor bugs, and it may take some time to implement due to its slowness. The user must first compile the code into a.dll file.

There is no need to first create a.dll file in PostgreSQL. As a foundation for analytical work, PostgreSQL also includes a large number of regular expressions (regex).

MS SQL Server, on the other hand, has fewer regex and supports commands such as substring and pattern index, which may not be as good as PostgreSQL.

Performance

In terms of performance, PostgreSQL outperforms SQL Server in several ways. We mentioned partitioning, and while both PostgreSQL and SQL Server support partitioning, PostgreSQL does so more efficiently and for free.

PostgreSQL also has better concurrency, which is important when multiple processes need to access and modify shared data at the same time. PostgreSQL’s MVCC feature reduces the possibility of deadlock by only blocking if two queries attempt to modify the same row at the same time and serialize the updates made to that row.

The MVCC lock obtained for data querying does not conflict with the locks obtained for data writing. This reduces lock contention and improves performance in multiuser environments.

SQL Server, on the other hand, has an underdeveloped concurrency model, and some processes may even be deadlocked. In contrast to the MVCC feature, when a row is updated, a new version of the row is created rather than overwriting the same row, and both are kept. Older versions are gradually moved into a system database called tempdb. However, it has a long way to go in terms of concurrency.

PostgreSQL also provides indexing support for several extensions, which improves database performance.

SQL servers, on the other hand, have yet to improve their indexing implementation, and they have yet to include arrays — one of the most commonly used variable types.

Pricing

PostgreSQL was distributed under the PostgreSQL License, which is a permissive open-source license. The PostgreSQL Global Development Group is still dedicated to keeping PostgreSQL available as free and open-source software in perpetuity. PostgreSQL will not be changed or released under a different license.

MS SQL Server was released as part of Microsoft products under a commercial license. The database was made available as a free tool for developers in early 2016, but it only supports one processor and 1GB of maximum memory. While it is free, it lacks several features that a business may require. If you need more servers, you may have to pay $899 per server. SQL Server enterprise edition now costs $13,748.

Scalability

Scalability refers to a database system’s ability to continue to function well when data is increased to meet a user’s need without compromising performance.

PostgreSQL has many scalability features and can use multiple CPU cores to quickly implement queries in parallel.

SQL Server can use cores as well, but the standard version is limited to twenty-four CPU cores. The enterprise version enables the use of an unlimited number of CPU cores. SQL Server also has a hyper-scale feature that allows you to set lower and upper limits, allowing you to scale downwards and upwards as needed.

Security

With the rise of data theft, hacking, and piracy, security has risen to the top of the priority list for database systems. Both SQL Server and PostgreSQL, on the other hand, provide excellent data encryption and authentication.

Authentication Methods

PostgreSQL provides advanced authentication methods on the server, such as lightweight directory access protocol (LDAP) and pluggable authentication module (PAM), which may reduce the attack surface of PostgreSQL database servers. PostgreSQL server listen address, host-based authentication, and certificate authentication are among the other server-level security enhancements.

There are two server-level security enhancement features in MS SQL Server: Windows authentication mode and mixed-mode, which includes authentication by both Windows Server and MS SQL Server. MS SQL Server’s security model is tightly integrated with the Windows authentication mode of Windows Server and the database.

Data Encryption

When your data is travelling through the web or public network highways, PostgreSQL provides data encryption and allows you to use secure sockets layer (SSL) certificates. It also gives you the option of implementing client certificate authentication tools. Furthermore, you can use cryptogenic functions in PostgreSQL to store encrypted data that support both symmetric-key and public-key encryptions.

Transparent data encryption (TDE), always encrypted, and column-level encryption are data encryption features available in MS SQL Server. TDE encrypts physical files, which include both data and log files, using the advanced encryption standard (AES) algorithm. The always encrypted feature enables you to encrypt specific columns while they are at rest or in motion (i.e. the data remains encrypted in memory as well).

User-Level Privileges

Furthermore, in both PostgreSQL and SQL Server, you can manage different users and their permissions (read, write).

PostgreSQL provides user-level privileges in the form of role assignments, table-level privileges in the form of roles, and role inheritance. The auditing option allows you to review data access activities in your database by users and groups, adding an extra layer of security.

SQL Server accomplishes this through the use of user groups and roles. Permissions are granted to the user account directly, and permissions are inherited from a parent resource.

By monitoring and auditing SQL Server activities, you can also identify concurrency issues, long-running queries, and regular workload metrics.

Storage

Storage is a critical component of the performance of any database system. With the increase in server processing power and large-scale memory support, it is becoming increasingly important for databases to allow for more storage capabilities in the system.

PostgreSQL is a relational database system, whereas Microsoft SQL Server is an object-relational database system. This means that PostgreSQL supports more complex data types and object inheritance, but it also makes working with PostgreSQL more difficult. It has a single ACID-compliant storage engine and creates a new system process for each client connection with its memory allocation. As a result, as the number of client connections on a system grows, more memory must be allocated.

Support & Community

PostgreSQL provides free updates on a regular basis. The PostgreSQL Global Development Group recently released an update to all supported versions of the database system, addressing over 55 bugs reported in the previous three months. PostgreSQL has a large community of developers, third-party companies, and enthusiasts who help to develop the system by fixing reported bugs.

Every few years, SQL Server releases a new version. The costs of support are determined by the license’s terms and conditions. Microsoft SQL Server also has a support community where database analysts, developers, system administrators, and anyone else interested in the platform can ask questions or learn more about SQL Server through podcasts and webcasts such as SQL Server Radio with Guy Glantser and Eitan Blumin, where users learn a lot about SQL Server and its compatibility with other Microsoft tools.

Plugins are available for both PostgreSQL and SQL Server. Pricing and compatibility are determined by the plugin. Plugins can help you manage, clean, and backup your database, among other things.

Adminer, for example, is a data management tool that can manage data in both PostgreSQL and MS SQL Server. Other database plugins that can be used to improve database efficiency include WP-Optimize, Better Search Replace, and WP Database Backup, to name a few. Data migration costs may be incurred when upgrading any database system, but this is standard for any other standard DBMS.

Triggers & Events

Depending on your use case, PostgreSQL has a variety of advanced triggers from which to choose. AFTER, BEFORE, and INSTEAD OF triggering events are supported, and they can be used to manipulate data for INSERT, UPDATE, and DELETE events. As previously stated, PostgreSQL can run these triggers dynamically and does not require them to be compiled into a.dll file before execution. When the trigger is triggered, the functions listed above can be used to execute a complex query.

SQL Server provides a variety of triggers for various types of database events, including DML triggers, DDL triggers, and logon triggers:

  • DML triggers or data manipulation language triggers are triggers used to manipulate data, by inserting, updating, or deleting records.
  • DDL triggers are for data definition language (DDL) events, like creating, dropping, or altering a database.
  • Logon triggers are used for logon events, like when a user session is established. These triggers fire after successful authentication and before establishing the user session. They are useful for auditing and controlling login activity.

Views

Views are essentially virtual tables that do not physically store data. They are typically used to limit user access to data for security reasons. Updatable views are supported by both PostgreSQL and SQL Server.

However, in PostgreSQL, updates do not happen automatically unless the following conditions are met:

  • There should be a section in the FROM clause in the query of that view. The section can be from a table or another updatable view.
  • There should be no window functions, aggregate functions, or set-returning functions in the selection list.
  • The query mustn’t include the commands HAVING, LIMIT, DISTINCT, WITH, INTERSECT, EXCEPT, OFFSET or LIMIT at the top level.

In short, views created with simple queries can be updated, whereas views created with complex queries are nearly impossible to update. Complex views, on the other hand, can be updated using rules. While PostgreSQL does not support running materialized views, it does have a module called matviews that can assist in rebuilding any materialized view.

Views can be automatically updated in SQL Server, and both user-defined and system-defined views are supported. Furthermore, if two table views have different keys and the update statement does not involve more than one table, they are updated at the same time.

Shortcomings of SQL Server and PostgreSQL

While we’ve covered every detail about PostgreSQL and SQL Server, both have drawbacks.

PostgreSQL is open source and not owned by a single organization. As a result, despite being heavily promoted, it has struggled to gain traction among the general public. PostgreSQL prioritizes compatibility over speed. As a result, modifications designed to improve speed necessitate more effort.

SQL Server, on the other hand, has frequently been chastised for its poor user interface. It has complex performance tuning features but no native source control support. If you’re using it for your business, the enterprise version may break the bank. SQL Server 2019 enterprise edition alone costs $13,748 — the equivalent of thirteen Ikea rooms! Furthermore, licensing can be difficult to understand and is constantly changing.

If PostgreSQL and SQL Server aren’t your cup of tea, you can try MongoDB or MariaDB for your specific use case.

MongoDB is a free, cross-platform document-oriented database program that can easily leverage JSON-like documents.

MariaDB, on the other hand, is a commercially supported fork of MySQL with pluggable and purpose-built storage engines that support workloads that would otherwise require a wide range of different databases.

PostgreSQL vs SQL Server: Which Database Should You Choose?

Both PostgreSQL and SQL Server are popular relational databases, but who wins? According to the comparisons above, PostgreSQL outperforms SQL Server in several scenarios. It is not only open-source and free, but it also has a number of features that are easily accessible and can be implemented automatically, as opposed to Microsoft SQL Server.

Furthermore, PostgreSQL has a better concurrency management system. It can handle cases where multiple processes access and modify shared data at the same time brilliantly.

If you run a small business, PostgreSQL may be a good choice because it is free and has several useful data management features. It is simple to install and can be used with almost any operating system. However, for businesses that have made a significant investment in the Microsoft SQL Server stack, SQL Server has advantages over PostgreSQL.

Summary

All in all, both PostgreSQL and SQL Server are functional and multifaceted databases. While PostgreSQL can be used for almost any operating system and is suitable for small businesses that require maximum functionality, SQL Server is the best for huge businesses, especially those that require the use of Microsoft products.

In this article, we’ve covered the major differences between PostgreSQL and SQL Server, and their functions. The “right” choice will eventually come down to how you plan to run your business.

Between PostgreSQL vs SQL Server, which database would you plan on using for your next project, and why? We’d love to hear your thoughts! Share them in the comment section below.

Share this post

Leave a Reply

Your email address will not be published. Required fields are marked *