blob: 28e6ef55ff9060b8cf814c90fcdaf5edff3b0ae8 [file] [log] [blame]
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/create_resource_queue.sgml,v 1.4.2.1 2006/10/05 03:06:17 dhutchinson Exp $
PostgreSQL documentation
-->
<refentry id="SQL-CREATERESOURCEQUEUE">
<refmeta>
<refentrytitle id="sql-createresourcequeue-title">CREATE RESOURCE QUEUE</refentrytitle>
<refmiscinfo>SQL - Language Statements</refmiscinfo>
</refmeta>
<refnamediv>
<refname>CREATE RESOURCE QUEUE</refname>
<refpurpose>create a new resource queue for workload management</refpurpose>
</refnamediv>
<indexterm zone="sql-createresourcequeue">
<primary>CREATE RESOURCE QUEUE</primary>
</indexterm>
<refsynopsisdiv>
<synopsis>
CREATE RESOURCE QUEUE name WITH (queue_attribute=value [, ... ])
where queue_attribute is:
ACTIVE_STATEMENTS=integer
[ MAX_COST=float [COST_OVERCOMMIT={TRUE|FALSE}] ]
[ MIN_COST=float ]
[ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]
[ MEMORY_LIMIT='memory_units' ]
| MAX_COST=float [ COST_OVERCOMMIT={TRUE|FALSE} ]
[ ACTIVE_STATEMENTS=integer ]
[ MIN_COST=float ]
[ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]
[ MEMORY_LIMIT='memory_units' ]
</synopsis>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
<para>
<command>CREATE RESOURCE QUEUE</command> create a new resource queue
for Greenplum Database workload management. A resource queue must have
either an ACTIVE_STATEMENTS or a MAX_COST value (or it can have both).
Only a superuser can create a resource queue.
</para>
<para>
Resource queues with an ACTIVE_STATEMENTS threshold set a maximum limit
on the number of queries that can be executed by roles assigned to that
queue. It controls the number of active queries that are allowed to run
at the same time. The value for ACTIVE_STATEMENTS should be an integer
greater than 0.
</para>
<para>
Resource queues with a MAX_COST threshold set a maximum limit on the total
cost of queries that can be executed by roles assigned to that queue. Cost
is measured in the estimated total cost for the query as determined by the
Greenplum Database query planner (as shown in the EXPLAIN output for a query).
Therefore, an administrator must be familiar with the queries typically executed
on the system in order to set an appropriate cost threshold for a queue. Cost is
measured in units of disk page fetches; 1.0 equals one sequential disk page read.
The value for MAX_COST is specified as a floating point number (for example 100.0)
or can also be specified as an exponent (for example 1e+2). If a resource queue is
limited based on a cost threshold, then the administrator can allow
COST_OVERCOMMIT=TRUE (the default). This means that a query that exceeds
the allowed cost threshold will be allowed to run but only when the system is idle.
If COST_OVERCOMMIT=FALSE is specified, queries that exceed the cost limit will
always be rejected and never allowed to run. Specifying a value for MIN_COST
allows the administrator to define a cost for small queries that will be
exempt from resource queueing.
</para>
<para>
If a value is not defined for ACTIVE_STATEMENTS or MAX_COST, it is set to -1 by
default (meaning no limit). After defining a resource queue, you must assign roles
to the queue using the ALTER ROLE or CREATE ROLE command.
</para>
<para>
You can optionally assign a PRIORITY to a resource queue to control the relative
share of available CPU resources used by queries associated with the queue
in relation to other resource queues. If a value is not defined for PRIORITY,
queries associated with the queue have a default priority of MEDIUM.
</para>
<para>
Resource queues with an optional MEMORY_LIMIT threshold set a maximum limit
on the amount of memory that all queries submitted through a resource queue
can consume on a segment host. This determines the total amount of memory that
all worker processes of a query can consume on a segment host during query execution.
</para>
<para>
Greenplum recommends that MEMORY_LIMIT be used in conjunction with ACTIVE_STATEMENTS
rather than with MAX_COST. The default amount of memory allotted per query on
statement-based queues is: MEMORY_LIMIT / ACTIVE_STATEMENTS. The default amount
of memory allotted per query on cost-based queues is:
MEMORY_LIMIT * (query_cost / MAX_COST).
</para>
<para>
The default memory allotment can be overridden on a per-query basis using
the statement_mem server configuration parameter, provided that MEMORY_LIMIT
or max_statement_mem is not exceeded. For example, to allocate more memory
to a particular query:
=> SET statement_mem='2GB';
=> SELECT * FROM my_big_table WHERE column='value' ORDER BY id;
=> RESET statement_mem;
</para>
<para>
As a general guideline, MEMORY_LIMIT for all of your resource queues should not
exceed the amount of physical memory of a segment host.If workloads are staggered
over multiple queues, memory allocations can be oversubscribed. However, queries
can be cancelled during execution if the segment host memory limit specified
in hawq_re_memory_overcommit_max is exceeded.
</para>
</refsect1>
<refsect1>
<title>Parameters</title>
<variablelist>
<varlistentry>
<term><replaceable class="parameter">name</replaceable></term>
<listitem>
<para>
The name of the new resource queue.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>ACTIVE_STATEMENTS</literal> <replaceable class="parameter">integer</replaceable></term>
<listitem>
<para>
Resource queues with an <literal>ACTIVE_STATEMENTS</literal>
limit the number of queries that can be executed by roles assigned
to that queue. It controls the number of active queries that are
allowed to run at the same time. The value for <literal>ACTIVE_STATEMENTS</literal>
should be an integer greater than 0. If a value is not defined for
<literal>ACTIVE_STATEMENTS</literal>, it is set to -1 by default (meaning no limit).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>MAX_COST</literal> <replaceable class="parameter">float</replaceable></term>
<listitem>
<para>
Resource queues with a <literal>MAX_COST</literal> limit the total cost of
queries that can be executed by roles assigned to that queue. Cost
is measured in the estimated total cost for the query as determined
by the query planner (as shown in the <command>EXPLAIN</command> output for a query).
Therefore, an administrator must be familiar with the queries typically
executed on the system in order to set an appropriate cost threshold for
a queue. Cost is measured in units of disk page fetches; 1.0 equals one
sequential disk page read. The value for <literal>MAX_COST</literal>
is specified as a floating point number (for example 100.0) or can also be
specified as an exponent (for example 1e+2). If a value is not defined
for <literal>MAX_COST</literal>, it is set to -1 by default
(meaning no limit).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>MIN_COST</literal> <replaceable class="parameter">float</replaceable></term>
<listitem>
<para>
If a Resource queue has an <literal>MIN_COST</literal> &gt; 0
any query whose cost is &lt; this value is not queued i.e it is ignored
for resource scheduling purposes.
</para>
<para>
A value of -1.0 means all queries are ignored. This is the default.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>COST_OVERCOMMIT</literal></term>
<listitem>
<para>
These clauses determine whether the <literal>resource queue</literal>
will allow statements whose potential <literal>cost</literal> is
larger than the queue's <literal>cost threshold</literal> to execute.
</para>
<para>
In the default <literal>COST_OVERCOMMIT=FALSE</literal> case, such statements
produce an error. If <literal>COST_OVERCOMMIT</literal> is set for the
queue, then they will be allowed to run when there are no other
statements in the queue.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1>
<title>Notes</title>
<para>
To enable the resource scheduling and workload management feature,
you must set the <literal>postgresql.conf</literal> parameter
<literal>resource_scheduler</literal> to <literal>on</literal>.
</para>
<para>
Use <xref linkend="SQL-ALTERRESOURCEQUEUE" endterm="SQL-ALTERRESOURCEQUEUE-title"> to
change the attributes of a resource queue, and <xref linkend="SQL-DROPRESOURCEQUEUE"
endterm="SQL-DROPRESOURCEQUEUE-title"> to remove a resource queue. All the attributes
specified by <command>CREATE RESOURCE QUEUE</> can be modified by later by the
<command>ALTER RESOURCE QUEUE</> command.
</para>
<para>
Use <xref linkend="SQL-ALTERROLE" endterm="SQL-ALTERROLE-title">
to add or remove users from a resource queue.
</para>
<para>
Use the <literal>pg_resqueue</literal> system catalog table to look up
information about an existing resource queue.
</para>
</refsect1>
<refsect1>
<title>Examples</title>
<para>
Create a resource queue with an active query limit of 20:
<programlisting>
CREATE RESOURCE QUEUE myqueue WITH (ACTIVE_STATEMENTS=20);
</programlisting>
</para>
<para>
Create a resource queue with a query cost limit of 3000.0:
<programlisting>
CREATE RESOURCE QUEUE webusers WITH (MAX_COST=3000.0);
</programlisting>
</para>
<para>
Create a resource queue with a query cost limit of 3 to the 10th power (or 30000000000.0):
<programlisting>
CREATE RESOURCE QUEUE myqueue WITH (MAX_COST 3e+10);
</programlisting>
</para>
<para>
Create a resource queue with both an active query limit and a query cost limit:
<programlisting>
CREATE RESOURCE QUEUE myqueue ITH (ACTIVE_STATEMENTS=30, MAX_COST=5000.00);
</programlisting>
</para>
</refsect1>
<refsect1>
<title>Compatibility</title>
<para>
There is no <command>CREATE RESOURCE QUEUE</command> in the SQL standard.
Resource scheduling is a feature of Bizgres and Greenplum Database.
</para>
</refsect1>
<refsect1>
<title>See Also</title>
<simplelist type="inline">
<member><xref linkend="sql-createrole" endterm="sql-createrole-title"></member>
<member><xref linkend="sql-alterrole" endterm="sql-alterrole-title"></member>
<member><xref linkend="sql-alterresourcequeue" endterm="sql-alterresourcequeue-title"></member>
<member><xref linkend="sql-dropresourcequeue" endterm="sql-dropresourcequeue-title"></member>
</simplelist>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"../reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/catalog"
sgml-local-ecat-files:nil
End:
-->