title: What is the difference between NOPARALLEL and PARALLEL 1 in Oracle?
body: <p>What is the difference between <code>NOPARALLEL</code> and <code>PARALLEL 1</code>? If I create three tables like so:</p>
  <pre><code>CREATE TABLE t0 (i NUMBER) NOPARALLEL;
  CREATE TABLE t1 (i NUMBER) PARALLEL 1;
  CREATE TABLE t2 (i NUMBER) PARALLEL 2;
  </code></pre>
  <p>They show up in the data dictionary as</p>
  <pre><code>SELECT table_name, degree FROM user_tables WHERE table_name IN ('T0','T1','T2');
  
  TABLE_NAME  DEGREE
  T0               1 &lt;==
  T1               1 &lt;==
  T2               2
  </code></pre>
  <p>The <a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/parallel_clause.html#GUID-59C9EBF3-A45E-4EE5-ABE7-0DA0FCF6C4B5" rel="noreferrer">documentation</a>, however, states quite clearly</p>
  <blockquote>
  <p><em>NOPARALLEL</em>: Specify NOPARALLEL for serial execution. This is the default.</p>
  <p><em>PARALLEL integer</em>: Specification of integer indicates the degree of parallelism, which is the number of parallel threads used in the parallel operation. Each parallel thread may use one or two parallel execution servers.</p>
  </blockquote>
  <p>So, <code>NOPARALLEL</code> is definitely serial, while <code>PARALLEL 1</code> uses one thread, which may use one or two parallel servers??? But how can Oracle distinguish between both of them when the data dictionary stores the same value 1 for both?</p>
  <p>BTW, the <code>CREATE TABLE sys.tab$</code> statment in ?/rdbms/admin/dcore.bsq has the comment</p>
  <pre><code>/* 
   * Legal values for degree, instances: 
   *     NULL (used to represent 1 on disk/dictionary and implies noparallel), or
   *     2 thru EB2MAXVAL-1 (user supplied values), or
   *     EB2MAXVAL (implies use default value) 
   */
  degree        number,      /* number of parallel query slaves per instance */
  instances     number,        /* number of OPS instances for parallel query */
  </code></pre>