sql dual что такое
Sql dual что такое
Серьезные знакомства teamo wearelove.ru/teamo/.
Еще раз о таблице DUAL
И.Гершанов с комментарием А.Бачина
Наш читатель Илья Гершанов написал в редакцию:
В недавней апрельской статье «Предупреждение проблем с таблицей DUAL», раздел «Опыт пользователей», написано, что если в таблице DUAL может оказаться более одной строки или не оказаться строк вовсе, то могут возникнуть проблемы.
Но, раз таблица фиктивная, то у нее нет сегмента, то и речи быть не может о добавлении строк. Был проведен эксперимент:
1. Запуск экземпляра в режиме » startup nomount » и запрос:
SVRMGR> select * from dual;
ADDR INDX INST_ID D
2. Перевод экземпляра в режим » alter database mount; » и запрос
SVRMGR> select * from dual;
ADDR INDX INST_ID D
3. Перевод экземпляра в работоспособное состояние » alter database open; » и запрос
SVRMGR> select * from dual;
Продолжим эксперименты с DML на таблице DUAL
4. Выполним следующие запросы в SQL*Plus. (Проверено на Oracle 8.0.6 и 8.1.7.)
SQL> select * from dual;
SQL> insert into dual values (‘Y’);
SQL> select * from dual;
SQL> delete from dual;
SQL> select * from dual;
SQL> delete from dual;
SQL> select * from dual;
Таким образом, SQL*Plus ограничивает все DML для DUAL по псевдостолбцу «. WHERE ROWNUM = 1. «.
Комментарий А.Бачина : Скажем спасибо Илье Гершанову за интересный эксперимент. Немного его продолжим и покажем, что именно механизм SQL*Plus ограничивает выборку одной строкой.
SVRMGR> insert into dual values (‘V’);
SVRMGR> insert into dual values (‘W’);
SVRMGR> insert into dual values (‘Y’);
SVRMGR> select * from dual;
И так далее. Но SQL*Plus верен себе
SQL> select * from dual;
SQL> select count(*) from dual;
SQL> select dummy from dual where dummy = ‘W’ ;
SQL> delete from dual where dummy in (‘Y’,’V’,’W’);
SQL> select * from dual;
Следовательно, в «недооткрытом» состоянии работает фиксированная (И.Гершанов неправильно называет ее фиктивной) таблица DUAL, вмонтирования в ядро Oracle.
После открытия базы начинает работать обычная (но специализированная) таблица словаря данных DUAL, про которую (скорее всего) только SQL*Plus «знает», что в ней только одно значение. Другие программные механизмы могут этого не знать, НО все пользуются однозначностью таблицы DUAL. Поэтому, если эта однозначность по каким-то причинам нарушена, то у многих приложений может «поехать крыша», со всеми вытекающими для пользователя результатами.
Поэтому АБД должен, как дворник (я не шучу), следить за чистотой вверенного ему пространства. Хорошо еще, что хоть не всякий scott/tiger сможет совершить такую диверсию.
What is the dual table in Oracle?
I’ve heard people referring to this table and was not sure what it was about.
14 Answers 14
It’s a sort of dummy table with a single record used for selecting when you’re not actually interested in the data, but instead want the results of some system function in a select statement:
e.g. select sysdate from dual;
It is a dummy table with one element in it. It is useful because Oracle doesn’t allow statements like
You can work around this restriction by writing
History
The DUAL table was created by Chuck Weiss of Oracle corporation to provide a table for joining in internal views:
I created the DUAL table as an underlying object in the Oracle Data Dictionary. It was never meant to be seen itself, but instead used inside a view that was expected to be queried. The idea was that you could do a JOIN to the DUAL table and create two rows in the result for every one row in your table. Then, by using GROUP BY, the resulting join could be summarized to show the amount of storage for the DATA extent and for the INDEX extent(s). The name, DUAL, seemed apt for the process of creating a pair of rows from just one. 1
It may not be obvious from the above, but the original DUAL table had two rows in it (hence its name). Nowadays it only has one row.
Optimization
DUAL was originally a table and the database engine would perform disk IO on the table when selecting from DUAL. This disk IO was usually logical IO (not involving physical disk access) as the disk blocks were usually already cached in memory. This resulted in a large amount of logical IO against the DUAL table.
Later versions of the Oracle database have been optimized and the database no longer performs physical or logical IO on the DUAL table even though the DUAL table still actually exists.
В каких случаях применяется DUAL и какой смысл этом?
Вопрос теоретический. Изучаю Oracle и встречаю такую конструкцию как DUAL. Понимаю, что это некоторая виртуальная таблица, но мне бы хотелось понять сам смысл этой штуки, зачем и когда применяется.
1 ответ 1
В синтаксически корректном запросе ОБЯЗАНА быть секция FROM.
Например, в запросе требуется набор чисел от 1 до 9. Задача решается простейшим CTE.
Аналогично будет, если в запросе нужен список кастомных литеральных значений. Например
Или если нужно выполнить какие-то вычисления с константами
Если обратиться к документации (Selecting from the DUAL Table), то:
DUAL is a table automatically created by Oracle Database along with the data dictionary. DUAL is in the schema of the user SYS but is accessible by the name DUAL to all users. It has one column, DUMMY, defined to be VARCHAR2(1), and contains one row with a value X. Selecting from the DUAL table is useful for computing a constant expression with the SELECT statement. Because DUAL has only one row, the constant is returned only once. Alternatively, you can select a constant, pseudocolumn, or expression from any table, but the value will be returned as many times as there are rows in the table. Refer to «About SQL Functions» for many examples of selecting a constant value from DUAL.
ДВОЙНАЯ таблица SQL
Что такое ДВОЙНОЙ стол?
Смотрите следующие команды:
Следующая команда отображает структуру таблицы DUAL:
Следующая команда отображает содержимое таблицы DUAL:
Следующая команда отображает количество строк таблицы DUAL:
Следующая команда отображает строковое значение из таблицы DUAL:
Следующая команда отображает числовое значение из таблицы DUAL:
Следующая команда пытается удалить все строки из таблицы DUAL:
Следующая команда пытается удалить все строки из таблицы DUAL:
Примечание. Команда DELETE используется для удаления строк из таблицы. После выполнения операции DELETE вам нужно выполнить COMMIT или ROLLBACK транзакцию, чтобы сделать изменение постоянным или отменить его. TRUNCATE удаляет все строки из таблицы. Операция не может быть отменена.
Следующая команда выбирает две строки из двух:
Вы также можете проверить системную дату из таблицы DUAL, используя следующую инструкцию:
Вы также можете проверить арифметическое вычисление из таблицы DUAL, используя следующую инструкцию:
Следующий код отображает числа 1..10 от DUAL:
В следующем коде DUAL предполагает использование декодирования с NULL.
ДВОЙНАЯ таблица: Oracle против MySQL
Но следующая команда будет выполнена (см. Вывод предыдущего примера):
В случае MySQL будет выполнена следующая команда:
В следующей таблице показано использование фиктивной таблицы в стандартной СУБД.
СУБД | Концепция пустышки |
---|---|
MSSQL | Нет концепции пустышки. |
MySQL | Нет концепции пустышки. |
оракул | Пустой стол: ДВОЙНОЙ. |
Informix | Начиная с версии 11.10, фиктивная таблица была включена: sysmaster: sysdual |
PostgreSQL | Нет концепции пустышки. |
DB2 | Пустой стол: SYSIBM.SYSDUMMY1 |
Упражнения по SQL
Хотите улучшить вышеуказанную статью? Вносите свои заметки / комментарии / примеры через Disqus.
Как работает таблица Oracle DUAL?
Мне кажется, это действительно странно. Если в двойном столбце нет столбца с именем 4 * 5, как работает оператор выбора?
Кроме того, почему я не вижу такого же поведения, когда создаю свою собственную двойную таблицу?
9 ответов
Таблица DUAL представляет собой специальную таблицу с одной строкой, существующую по умолчанию во всех установках базы данных Oracle. Он подходит для использования при выборе псевдоколонки, такой как SYSDATE или USER. В таблице есть один столбец VARCHAR2 (1) с именем DUMMY, который имеет значение «X».
Он не должен использоваться в производстве, если только вам не нужно вызывать определенные процедуры с помощью SQL.
Таблица DUAL имеет один столбец с именем DUMMY и одну строку, содержащую значение X.
Начиная с Oracle Database 10g Release 1, логический ввод-вывод не выполняется в таблице DUAL при вычислении выражения, которое не включает столбец DUMMY. Эта оптимизация указана как FAST DUAL в плане выполнения. Если вы выбрали столбец DUMMY из DUAL, тогда эта оптимизация не состоится и произойдет логический ввод /вывод.
В таблице dual2 нет строк. Если вы вставляете один, вы увидите то же поведение.
Таблица dual «работает» почти точно так же, как работает любая другая таблица: это таблица, из которой вы можете выбрать записи.
Это означает, например, что вы можете описать таблицу. Здесь, в SQL*Plus :
В таблице есть одна запись (по крайней мере, если никто ее не искал):
Теперь ваш запрос работает:
. чтобы увидеть, как осуществляется доступ к таблице:
Теперь то же самое с dual2 :
Кстати, DUAL является одной из немногих «таблиц», которая работает, когда экземпляр запущен, но база данных не была открыта.
Вы получаете что-то вроде
В дополнение к другим ответам, Oracle не так придирчив к пространству текста SQL (по крайней мере, в некоторых местах). Парсер SQL также в некоторых случаях токенизирует различия в символьных классах, а не просто пробелы.
Например, вы можете запускать такие выражения:
Также можно запускать SQL без каких-либо пробелов в нем:
У меня есть еще несколько примеров:
Вопрос уже ответил. Это некоторые примечания к цели двойной таблицы. Двойной может использоваться для оценки выражений в предложении select. Для этой цели многим другим системам баз данных не нужна такая таблица. MS SQL Server, MySql, Posgres может оценить следующий оператор
вызывает исключение, но
Его можно использовать для расширения набора результатов запроса
или сгенерировать данные с помощью выбранных запросов, используя либо CONNECT BY :
или рекурсивный CTE:
Для чего он стоит, он работает точно так же в MySQL.
Интересно, однако, что я не могу выполнить DESC по двойному MySQL, который отличается от Oracle, но он был введен специально AIUI, чтобы позволить синтаксису Oracle работать с MySQL.
В базе данных оракула двойная таблица в основном используется для получения значений псевдо-столбцов. Он содержит следующие свойства:
Если вы хотите получить более подробную информацию, отметьте здесь