This is an old revision of the document!


DRAFT

Omnidex SQL: CREATE TABLE

Description

The CREATE TABLE statement declares a table in an Omnidex Environment File. Tables that are declared in an environment can then be indexed and retrieved using SQL statements. An Omnidex table can point to an underlying Oracle, SQL Server, MySQL or ODBC table or view. An Omnidex table can also point to one or more raw data files that match the column layout of the table.

The basic CREATE TABLE statement records information about the underlying table or raw data files in the Omnidex Environment Catalog, but it does not actually create an underlying relational table or raw data file. Normally, the relational table or view file is created using the relational database's tools. In the case of raw data files, the files are usually received from a data provider, and application or an ETL tool. The CREATE TABLE statement simply stores meta-data about the table in the Omnidex Environment File. Omnidex does support an exception to this rule for the creation of temporary tables.

Table Characteristics

The CREATE TABLE statement declares the characteristics of the table. At a minimum, each table has a name and instructions for accessing the physical data. Omnidex supports configuration settings for each table, including settings to for delimited files, data caches and index maintenance. Omnidex also provides rollup tables which pre-aggregate another table in the database and automatically optimize queries against the table.

Columns Characteristics

The CREATE TABLE statement specifies the columns for a table. At a minimum, each column has a name and a datatype; however, it can also have other characteristics as well. Omnidex allows a column to have a different name than the one used in the underlying relational database. Omnidex allows the declaration of column usages that describe the purpose of the column. Omnidex also allows expression-based columns that are the result of a SQL expression, even if it does not exist in the underlying database or data file.

Table Constraints

The CREATE TABLE statement specifies the constraints for a table. The most common constraints are primary and foreign constraints, used to declare parent-child relationships between tables. Omnidex allows constraints to be declared on both relational tables and raw data files, allowing either to be described using a full relational model. Omnidex allows these constraints to be declared, but it does not verify or enforce these constraints.

Omnidex Indexing

Like most databases, Omnidex allows indexes to be declared using the CREATE INDEX statement. For convenience, Omnidex also allows indexes to be declared using the CREATE TABLE statement. In most applications, many (if not all) of the columns are indexed with Omnidex, so it is convenient to declare the indexing directly in the table specification.

Inlining

Omnidex allows constraints and indexing to be declared alongside each column. With inlining, the constraint and indexing specification is provided as each column is declared. This is a convenience for simple installations where most constraints and indexes consist of a single column.

Syntax

CREATE [ < GLOBAL | LOCAL > ] TEMPORARY ] TABLE table
    [ NODE node]
        [ OPTIONS "options" ] 
        [ PHYSICAL " ]
        [ AUTOFILTER "criteria" ]
        [ DATA_CACHING < cache_size | DYNAMIC | NONE > ]
        [ PARTITION_BY "criteria" ]
        [ INDEX_MAINTENANCE <API | DBMS> ]
    ( 
        column_specification,
        [ constraint_specification, ]
        [ index_specification, ]
        [ index_group_specification ]
    )
    [ AS statement ]
    [ IN filename ]
    [ WITH options ]

column_specification

    column_name  column_datatype 
        [ PHYSICAL "physical_name" ]
        [ USAGE usage ] 
        [ FORMAT format ]
        [ constraint_specification ] 
        [ index_specification ]
        [ AS expression ],

constraint_specification

Normal constraint definition:

  [ CONSTRAINT constraint ]
      < PRIMARY [ KEY ] ( column [, column ... ] )   |
        UNIQUE  [ KEY ] ( column [, column ... ] )   |
        DISTINCT [ KEY ] ( column [, column ... ] )  |
        FOREIGN [ KEY ] ( column [, column ... ] ) 
            REFERENCES table [ ( column [, column ... ] ) ] [ PREJOIN ]  > 

Inlined constraint definition:

  [ CONSTRAINT constraint ]
      < PRIMARY [ KEY ]  |
        UNIQUE  [ KEY ]  |
        DISTINCT [ KEY ] |
        FOREIGN [ KEY ] REFERENCES table [ ( column [, column ... ] ) ] [ PREJOIN ]  > 

index_specification

Normal index specification:

    [ < OMNIDEX | QUICKTEXT | FULLTEXT | CUSTOM | NATIVE > [INDEX] 
        ( < column | substring > [ , < column | substring > ... ] ) 
        indexing_options

Inlined index specification:

    [ < OMNIDEX | QUICKTEXT | FULLTEXT | CUSTOM | NATIVE > [INDEX] 
        indexing_options

indexing_options:

    Options available for OMNIDEX index:

        [ BITMAP ]
        [ STANDALONE ]
        [ < CASE_INSENSITIVE | CASE_SENSITIVE > ]

    Options available for QUICKTEXT indexes:

        [ < CASE_INSENSITIVE | CASE_SENSITIVE > ]

    Options available for FULLTEXT indexes:

        [ < CASE_INSENSITIVE | CASE_SENSITIVE > ]

    Options available for CUSTOM indexes:

        [ BITMAP ]
        [ STANDALONE ]
        [ KEYWORDING ]
        [ PROXIMITY ]
        [ < CASE_INSENSITIVE | CASE_SENSITIVE > ]
        [ EXCLUDED_WORDS ]
        [ PHONETIC ]
        [ PREJOIN table ]
        [ < RECORD_SPECIFIC | RECORD_COMPLEX > ]

index_group_specification

/* Omnidex Index Types */
            [< OMNIDEX | 
               QUICKTEXT | 
               FULLTEXT | 
               CUSTOM | 
               NATIVE> [ INDEX ] 

/* column options */
            [DEFAULT < literal | niladic-function | NULL >]
            [USAGE usage]
            [FORMAT format]
    [ , ]   /* separator between column and constraint definitions */

/* Inline Constraint Specifications - native indexes and Omnidex indexes */
          [CONSTRAINT constraint]
               <[NOT] NULL | UNIQUE [KEY] | DISTINCT [KEY] | PRIMARY [KEY] | [FOREIGN [KEY]] 
                   REFERENCES table(column[, column …]) [PREJOIN]>]

/* Inline Omnidex custom index options */
               [KEYWORDING] [PROXIMITY] [<CASE_INSENSITIVE | CASE_SENSITIVE>][STANDALONE]
               [BITMAP][EXCLUDED_WORDS][PHONETIC]
               [PREJOIN table][<RECORD_SPECIFIC | RECORD_COMPLEX>]]

/* Inline Omnidex pseudo or derived columns */          
         [AS “select_item”]

/* Separately defined Constraints and Omnidex Indexes */ 
    [[,] [CONSTRAINT constraint]
           < UNIQUE [KEY] (column_spec [, column_spec …]) |
           DISTINCT [KEY] (column_spec [, column_spec …]) |
           PRIMARY  [KEY] (column_spec [, column_spec …]) |
           FOREIGN  [KEY] (column_spec [, column_spec …]) 
               REFERENCES table(column_spec [, column_spec …] [PREJOIN] > ]

    [[,] <OMNIDEX | QUICKTEXT | FULLTEXT | CUSTOM | NATIVE> [INDEX] index
      (<column | substring> [, <column | substring>…])
      [KEYWORDING] [PROXIMITY] [ <CASE_INSENSITIVE | CASE_SENSITIVE> ]
      [STANDALONE][BITMAP][EXCLUDED_WORDS][PHONETIC]
      [PREJOIN table][<RECORD_SPECIFIC | RECORD_COMPLEX > ] ]

/* place the column in a previously declared Omnidex index group */
      [[,] INDEX GROUP [(owner)]group (index, index [, index ...])
    )]

    [AS “sql_statement”]

/* Specifics the physical Omnidex Environment file. This has to be the last clause */
    [< IN “env_filespec” | ON [INSTANCE] instance >]   

    [WITH options]

Discussion

CREATE ENVIRONMENT and CREATE DATABASE have to be specified before specifying CREATE TABLE.

The IN “filespec.xml” clause has to be specified after the column definitions.

Tables must be declared in order of their constraints.

Parent tables should be declared before children tables.

Typical Example

Most CREATE TABLE statements will typically look like the following example where Omnidex indexing is specified after the column_name and column_type.

CREATE TABLE mytable
  PHYSICAL "mydir/mytable.dat"
  (
    user_id         INTEGER         OMNIDEX,
    region          CHARACTER(2)    OMNIDEX,
    full_name       CHARACTER(30)   QUICKTEXT,
    address         CHARACTER(60)   QUICKTEXT,
    city            CHARACTER(30)   QUICKTEXT,
    state           CHARACTER(2)    OMNIDEX
  );

Examples

Simple CREATE TABLE with no Omnidex Indexing specified

create table "HOUSEHOLDS"
  physical   "dat\households*.dat"
  (
   "HOUSEHOLD"    character(12),
   "ADDRESS"      character(50),
   "CITY"         character(28),
   "STATE"        character(2),
   "ZIP"          character(5),
   "COUNTRY"      character(2),
   constraint HOUSEHOLD_HOUSEHOLD_PK primay ("HOUSEHOLD"),
   constraint HOUSEHOLD_STATE_fk FOREIGN ("STATE") references "states",
   constraint HOUSEHOLDS_COUNTRY_FK foreign ("COUNTRY") references "COUNTRIES"
  )
 in "simple.xml";
 

CREATE TABLE with Omnidex Indexing specified inline with the columns

Here is the same CREATE TABLE statement as above but with the Omnidex Index type specified for each column.

create table "HOUSEHOLDS"
  physical   "dat\households*.dat"
  (
   "HOUSEHOLD"    character(12)     omnidex,
   "ADDRESS"      character(50)     quicktext,
   "CITY"         character(28)     quicktext,
   "STATE"        character(2)      omnidex,
   "ZIP"          character(5)      omnidex,
   "COUNTRY"      character(2)      omnidex,
   constraint HOUSEHOLD_HOUSEHOLD_PK primay ("HOUSEHOLD"),
   constraint HOUSEHOLD_STATE_fk FOREIGN ("STATE") references "states",
   constraint HOUSEHOLDS_COUNTRY_FK foreign ("COUNTRY") references "COUNTRIES"
 )
 in "simple.xml";
 

CREATE TABLE with an Omnidex Composite Index

Here is the same CREATE TABLE statement as above but with the Omnidex Index type specified for each column.

Additionally, it creates an Omnidex Composite index and combines the STATE and CITY columns into a single index.

create table "HOUSEHOLDS"
  physical   "dat\households*.dat"
  (
   "HOUSEHOLD"    character(12)     omnidex,
   "ADDRESS"      character(50)     quicktext,
   "CITY"         character(28)     quicktext,
   "STATE"        character(2)      omnidex,
   "ZIP"          character(5)      omnidex,
   "COUNTRY"      character(2)      omnidex,
   constraint HOUSEHOLD_HOUSEHOLD_PK primay ("HOUSEHOLD"),
   constraint HOUSEHOLD_STATE_fk FOREIGN ("STATE") references "states",
   constraint HOUSEHOLDS_COUNTRY_FK foreign ("COUNTRY") references "COUNTRIES"
   omnidex index "HSHD_STATE_CITY" ("STATE","CITY")
 )
 in "simple.xml";
 

Types of Omnidex Indexes

There are three types of Omnidex indexes called Omnidex, QuickText, and FullText.

The following table shows the key types of retrieval properties of these Omnidex index types.

Omnidex QuickText FullText Custom
Criteria Yes Yes Yes
Counts Yes Yes Yes
Sum, Average, Min, Max Yes No No
Table Joins Yes No No
Group By Yes No No
Order By Yes No No
Geographic Searches Yes No No
Textual Searches No Yes Yes
Proximity Searches No No Yes
Relevancy Scoring No No Yes
Indexing Overhead Low Low High

In addition to the three basic Omnidex Index Types: Omnidex, QuickText, and FullText, there is a Custom Index Type that can be used to specify advanced indexing options.

Column Data Types

Number Data Type Length
CHAR(ACTER) # of characters
C STRING # of characters
VARCHAR # of characters
CLOB# of characters
NCHAR# of characters * 2
NC STRING # of characters
NVARCHAR # of characters
NCLOB (# of characters
OMNIDEX VARCHAR # of characters
OMNIDEX CLOB # of characters
[SIGNED] TINYINT 1
UNSIGNED TINYINT 1
[SIGNED] SMALLINT 2
UNSIGNED SMALLINT 2
[SIGNED] INTEGER 1, 2, 4, 8
UNSIGNED INTEGER 1, 2, 4, 8
[SIGNED] BIGINT 8
UNSIGNED BIGINT 8
FLOAT 4, 8
DOUBLE 8
DATE 10
ODBC DATE 6
DB2 DATE 6
INFORMIX DATE 4
ASCII DATE 6, 8 6, 8 (optional, default 8)
OMNIDEX DATE 1 - 4 2 - 8 (optional, default 8)
TIME 11
ODBC TIME 6
DB2 TIME 6
OMNIDEX TIME 1 - 4 2 - 8 (optional, default 8)
DATETIME 22
ORACLE DATETIME 7
ODBC DATETIME 6
DB2 DATETIME 16
INFORMIX DATETIME 24
C DATETIME 4
OMNIDEX DATETIME 1 - 8 2 - 16 (optional, default 16)
BLOB # of bytes
OMNIDEX BLOB # of bytes

Indexing Recommendations

  1. Generally Omnidex indexes should be put on the Parent primary key and the child foreign key.
  2. Create a composite index for group bys of multiple columns.
  3. Create a composite index of all group by columns plus the aggregate columns.
  4. Create a composite index of group bys in order of reduced cardinality
  5. consider a catch all index of all group by and metric columns
  6. add a foreign key to the composite index when grouping on a column in the snowflaked table.
 
Back to top
dev/sql/statements/create_table/home.1278215872.txt.gz · Last modified: 2016/06/28 22:38 (external edit)