powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Строгий порядок строк в чужой таблице
25 сообщений из 61, страница 1 из 3
Строгий порядок строк в чужой таблице
    #40011545
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос теоретический.

Если есть таблица, в которой владелец не предусморел первичного ключа, есть ли метод для получения строк в стабильном порядке?

Добавлять колонки нельзя.

Стабильность определяется следующим образом:

- повторяемость. Два запроса на неизменной таблице вернут одинаковый результат.

- копируемость. Возможность создать копию, где запрос даст такой же результат.

- локальность изменений. Изменение в одной строке не приводит к перетасовыванию остальных.

Rowid не обладает свойством копируемости, SCN по умолчанию блочный.

Если в Оракле можно отсортировать по значению всех колонок не перечисляя их поименно (order by *), это бы удовлетворило все критерии стабильности. К сожалению, синтакс такое не позволяет.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011550
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
владелец не предусморел первичного ключа

Договориться с владельцем. Без добавления колонок: составной первичный ключ.

order by *

Опять выдумываете сущности, Оккам негодует.

Статический SQL: order by field1, field2, ... (структура данных должна быть определена).
Динамический SQL: рисуем хоть черта лысого.

При интеграции можно и выкачивать таблицу себе, хоть через dblink, хоть через любой конвертер.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011555
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,

Я перечислил известные мне методы, думал наверное что-то забыл.

Забыл про динамический sql, с которым ещё не работал.
Если он мне позволяет перечислить колонки в предсказуемом порядке, то это выглядит как ответ.

"Order by *" это описание подхода - сравнение всей строки.
Если бы SCN работал построчно по умолчанию, подошёл бы он.

Оракл позволяет сортировать по названию индекса? Если так, то это был бы ещё один метод, причем быстрый.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011556
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Если бы SCN работал


SCN, rowid и прочие низкоуровневые для программиста БД вещи вполне работают в своих узких областях применения. Лично вам их использовать пока рано.

Оракл позволяет сортировать по названию индекса?

Насколько я знаю, нет. Вы опять забегаете куда-то в дебри.

Сделайте нужные фильтр, сортировку, научитесь читать планы запросов и использовать хинты. Пока вам этого за глаза хватит.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011561
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Вопрос теоретический.

Если есть таблица, в которой владелец не предусморел первичного ключа, есть ли метод для получения строк в стабильном порядке?

Добавлять колонки нельзя.

Стабильность определяется следующим образом:

- повторяемость. Два запроса на неизменной таблице вернут одинаковый результат.

- копируемость. Возможность создать копию, где запрос даст такой же результат.

- локальность изменений. Изменение в одной строке не приводит к перетасовыванию остальных.

Rowid не обладает свойством копируемости, SCN по умолчанию блочный.

Если в Оракле можно отсортировать по значению всех колонок не перечисляя их поименно (order by *), это бы удовлетворило все критерии стабильности. К сожалению, синтакс такое не позволяет.


> - повторяемость. Два запроса на неизменной таблице вернут одинаковый результат.
В SQL определен только один вариант определения порядка строк: ORDER BY
В любом другом случае, СУБД имеет права выдавать строки как ей удобнее, например от наличия блока таблицы в кэше.

> - копируемость. Возможность создать копию, где запрос даст такой же результат.
Смотри пункт первый

> - локальность изменений. Изменение в одной строке не приводит к перетасовыванию остальных.
...
> Если в Оракле можно отсортировать по значению всех колонок не перечисляя их поименно (order by *), это бы удовлетворило все критерии стабильности.

Одно утверждение, не стыкуется с другим!
И вообще, первичный ключ - понятие логическое, определяется дизайном схемы в зависимости от поставленной задачи.

Использование * для перечисления столбцов, в общем случае мина замедленного действия. Не ленитесь использовать имена столбцов явно. Тем более, есть служебные представления для автоматической генерации столбцов.
Например я пользуюсь таким скриптом для этого:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
--  auto generate column list 
-- use: colgen.sql owner table_name table_alias
select '        , '||'&3.."'||COLUMN_NAME||'"'
from all_tab_columns 
where 
	owner=upper('&1') 
	and TABLE_NAME=upper('&2')
order by column_id
/



Вместо order by *, поскольку количество столбцов в таблице конечно, и меняются они достаточно редко, кто Вам мешает проверить изменились ли столбцы перед запросом, и пересоздать динамически рабочую view?
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011565
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
Если есть таблица, в которой владелец не предусморел первичного ключа, есть ли метод для получения строк в стабильном порядке?

Нет.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011566
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,

Вы подтвердили что мое понимание таблиц верное, я и не надеялся на стабильность без присутствия команды сортировки (исключение - union all, но моему вопросу union all не помогает).

Спасибо за конкретный пример, я его использую для эмуляции order by *

Код: plsql
1.
2.
3.
4.
5.
6.
select 'order by TST.'||
       listagg(COLUMN_NAME,', TST.') Within group (order by COLUMN_NAME)
from all_tab_columns 
where 
	owner=NEOPHYTE and 
	TABLE_NAME='TST'



Это должно мне дать команду упорядочивания для динамического sql которая будет отвечать всем параметрам стабильной сортировки.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011569
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почитал про внутреннее представление rowid, научился контролировать их порядок при insert.

Теперь order by rowid отвечает всем требованиям стабильной сортировки, исполняется быстрее чем сортировка по всем полям, и не требует динамический sql.

Возьму на вооружение, если когда-то понадобится.

На полный ключ они не тянут, а вот для быстрой сортировки для детерминистичности результата запроса - в самый раз.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011570
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode
НеофитSQL
Если есть таблица, в которой владелец не предусморел первичного ключа, есть ли метод для получения строк в стабильном порядке?

Нет.


Order by rowid

Оказалось проще чем я думал. Вы наверное тоже об этом знали.

Осталось выяснить разницу между rowid и urowid.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011572
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

Обезьяна с гранатой, как это мило
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011574
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Почитал про внутреннее представление rowid, научился контролировать их порядок при insert.
...


Теперь прочитайте про row_movement_clause .
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011581
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin
НеофитSQL
Почитал про внутреннее представление rowid, научился контролировать их порядок при insert.
...


Теперь прочитайте про row_movement_clause .


Спасибо.

Ценное замечание из которого следует что order by rowid может внезапно измениться для некоторых таблиц созданных с этой опцией. Хорошо что она выключена по умолчанию.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011600
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. При копировании в другую таблицу или бд rowid вряд ли останется тем же
2. Создать индекс по нескольким полям varchar2(4000) не удастся
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011617
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx
1. При копировании в другую таблицу или бд rowid вряд ли останется тем же
2. Создать индекс по нескольким полям varchar2(4000) не удастся


1. Это так. Rowid уникален*, и его значение не подлежит копированию. Однако, вставки в пустую таблицу без partitions получают монотонно растущие rowid. Это позволяет сохранить порядок как в оригинале.

2. Сравнение всех колонок имеет несколько ограничений, поэтому rowid sort выглядит привлекательно.

Правильный подход для новых данных - это по прежнему PK, я думаю какие приемы могут пригодиться для чтения и анализа старых данных.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011623
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
вставки в пустую таблицу без partitions получают монотонно растущие rowid. Это позволяет сохранить порядок как в оригинале.

Неверно.
Ну почитайте уже, наконец, концепты - от несомой Вами ахинеи даже смеяться не хочется, тоска берет.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011632
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
НеофитSQL
вставки в пустую таблицу без partitions получают монотонно растущие rowid. Это позволяет сохранить порядок как в оригинале.

Неверно.
Ну почитайте уже, наконец, концепты - от несомой Вами ахинеи даже смеяться не хочется, тоска берет.


Не бойтесь новых знаний, независимо от вашего опыта. Посмотрите расшифровку 10-байтного rowid в официальной документации оракла, и многое станет понятным.

Например, есть ситуации где Оракл использует order by rowid по умолчанию, и это поведение задокументировано.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011634
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL
andrey_anonymous
пропущено...

Неверно.
Ну почитайте уже, наконец, концепты - от несомой Вами ахинеи даже смеяться не хочется, тоска берет.


Не бойтесь новых знаний, независимо от вашего опыта. Посмотрите расшифровку 10-байтного rowid в официальной документации оракла, и многое станет понятным.
это ты знания не впитываешь и несёшь чепуху. Описание структуры rowid ещё надо понимать. Чти доку! Вдумчиво. От корки до корки.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011644
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Посмотрите расшифровку 10-байтного rowid в официальной документации оракла, и многое станет понятным.
дело не в структуре rowid, а в том, что с точки зрения конечного пользователя он может меняться без предупреждения. операции обслуживания - например alter table move - прозрачны для пользователя (в общем случае он не может отследить факт их выполнения), не меняют самих данных, но меняют их расположение на диске и, соответственно, rowid. даже на несекционированных таблицах. ваше требование повторяемости выполнено не будет
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011654
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Считаю, что для 99% sql-говнокодеров знание структуры rowid бесполезно
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011661
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей
операции обслуживания ... ваше требование повторяемости выполнено не будет

И без них не будет.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011685
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно конечно использовать сварочный аппарат вместо болтов для крепления колес, но для решения бизнес задач, нужно использовать бизнес решения.

Если перед бизнесом стоит задача, которую Вы привели (Я правда не понимаю зачем), то решать нужно с помощью бизнеса: служебной запиской с обоснованием и требованием ресурсов.

Бываю задачи, которые не решаются с помощью такой схемы: например таблица в базах гос структуры
В этом случае задача распадается на две: синхронизация данных и обеспечение требований архитектуры.

Есть стандартные средства, для решения стандартных задач, забивать гвозди пассатижами, кончено возможно, но они предназначены для другого.

Для проверки изменились ли строки, можно использовать hash функции, а локальную копию таблицы, снабдить искуственным PK проблем нет.

p.s.
SQL функции ORA_HASH/STANDARD_HASH не доступны в PL/SQL, вместо них нужно использовать DBMS_CRYPTO.HASH
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011688
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для синхронизации таблиц, есть стандартные средства: matview/goldengate, но они не всегда доступны, исходная талица может быть совсем не oracle
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011752
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,

Комментарии прочитаны и приняты.

> Если перед бизнесом стоит задача, которую Вы привели (Я правда не понимаю зачем),

Обсуждаемые "методы" никоим образом не относятся к бизнесу. Мне было интересно, что я мог использовать для построения нескольких дюжин запросов, анализируя свойства данных той или иной таблицы в копии рабочей базы данных, не внося изменений.

Для анализа желательно исключить случайные перестановки строк, чтобы два похожих запроса были способны вернуть строки в одинаковом порядке.

Order by rowid вполне подходит для такой полевой кухни, хотя позже я узнал, что этот порядок уже и так является по умолчанию для индексных запросов. Возможно и для других, ещё не проверял.

Не удивлюсь, если "select * from TABLE" уже и так возвращает строки в порядке rowid по умолчанию. Надо сильно извергаться, чтобы оправдать порядок отличный от этого.

Остаются запросы с сортировкой по выражению с повторяющимися значениями. Поскольку методы сортировки Оракла не являются стабильными*, детерминизм можно вернуть досортировав по rowid.

* Стабильность сортировки это свойство, относящееся к обработке одинаковых значений.

Замечания по поводу передвижения таблиц, сжатия таблиц справедливые и полезные. Есть ещё какие-то кластерные грабли, где сортировка по rowid может сломаться необычным и интересным способом, я не вдавался.

Всем спасибо, я узнал много нового.
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011756
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Order by rowid вполне подходит для такой полевой кухни, хотя позже я узнал, что этот порядок уже и так является по умолчанию для индексных запросов
Вот это про что сейчас было?

И собственно, если ты решил, что более поздние строки имеют больший ROWID, то ты таки хреново рассмотрел структуру ROWID
...
Рейтинг: 0 / 0
Строгий порядок строк в чужой таблице
    #40011798
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

В огороде бузина, в киеве дядька...



> Для анализа желательно исключить случайные перестановки строк, чтобы два похожих запроса были способны вернуть строки в одинаковом порядке.

Зачем? Если нужен порядок, то order by, если order by в запросе нет, то порядок для задачи не важен. Тем более для анализа "производительности"...

Похоже, вы опять придумали себе гемор на ровном месте, как неумная женьщина:
авторСама про него придумала
Себя в уме его спросила
Сама в уме за него ответила
Сама на него обиделась


Есть документация Performance Tuning Guide


> Не удивлюсь, если "select * from TABLE" уже и так возвращает строки в порядке rowid по умолчанию. Надо сильно извергаться, чтобы оправдать порядок отличный от этого.
Элементарно, 8000 активных сессий, 1024 CPU

> Остаются запросы с сортировкой по выражению с повторяющимися значениями. Поскольку методы сортировки Оракла не являются стабильными*, детерминизм можно вернуть досортировав по rowid.

А еще есть NLS Bomb...
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Строгий порядок строк в чужой таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]