|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
Вопрос теоретический. Если есть таблица, в которой владелец не предусморел первичного ключа, есть ли метод для получения строк в стабильном порядке? Добавлять колонки нельзя. Стабильность определяется следующим образом: - повторяемость. Два запроса на неизменной таблице вернут одинаковый результат. - копируемость. Возможность создать копию, где запрос даст такой же результат. - локальность изменений. Изменение в одной строке не приводит к перетасовыванию остальных. Rowid не обладает свойством копируемости, SCN по умолчанию блочный. Если в Оракле можно отсортировать по значению всех колонок не перечисляя их поименно (order by *), это бы удовлетворило все критерии стабильности. К сожалению, синтакс такое не позволяет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 15:24 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
владелец не предусморел первичного ключа Договориться с владельцем. Без добавления колонок: составной первичный ключ. order by * Опять выдумываете сущности, Оккам негодует. Статический SQL: order by field1, field2, ... (структура данных должна быть определена). Динамический SQL: рисуем хоть черта лысого. При интеграции можно и выкачивать таблицу себе, хоть через dblink, хоть через любой конвертер. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 15:36 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
dmdmdm, Я перечислил известные мне методы, думал наверное что-то забыл. Забыл про динамический sql, с которым ещё не работал. Если он мне позволяет перечислить колонки в предсказуемом порядке, то это выглядит как ответ. "Order by *" это описание подхода - сравнение всей строки. Если бы SCN работал построчно по умолчанию, подошёл бы он. Оракл позволяет сортировать по названию индекса? Если так, то это был бы ещё один метод, причем быстрый. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 15:56 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Если бы SCN работал SCN, rowid и прочие низкоуровневые для программиста БД вещи вполне работают в своих узких областях применения. Лично вам их использовать пока рано. Оракл позволяет сортировать по названию индекса? Насколько я знаю, нет. Вы опять забегаете куда-то в дебри. Сделайте нужные фильтр, сортировку, научитесь читать планы запросов и использовать хинты. Пока вам этого за глаза хватит. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 16:03 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Вопрос теоретический. Если есть таблица, в которой владелец не предусморел первичного ключа, есть ли метод для получения строк в стабильном порядке? Добавлять колонки нельзя. Стабильность определяется следующим образом: - повторяемость. Два запроса на неизменной таблице вернут одинаковый результат. - копируемость. Возможность создать копию, где запрос даст такой же результат. - локальность изменений. Изменение в одной строке не приводит к перетасовыванию остальных. Rowid не обладает свойством копируемости, SCN по умолчанию блочный. Если в Оракле можно отсортировать по значению всех колонок не перечисляя их поименно (order by *), это бы удовлетворило все критерии стабильности. К сожалению, синтакс такое не позволяет. > - повторяемость. Два запроса на неизменной таблице вернут одинаковый результат. В SQL определен только один вариант определения порядка строк: ORDER BY В любом другом случае, СУБД имеет права выдавать строки как ей удобнее, например от наличия блока таблицы в кэше. > - копируемость. Возможность создать копию, где запрос даст такой же результат. Смотри пункт первый > - локальность изменений. Изменение в одной строке не приводит к перетасовыванию остальных. ... > Если в Оракле можно отсортировать по значению всех колонок не перечисляя их поименно (order by *), это бы удовлетворило все критерии стабильности. Одно утверждение, не стыкуется с другим! И вообще, первичный ключ - понятие логическое, определяется дизайном схемы в зависимости от поставленной задачи. Использование * для перечисления столбцов, в общем случае мина замедленного действия. Не ленитесь использовать имена столбцов явно. Тем более, есть служебные представления для автоматической генерации столбцов. Например я пользуюсь таким скриптом для этого: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Вместо order by *, поскольку количество столбцов в таблице конечно, и меняются они достаточно редко, кто Вам мешает проверить изменились ли столбцы перед запросом, и пересоздать динамически рабочую view? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 17:15 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Если есть таблица, в которой владелец не предусморел первичного ключа, есть ли метод для получения строк в стабильном порядке? Нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 17:40 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
Vadim Lejnin, Вы подтвердили что мое понимание таблиц верное, я и не надеялся на стабильность без присутствия команды сортировки (исключение - union all, но моему вопросу union all не помогает). Спасибо за конкретный пример, я его использую для эмуляции order by * Код: plsql 1. 2. 3. 4. 5. 6.
Это должно мне дать команду упорядочивания для динамического sql которая будет отвечать всем параметрам стабильной сортировки. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 17:45 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
Почитал про внутреннее представление rowid, научился контролировать их порядок при insert. Теперь order by rowid отвечает всем требованиям стабильной сортировки, исполняется быстрее чем сортировка по всем полям, и не требует динамический sql. Возьму на вооружение, если когда-то понадобится. На полный ключ они не тянут, а вот для быстрой сортировки для детерминистичности результата запроса - в самый раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 18:10 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
graycode НеофитSQL Если есть таблица, в которой владелец не предусморел первичного ключа, есть ли метод для получения строк в стабильном порядке? Нет. Order by rowid Оказалось проще чем я думал. Вы наверное тоже об этом знали. Осталось выяснить разницу между rowid и urowid. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 18:13 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL, Обезьяна с гранатой, как это мило ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 18:18 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Почитал про внутреннее представление rowid, научился контролировать их порядок при insert. ... Теперь прочитайте про row_movement_clause . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 18:23 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
Vadim Lejnin НеофитSQL Почитал про внутреннее представление rowid, научился контролировать их порядок при insert. ... Теперь прочитайте про row_movement_clause . Спасибо. Ценное замечание из которого следует что order by rowid может внезапно измениться для некоторых таблиц созданных с этой опцией. Хорошо что она выключена по умолчанию. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 18:53 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
1. При копировании в другую таблицу или бд rowid вряд ли останется тем же 2. Создать индекс по нескольким полям varchar2(4000) не удастся ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2020, 21:32 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
andreymx 1. При копировании в другую таблицу или бд rowid вряд ли останется тем же 2. Создать индекс по нескольким полям varchar2(4000) не удастся 1. Это так. Rowid уникален*, и его значение не подлежит копированию. Однако, вставки в пустую таблицу без partitions получают монотонно растущие rowid. Это позволяет сохранить порядок как в оригинале. 2. Сравнение всех колонок имеет несколько ограничений, поэтому rowid sort выглядит привлекательно. Правильный подход для новых данных - это по прежнему PK, я думаю какие приемы могут пригодиться для чтения и анализа старых данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2020, 00:04 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL вставки в пустую таблицу без partitions получают монотонно растущие rowid. Это позволяет сохранить порядок как в оригинале. Неверно. Ну почитайте уже, наконец, концепты - от несомой Вами ахинеи даже смеяться не хочется, тоска берет. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2020, 01:28 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL вставки в пустую таблицу без partitions получают монотонно растущие rowid. Это позволяет сохранить порядок как в оригинале. Неверно. Ну почитайте уже, наконец, концепты - от несомой Вами ахинеи даже смеяться не хочется, тоска берет. Не бойтесь новых знаний, независимо от вашего опыта. Посмотрите расшифровку 10-байтного rowid в официальной документации оракла, и многое станет понятным. Например, есть ситуации где Оракл использует order by rowid по умолчанию, и это поведение задокументировано. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2020, 03:56 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL andrey_anonymous пропущено... Неверно. Ну почитайте уже, наконец, концепты - от несомой Вами ахинеи даже смеяться не хочется, тоска берет. Не бойтесь новых знаний, независимо от вашего опыта. Посмотрите расшифровку 10-байтного rowid в официальной документации оракла, и многое станет понятным. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2020, 04:58 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Посмотрите расшифровку 10-байтного rowid в официальной документации оракла, и многое станет понятным. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2020, 10:01 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
Считаю, что для 99% sql-говнокодеров знание структуры rowid бесполезно ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2020, 10:42 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
кит северных морей операции обслуживания ... ваше требование повторяемости выполнено не будет И без них не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2020, 11:03 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
Можно конечно использовать сварочный аппарат вместо болтов для крепления колес, но для решения бизнес задач, нужно использовать бизнес решения. Если перед бизнесом стоит задача, которую Вы привели (Я правда не понимаю зачем), то решать нужно с помощью бизнеса: служебной запиской с обоснованием и требованием ресурсов. Бываю задачи, которые не решаются с помощью такой схемы: например таблица в базах гос структуры В этом случае задача распадается на две: синхронизация данных и обеспечение требований архитектуры. Есть стандартные средства, для решения стандартных задач, забивать гвозди пассатижами, кончено возможно, но они предназначены для другого. Для проверки изменились ли строки, можно использовать hash функции, а локальную копию таблицы, снабдить искуственным PK проблем нет. p.s. SQL функции ORA_HASH/STANDARD_HASH не доступны в PL/SQL, вместо них нужно использовать DBMS_CRYPTO.HASH ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2020, 15:14 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
Для синхронизации таблиц, есть стандартные средства: matview/goldengate, но они не всегда доступны, исходная талица может быть совсем не oracle ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2020, 15:17 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
Vadim Lejnin, Комментарии прочитаны и приняты. > Если перед бизнесом стоит задача, которую Вы привели (Я правда не понимаю зачем), Обсуждаемые "методы" никоим образом не относятся к бизнесу. Мне было интересно, что я мог использовать для построения нескольких дюжин запросов, анализируя свойства данных той или иной таблицы в копии рабочей базы данных, не внося изменений. Для анализа желательно исключить случайные перестановки строк, чтобы два похожих запроса были способны вернуть строки в одинаковом порядке. Order by rowid вполне подходит для такой полевой кухни, хотя позже я узнал, что этот порядок уже и так является по умолчанию для индексных запросов. Возможно и для других, ещё не проверял. Не удивлюсь, если "select * from TABLE" уже и так возвращает строки в порядке rowid по умолчанию. Надо сильно извергаться, чтобы оправдать порядок отличный от этого. Остаются запросы с сортировкой по выражению с повторяющимися значениями. Поскольку методы сортировки Оракла не являются стабильными*, детерминизм можно вернуть досортировав по rowid. * Стабильность сортировки это свойство, относящееся к обработке одинаковых значений. Замечания по поводу передвижения таблиц, сжатия таблиц справедливые и полезные. Есть ещё какие-то кластерные грабли, где сортировка по rowid может сломаться необычным и интересным способом, я не вдавался. Всем спасибо, я узнал много нового. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 03:26 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Order by rowid вполне подходит для такой полевой кухни, хотя позже я узнал, что этот порядок уже и так является по умолчанию для индексных запросов И собственно, если ты решил, что более поздние строки имеют больший ROWID, то ты таки хреново рассмотрел структуру ROWID ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 03:59 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL, В огороде бузина, в киеве дядька... > Для анализа желательно исключить случайные перестановки строк, чтобы два похожих запроса были способны вернуть строки в одинаковом порядке. Зачем? Если нужен порядок, то order by, если order by в запросе нет, то порядок для задачи не важен. Тем более для анализа "производительности"... Похоже, вы опять придумали себе гемор на ровном месте, как неумная женьщина: авторСама про него придумала Себя в уме его спросила Сама в уме за него ответила Сама на него обиделась Есть документация Performance Tuning Guide > Не удивлюсь, если "select * from TABLE" уже и так возвращает строки в порядке rowid по умолчанию. Надо сильно извергаться, чтобы оправдать порядок отличный от этого. Элементарно, 8000 активных сессий, 1024 CPU > Остаются запросы с сортировкой по выражению с повторяющимися значениями. Поскольку методы сортировки Оракла не являются стабильными*, детерминизм можно вернуть досортировав по rowid. А еще есть NLS Bomb... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 11:09 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Добавлять колонки нельзя. По какой причине? Добавление суррогатного ключа здесь напрашивается как наиболее разумное решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 11:41 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Остаются запросы с сортировкой по выражению с повторяющимися значениями. Поскольку методы сортировки Оракла не являются стабильными* ... * Стабильность сортировки это свойство, относящееся к обработке одинаковых значений. Хоспади, какая бредятина. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 12:08 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Комментарии прочитаны и приняты. ...но, к сожалению, не осознаны НеофитSQL Order by rowid вполне подходит rowid, если уж Вы рассмотрели его структуру, суть указатель на физическое размещение строки. Одно это должно было заставить Вас заподозрить подвох. Дальше неплохо бы знать пару кое-что про выделение места в табличных пространствах oracle rdbms, но для этого - увы и ах - надо было читать документацию. Есть как минимум три вещи, не позволяющие считать rowid монотонно возрастающим, и которые Вы никогда не сможете осознать на базе эспериментов над парой тысяч строк: 1. Обычное (не bigfile) табличное пространство может состоять (и обычно состоит) из нескольких файлов данных, заполняемых +-равномерно. В этом месте отсылаю к той самой структуре rowid, а именно - к компоненте "номер файла данных". 2. Место под хранение в табличном пространстве выделяется экстентами. Механизмов выделения экстентов исторически есть несколько штук, но в контексте обсуждаемого вопроса следует знать, что любой из них предпочтет расширению табличного пространства выделить место там, где оно есть по факту. Тут снова отсылаю к структуре rowid, компонент - номер блока. 3. Если вставка осуществляется conventional insert (т.е. без применения механизмов direct/append), то механика oracle предпочтет вставить новые строки в те блоки, которые значатся у него как свободные (т.е. не забитые под завязку). Этих механизмов тоже исторически есть несколько штук, но все они также работают на более плотную упаковку данных. Компоненты "Номер файла", "номер блока". Таким образом, даже без учета административных воздействий на БД полагаться на монотонность rowid суть большая глупость. НеофитSQL этот порядок уже и так является по умолчанию для индексных запросов. Не очень понятно что такое "индексный запрос". Подозреваю, что, не владея терминологией, Вы таким образом обозначили целый класс методов доступа к данным посредством btree-индекса (index full scan {ascending|descending}, index fast full scan, index range scan {ascending|descending}, index unique scan). Эти методы работают по разному, но есть одно общее свойство: ни один из них не будет возвращать данные в порядке rowid, поскольку btree-индексы по природе своей упорядочены по атрибутам, входящим в индекс - это важно. Подозреваю также, что с толку сбило упоминание о том, что btree отсортированы binary. Но осмысление этого замечание требует в дополнение к концептам и руководствам по разработке осознания еще одного фолианта - globalization support guide , без которого рассуждать на данные темы смысла нет. Опустим пока тот незамысловатый факт, что индексы oracle одним btree не ограничиваются и включают в себя bitmap, function-based и доменные индексы (к примеру, Oracle Text и Oracle Spatial, про кастомные реализации ODCIIndex и говорить пока не стоит). НеофитSQL Не удивлюсь, если "select * from TABLE" уже и так возвращает строки в порядке rowid по умолчанию. Надо сильно извергаться, чтобы оправдать порядок отличный от этого. Меньше знаешь - крепче спишь. На поверхности: - экстенты сегмента таблицы могут быть расположены в нескольких файлах данных - доступ может быть распараллелен - метод доступа может измениться НеофитSQL кластерные грабли Кластер кластеру люпус эст. Есть кластер как метод хранения данных, способный задать строкам разных таблиц один rowid. Есть RAC, в котором и без того не очень простые процессы добычи данных становятся еще сложнее ввиду кластерных взаимодействий (cache fusion). Общее замечание: oracle rdbms - штука сложная. Очень сложная. А еще - это черный ящик, в который мы иногда подглядываем через различные технологические отверстия. Даже признанные специалисты с многолетним бэкграундом не всегда знают "как наше слово отзовется". Потому не стоит делать серьезные выводы на основании пары простеньких экспериментов - Вы исследовали более чем ограниченную локацию и обобщения элементарно некорректны. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 13:35 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
andrey_anonymous Не очень понятно что такое "индексный запрос". Но, как обычно, видит только малую часть -- IOT не очень часто используемая вещь и даже в IOT метод доступа IFFS (Index Fast Full Scan) плюет на UROWID и, соответственно, любое упорядочевание ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 14:09 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Есть подозрение, что он имеет ввиду IOT и UROWID Эт вряд ли :) НеофитSQL есть таблица, в которой владелец не предусморел первичного ключа ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 14:41 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров НеофитSQL Order by rowid вполне подходит для такой полевой кухни, хотя позже я узнал, что этот порядок уже и так является по умолчанию для индексных запросов https://docs.oracle.com/cd/B13789_01/server.101/b10752/optimops.htm "Multiple rows with identical values are sorted in ascending order by rowid." > И собственно, если ты решил, что более поздние строки имеют больший ROWID, то ты таки хреново рассмотрел структуру ROWID Таких гарантий нет,т.к. rowid удаленных строк может использоваться для новых Однако у меня получилось создать клон таблицы с одинаковым порядком rowid для моих временных целей, ь.к. в новой таблице rowid аллокируется в возрастающем порядке. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 15:20 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL для моих временных целей ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 15:22 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL у меня получилось создать клон таблицы с одинаковым порядком rowid для моих временных целей, ь.к. в новой таблице rowid аллокируется в возрастающем порядке. рукалицо... andrey_anonymous не стоит делать серьезные выводы на основании пары простеньких экспериментов - Вы исследовали более чем ограниченную локацию и обобщения элементарно некорректны. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 15:22 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
Vadim Lejnin, > А еще есть NLS Bomb... К чему это? Порядок сортировки по rowid как раз не зависит от NLS settings. Про 1024 процессоров не знаю; документация оракла раньше обсуждала детерминизм строчек как если бы многопроцессорность не влияла на результаты исполнения отдельного запроса. Это все легко проверить контрпримером: словить один единственный случай, когда строки возвращаемые запросом без сортировки не следуют порядку rowid. Сортировка по умолчанию - это тема которая быстро вызывает гипертонию у начитанных специалистов, я предпочитаю не не развивать. Для индексных запросов оракл гарантирует определенный порядок по умолчанию, насчёт других я не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 15:32 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL ... Для индексных запросов оракл гарантирует определенный порядок по умолчанию... Конечно нет , без указания явного order by. Но иногда результат бывает похожим. И правда, иногда , такой идеей пользуются, если точно понимают , что делают. Но это хрустальный подход. Почитайте про "поиск по rowid" и подумайте о пределах предоставляемых гарантий для "индексных запросов", даже с оговоркой на то, что параллельных запросов у вас никогда не будет, и дезорганизация порядка от параллельности не приедет. А с учетом расширения вариаций доступа в новых версиях до rowid batched и clustered by rowid - чисто смехотворное упорство, которому давно следовало бы поискать лучшее применение. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 15:49 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Вячеслав Любомудров пропущено... Вот это про что сейчас было? https://docs.oracle.com/cd/B13789_01/server.101/b10752/optimops.htm "Multiple rows with identical values are sorted in ascending order by rowid." Ты бы хоть полную цитату приводил " target="_blank" rel="ugc">https://docs.oracle.com/cd/B13789_01/server.101/b10752/optimops.htm#45076]|> https://docs.oracle.com/cd/B13789_01/server.101/b10752/optimops.htm Index Range Scans An index range scan is a common operation for accessing selective data. It can be bounded (bounded on both sides) or unbounded (on one or both sides). Data is returned in the ascending order of index columns. Multiple rows with identical values are sorted in ascending order by rowid. Это тебе еще предстоит узнать, что не бывает неуникальных индексов -- просто в этом случае как поле сортировки ( при совпадающих остальных полях ) используется ROWID записи, ну просто потому, что он так и так является частью индекса ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 15:49 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL проверить контрпримером: словить один единственный случай, когда строки возвращаемые запросом без сортировки не следуют порядку rowid. Держи на бедность: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 16:07 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Это все легко проверить контрпримером: словить один единственный случай, когда строки возвращаемые запросом без сортировки не следуют порядку rowid. Сортировка по умолчанию - это тема которая быстро вызывает гипертонию у начитанных специалистов, я предпочитаю не не развивать. Для индексных запросов оракл гарантирует определенный порядок по умолчанию, насчёт других я не знаю. Ты немножко не с той стороны зашел. RowId - это техническая лабуда вроде номера физического сектора файла на диске. И к ней нельзя привязывать бизнес-запросы. Это все равно что тебя интересовал-бы номер физического сектора на диске. Или значение указателя в С++ приложении. Если тебе нужно чтобы просто данные не менялись между запросами - ну посмотри set transaction read only. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 17:57 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL проверить контрпримером: словить один единственный случай, когда строки возвращаемые запросом без сортировки не следуют порядку rowid. Держи на бедность: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
"На бедность". Мне так и не удалось создать таблицу которая размещалась бы в двух или более файлах. Как вы это сделали? Я даже прошерстил всю рабочую данных, каждая таблица умещается ровно в один файл. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 18:30 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Мне так и не удалось создать таблицу которая размещалась бы в двух или более файлах. Как вы это сделали? Создал таблицу. Наполнил данными, обеспечив выделение нескольких экстентов. Никаких - подчеркиваю - фокусов, это штатное поведение. Концепты надо изучать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 18:40 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL select * from USER_TABLES where tablespace_name = 'USERS' Убедитесь, что Ваше табличное пространство состоит более чем из одного файла. dba_data_files ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 18:45 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL проверить контрпримером: словить один единственный случай, когда строки возвращаемые запросом без сортировки не следуют порядку rowid. Держи на бедность: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Интересно, какая у вас версия Оракла? У меня не получается декодировать вышеперечисленные ROWID. Например, "AABKoNAB/AAADCPAAC" декодируется (басе-64) в 00004aa0 d00 1fc00000c23c000 12431 это 0х308F, 127 это 0x7F - это легкозаметные в шестнадзатеричномсочетания бит отсутствуют. Кроме Base-64, я не нашел других систем кодировок. Как эти ROWID сформированы? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 19:07 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL select * from USER_TABLES where tablespace_name = 'USERS' Убедитесь, что Ваше табличное пространство состоит более чем из одного файла. dba_data_files Точно. Всего один файл USERS.DBF, у меня какая-то игрушечная БД что ли? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 19:10 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL У меня не получается декодировать вышеперечисленные ROWID. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 19:12 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Всего один файл USERS.DBF, у меня какая-то игрушечная БД что ли? :) В промышленных БД редко держат данные в users, обычно создают табличные пространства под задачу. dba_tablespaces Подозреваю, что users - default tablespace используемой схемы, только и всего. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 19:14 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL У меня не получается декодировать вышеперечисленные ROWID. Например, "AABKoNAB/AAADCPAAC" декодируется (басе-64) в 00004aa0 d00 1fc00000c23c000 12431 это 0х308F, 127 это 0x7F - это легкозаметные в шестнадзатеричномсочетания бит отсутствуют. Кроме Base-64, я не нашел других систем кодировок. Как эти ROWID сформированы? Тебе это зачем? Тебе человек дал пакет dbms_rowid - вот и используй его! Тыж с Ораклом работаешь а не с абстрактным SQL. И вопрос 100% оракловый. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 19:22 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
mayton НеофитSQL Это все легко проверить контрпримером: словить один единственный случай, когда строки возвращаемые запросом без сортировки не следуют порядку rowid. Сортировка по умолчанию - это тема которая быстро вызывает гипертонию у начитанных специалистов, я предпочитаю не не развивать. Для индексных запросов оракл гарантирует определенный порядок по умолчанию, насчёт других я не знаю. Ты немножко не с той стороны зашел. RowId - это техническая лабуда вроде номера физического сектора файла на диске. И к ней нельзя привязывать бизнес-запросы. Это все равно что тебя интересовал-бы номер физического сектора на диске. Или значение указателя в С++ приложении. Если тебе нужно чтобы просто данные не менялись между запросами - ну посмотри set transaction read only. Они уже не меняются, база спящая / учебная. Ваш пример с диском кстати удачный. Еще не так давно, dir давал неупорядоченный список файлов по умолчанию, в физическом порядке в котором они перечислены в блоках директории. Поведение предсказуемое и повторимое, а также задокументированное. То же самое в линуксе, ls -u дает физический порядок имен файлов, который неизменен на read-only носителе. Упорядоченный по имени список файлов (Вин10) меня тоже устраивает, т.к. имя файла в директории обладает уникальностью, и порядок неоднозначно установлен. А вот сортировка по размеру, дате или другому возможно повторяющемуся параметру не годится для анализа, т.к. две идентичные директории могут показать файлы в отличающемся порядке. Кодеры Оракла приняли воинствующую позу по этому вопросу, чтобы обезопасить новичков от дорогих ошибок, и фраза "если нужен какой-то определенный порядок, только сортировка по уникальному ключу его обеспечит". Мы знаем из документации что это не совсем так, например select * from TBL х where x.val between 10 and 20 всегда даст строчки в одном и том же порядке при наличии индекса для val (группа val=10 упорядоченная по rowid, потом группа 11, и т.д.), но это скорее исключения которые представляют академический интерес. Узнав многое в этой теме, я согласен что rowid может обеспечивать определенный порядок на какое-то неизвестное время, и не для всех таблиц. С точки зрения изучения данных таблицы недоступной для записи, самое простое и надежное решение - сделать копию данных и добавить первичный ключ. Этот порядок созданный при, или вскоре после копирования, будет гарантированным на неограниченное время. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 19:45 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
mayton НеофитSQL У меня не получается декодировать вышеперечисленные ROWID. Например, "AABKoNAB/AAADCPAAC" декодируется (басе-64) в 00004aa0 d00 1fc00000c23c000 12431 это 0х308F, 127 это 0x7F - это легкозаметные в шестнадзатеричномсочетания бит отсутствуют. Кроме Base-64, я не нашел других систем кодировок. Как эти ROWID сформированы? Тебе это зачем? Тебе человек дал пакет dbms_rowid - вот и используй его! Тыж с Ораклом работаешь а не с абстрактным SQL. И вопрос 100% оракловый. Праздное любопытство, ничего более. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 19:47 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL У меня не получается декодировать вышеперечисленные ROWID. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Спасибо, теперь все понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 20:08 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Упорядоченный по имени список файлов (Вин10) меня тоже устраивает, т.к. имя файла в директории обладает уникальностью, и порядок неоднозначно установлен. А вот сортировка по размеру, дате или другому возможно повторяющемуся параметру не годится для анализа, т.к. две идентичные директории могут показать файлы в отличающемся порядке. В Windows 10 при файловой системе NTFS, файлы в директории лежат как B+Tree по имени файлов беря в качестве ключа имя файла. Тоесть это сортированная структура. Попробуй зайди в каталог c:\Windows и сделай dir без параметров. Ты увидишь какраз итерацию по этой сортированной структуре. Тоесть порядок стабилен до тех пор пока никто не всунул новый файл. А если это будет флешка отформатированная под FAT-32 то там будет порядок как "бог даст". ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 20:17 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
* ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 20:17 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Кодеры Оракла приняли воинствующую позу по этому вопросу Воинствующий здесь только ты, нежелание понять хотя бы самые базовые концепции просто потрясающее. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 20:44 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Кодеры Оракла приняли воинствующую позу по этому вопросу, чтобы обезопасить новичков от дорогих ошибок, и фраза "если нужен какой-то определенный порядок, только сортировка по уникальному ключу его обеспечит". Мы знаем из документации что это не совсем так, например select * from TBL х where x.val between 10 and 20 всегда даст строчки в одном и том же порядке при наличии индекса для val (группа val=10 упорядоченная по rowid, потом группа 11, и т.д.) Вас же не затруднит привести ссылку на документацию, которая это подтвердит. По секрету скажу, что это в общем случае тоже неправда, в отсутствие order by наличие индекса порядок не гарантирует. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 20:52 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
andrey_anonymous, На игрушечной базе, где всегда одна сессия... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 21:08 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
env andrey_anonymous, На игрушечной базе, где всегда одна сессия... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 21:13 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL Кодеры Оракла приняли воинствующую позу по этому вопросу, чтобы обезопасить новичков от дорогих ошибок, и фраза "если нужен какой-то определенный порядок, только сортировка по уникальному ключу его обеспечит". Мы знаем из документации что это не совсем так, например select * from TBL х where x.val between 10 and 20 всегда даст строчки в одном и том же порядке при наличии индекса для val (группа val=10 упорядоченная по rowid, потом группа 11, и т.д.) Вас же не затруднит привести ссылку на документацию, которая это подтвердит. По секрету скажу, что это в общем случае тоже неправда, в отсутствие order by наличие индекса порядок не гарантирует. Ссылка есть, правда для 10.х. https://docs.oracle.com/cd/B13789_01/server.101/b10752/optimops.htm Index Range Scans An index range scan is a common operation for accessing selective data. It can be bounded (bounded on both sides) or unbounded (on one or both sides). Data is returned in the ascending order of index columns. Multiple rows with identical values are sorted in ascending order by rowid. Я это перевел как написал выше. В то же время, анонимный Андрей ибн Москва же опубликовал пример ниже, противоречащий этому утверждению. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 23:10 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
andrey_anonymous env andrey_anonymous, На игрушечной базе, где всегда одна сессия... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
Эксперимент решает все. Андрей, а что вы сделали, чтобы два одинаковых запроса на таблице с индексом вернули строки в разном порядке? Я так не умею ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 23:12 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL чтобы два одинаковых запроса на таблице с индексом вернули строки в разном порядке? Да просто наличие индекса не означает его использование Ораклом. Он может решить, что и без индекса хороший план получился для выполнения запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 23:29 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
НеофитSQL Я так не умею Полагаю, через время Вы откроете для себя насколько дохрена не знаете/не умеете. Примите как факт: нельзя строить код на side-эффектах, в частности - нельзя строить код, зависящий от порядка строк, без закрепления посредством order by. Нель-зя. Точка. Применительно к примеру: да, в документации написано правильно. IRS действительно выдаст binary-ordered. Не обязательно ascending, но это детали. Однако приведенная Вами цитата касается IRS ASC и только IRS ASC. Причем исключительно в NOPARALLEL. Если оптимизатор примет решение использовать именно его - Вы угадали. А вот если решит иначе (время от времени это реально происходит) - то будет нежданчик. Причин, по которым оптимизатор применит иной метод доступа, достаточно много и не все из них самоочевидны. Одна из таких причин была мной спровоцирована в этом демо. Причем не суть важно какая из - докопаетесь до одной, я спровоцирую другую и все равно покажу Вам, что все несколько сложнее, чем представляется. Именно поэтому утверждение "порядок гарантирует order by и исключительно order by" верно. Если и сейчас не сумел донести эту простую мысль - то уже просто не знаю, как быть... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 23:44 |
|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#18+
Правильный Вася Он может решить, что и без индекса хороший план получился для выполнения запроса. Верно, но не полно. Даже с использованием одного и того же индекса можно получить весьма различный порядок строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2020, 23:48 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1880769]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
84ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
90ms |
get tp. blocked users: |
2ms |
others: | 316ms |
total: | 542ms |
0 / 0 |