Introduction
In today’s business, it is critical to respond as fast as possible to opportunities and problems as they happen.
These business events can be detected and collected for immediate processing resulting in an alert to a front-line user or an update message to an operational system.
Teradata parallel database triggers manage exactly this kind of live event.
Typically, every X minutes, a dashboard function checks the queue table for significant events, filters out those that aren’t important, and finds one serious shipper delay that will affect profitability.
All this is possible with Teradata triggers, stored procedures, and queue tables that are easy to program and link to production applications.
How does a particular Queue table work?
It’s similar to ordinary base tables, with the additional unique property of behaving like an asynchronous first-in-first-out (FIFO) queue.
When you create a queue table, you must define a TIMESTAMP column QITS (Queue Insertion TimeStamp) with a CURRENT_TIMESTAMP default value.
The column values indicate the time the rows were inserted into the queue table unless different, user-supplied values are inserted:
You can use an INSERT statement, which operates as a FIFO push

You can use a SELECT statement, which works like a FIFO peek
The row is deleted from the queue table, guaranteeing that the row is processed only once.
We perform another peek operation to check out the previous pop operation. The result is correct: the first record was correctly consumed.
If no rows are available, the transaction enters a delay state until one of the following actions occur:
• A row is inserted into the queue table
• The transaction aborts, either as a result of direct user intervention, such as the ABORT statement, or indirect user intervention, such as a DROP TABLE statement on the queue table.
Queue Tables and Performance
For Queue tables, we have to stay aware on:
– Swap out a queue table that has been spoiled. For example, if a queue table has had a delete operation performed, it is a purge candidate from the FIFO cache.
– Purge an inactive queue table from the FIFO cache.
Limitations on Queue Tables
Creation or altering may not:
See article: The Teradata Partitioned Primary Index (PPI) Guide
Remember that the purpose of a permanent journal is to maintain a sequential history of all changes made to the rows of one or more tables, and
protect user data when users commit, un-commit, or abort transactions.
See article: Teradata Permanent Journal
Hi Jiri, you’re welcome, thank you for the question!
Teradata uses QITS column to maintain the FIFO ordering of rows in the queue table.
The queue table FIFO cache row entry is in fact a pair of QITS and rowID values for each row to be consumed from the queue, sorted in QITS value order. So, yes, for instance when you execute the query “Select and consume top 1 from queue_table” the system is able to retrieve the queue table row at the top of the FIFO queue from a single AMP.
Hi Stelvio, thank you very much for your reply! I’ve got a follow-up question, though. In which way does the FIFO cache affect the query performance of queue tables? Does it contain, for example, statistic-like information on QTIS column so the Teradata could perform a single-AMP data retrieval?
Thank you very much indeed Jiri.
Basically the Queue FIFO cache purpose is improve the performance for consuming rows from queue tables. The FIFO caches are created by the system during startup, and hold row information for a number of non‑consumed rows for each queue table. The Dipsatcher is responsible for maintaining this cache.
Hi Stelvio, great article! Just a question regarding the FIFO cache. What is its purpose and what does it contain? Thanks! 🙂