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

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

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

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

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

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

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

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

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

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

order by *

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

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

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

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

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

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

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

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


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

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

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

Сделайте нужные фильтр, сортировку, научитесь читать планы запросов и использовать хинты. Пока вам этого за глаза хватит.
...
Рейтинг: 0 / 0
24.10.2020, 17:15
    #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
24.10.2020, 17:40
    #40011565
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строгий порядок строк в чужой таблице
НеофитSQL
Если есть таблица, в которой владелец не предусморел первичного ключа, есть ли метод для получения строк в стабильном порядке?

Нет.
...
Рейтинг: 0 / 0
24.10.2020, 17:45
    #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
24.10.2020, 18:10
    #40011569
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строгий порядок строк в чужой таблице
Почитал про внутреннее представление rowid, научился контролировать их порядок при insert.

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

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

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

Нет.


Order by rowid

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

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

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


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


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


Спасибо.

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


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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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


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


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

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

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


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