|
Строгий порядок строк в чужой таблице
|
|||
---|---|---|---|
#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 |
|
|
start [/forum/topic.php?fid=52&msg=40011752&tid=1880769]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
75ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 184ms |
0 / 0 |