Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Yo.!
Guest
Dimitry Sibiryakov
Да конечно, когда видишь, что сервер не в состоянии тривиально развести вставку и удаление
разных записей, только и остаётся что пойти чего-нибудь пожевать с горя.

не, такую тупость лучше убивать. я же лично тебя мокал носом в ROWDEPENDENCIES ...
10 окт 12, 12:46    [13295127]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54800

Yo.!
я же лично тебя мокал носом

Которое нельзя указать в alter table, да-да...

Posted via ActualForum NNTP Server 1.5

10 окт 12, 12:49    [13295161]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Yo.!
Guest
Dimitry Sibiryakov
Которое нельзя указать в alter table, да-да...


да, тут мне крыть нечем. alter table - большой минус к IL serializable
может пойдешь все таки пожувать, вроде и время обеденное ...
10 окт 12, 13:10    [13295398]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54800

Yo.!
да, тут мне крыть нечем. alter table - большой минус к IL serializable

А с другой стороны, да, чего его менять-то?.. Вопрос "в этой таблицей можно работать в
serializable, а с этой - нет" всегда решается ещё на этапе создания БД. Для этого и нужны
укуренные пифии. Исторически сложилось, что кроме них никто с Оракулам общаться не может.

Posted via ActualForum NNTP Server 1.5

10 окт 12, 13:34    [13295625]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
Yo.!
он же неконсистентную кашу выдает.
На чём конкретно (кашу выдаёт) ?
Yo.!
если в трешке обещают починить RC, что там будет вместо оракловых рестартов ? неконсистентная хрень как я понимаю ?
Что касается "вместо рестартов", то коннект, добравшийся до залоченной записи, после получения её в свое пользование (для апдейта или делита) будет сравнивать, не изменилась ли она в каком-нить поле. И если изменилась, то он получит исключение lock conflict. И не перетрёт при этом чужое закоммиченное изменение иначе, чем через рестарт.
Если же коннект-1 начал длительный апдейт в TIL = RC, а коннект-2 быстро успел добавить и закоммитить новую запись, то коннект-1, конечно же, увидит её, когда доберётся до соотв. места в базе. Но только в RC, в snapshot'e - ни в жизнь :-)
PS. И это не в трёшке будет, а так вообще с нуля заложено было. В трёшке обещают починить другое: стейтмент, меняющий поля, входящие в критерий отбора (во where-предикат, например), не должен видеть новые значения этих полей. Но по моей практике, таких запросов всё-таки очень мало встречается. Изменение суррогатных ключей - bad practice.
10 окт 12, 13:37    [13295649]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Yo.!
Guest
Таблоид
На чём конкретно (кашу выдаёт) ?

а вы спросите на форуме FB. там ребята все как на подбор, добрые, отзывчивые ...


Таблоид
Что касается "вместо рестартов", то коннект, добравшийся до залоченной записи, после получения её в свое пользование (для апдейта или делита) будет сравнивать, не изменилась ли она в каком-нить поле. И если изменилась, то он получит исключение lock conflict. И не перетрёт при этом чужое закоммиченное изменение иначе, чем через рестарт.

вы начали козырять термином не вьехав в его суть.

Таблоид
PS. И это не в трёшке будет, а так вообще с нуля заложено было. В трёшке обещают починить другое: стейтмент, меняющий поля, входящие в критерий отбора (во where-предикат, например), не должен видеть новые значения этих полей. Но по моей практике, таких запросов всё-таки очень мало встречается. Изменение суррогатных ключей - bad practice.

у пишушего стейтмента взрослой субд не прокатит видеть базу на момент старта стейтмента, такую хрень могут себе позволить субд третьего эшелона. собственно в этом и есть суть рестарта, на изменяемые записи и оракл ставит блокировки, но что делать если изменились предикаты ? майкрософт на READ_COMMITTED_SNAPSHOT просто лочит предикаты и стопорит всю активность в базе, оракл делает миниоткат и рестат стейтмента, ну а могучий firebird не замарачивается по пустикам.
интересно, если в трешке не планируют чинить RC, в чем же смысл волноваться о каких-то предикатах ?
10 окт 12, 14:40    [13296269]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54800

Yo.!
у пишушего стейтмента взрослой субд не прокатит видеть базу на момент старта
стейтмента

Поэтому в нормальных СУБД он видит нужные данные по состоянию на начало транзакции. Но
взрослым СУБД это не понять, они с трудом понимают что такое транзакции вообще, когда те
начинаются и когда заканчиваются.

Posted via ActualForum NNTP Server 1.5

10 окт 12, 15:09    [13296512]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Yo.!
Guest
Dimitry Sibiryakov
Поэтому в нормальных СУБД он видит нужные данные по состоянию на начало транзакции.

список "нормальных субд", которые на IL Read Committed видят данные по состоянию на начало транзакции в студию !
а может все таки жевать ?
10 окт 12, 15:14    [13296551]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54800

Yo.!
у пишушего стейтмента взрослой субд не прокатит видеть базу на момент старта
стейтмента, такую хрень могут себе позволить субд третьего эшелона. собственно в этом и
есть суть рестарта, на изменяемые записи и оракл ставит блокировки, но что делать если
изменились предикаты ? майкрософт на READ_COMMITTED_SNAPSHOT просто лочит предикаты и
стопорит всю активность в базе, оракл делает миниоткат и рестат стейтмента, ну а могучий
firebird не замарачивается по пустикам.
.....
список "нормальных субд", которые на IL Read Committed видят данные по состоянию на начало
транзакции в студию !

О как внезапно SNAPSHOT превращается в Read Committed... Придерживаться уровня изоляции,
заданного пользователем это, видимо, ещё одна вещь, которая во взрослых субд не прокатит...

Posted via ActualForum NNTP Server 1.5

10 окт 12, 15:25    [13296685]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Yo.!
Guest
Dimitry Sibiryakov
О как внезапно SNAPSHOT превращается в Read Committed... Придерживаться уровня изоляции,
заданного пользователем это, видимо, ещё одна вещь, которая во взрослых субд не прокатит...

обезьянка в READ_COMMITTED_SNAPSHOT увидела знакомое слово снепшот и решила еще раз поразить нас своей тупостью ? я угадал ?
10 окт 12, 15:33    [13296783]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
Yo.!
а вы спросите на форуме FB. там ребята все как на подбор, добрые, отзывчивые ...
я там постоянно отираюсь, надоел уже им всем
Yo.!
вы начали козырять термином не вьехав в его суть.
и какая у него суть, можно узнать ? (про рестарт запущенного оператора)
Вот есть таблица в 100500 млн строк, поля: id int pk, f01 int.
Вот есть коннект_1, стартующий в режиме RC апдейт этой таблицы, меняет в ней поле f01 на 111 (без всякого where-условия; ну, или с where id>0 :)).
Вот есть коннект_2, он успел стартовать и быстро закоммитить вставку записи в эту таблицу с каким-то там "своим" f01. В новой строке появилось id=1234567891234, f01=-222.
Через 5 минут коннект_1 добрался до вставленной коннектом_2 записи. И делает рестарт.
Простой вопрос: зачем ? чтобы изменилось, если бы коннект_1 просто сразу переписал изменения "своим" значением для f01 ?
10 окт 12, 15:35    [13296811]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54800

Yo.!
я угадал ?

Ага, угадал. Я всё время забываю, что если на клетке взрослых субд написано "Слон" - не
верь глазам своим...

Posted via ActualForum NNTP Server 1.5

10 окт 12, 16:03    [13297086]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Yo.!
Guest
Таблоид
я там постоянно отираюсь, надоел уже им всем

я знал, что ты оценишь шутку о чуткости фб-гайз
если не прикидываешься - почитай вокруг этого поста
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=173455&msg=1460385

Таблоид
Простой вопрос: зачем ? чтобы изменилось, если бы коннект_1 просто сразу переписал изменения "своим" значением для f01 ?

произошла бы порча данных. представь, что там еще был коннект_1.5 который вставил данные в начало таблицы. выходит твой апдейт "заметил" записи коннект_2 и не заметил записи коннект_1.5, который закомитил вставку после начала работы коннект_1, но до коннект_2. т.е. переписав коннект_1 бы увидел базу в таком состоянии, в котором она не была ни в какой момент времени (если были данные коннект_2, значит уже были и коннект_1 данные). оракл же гарантирует консистентность стейтмента и соответсвенно такой хери допустить не может.
10 окт 12, 16:05    [13297119]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
Yo.!
произошла бы порча данных. представь, что там еще был коннект_1.5 который вставил данные в начало таблицы. выходит твой апдейт "заметил" записи коннект_2 и не заметил записи коннект_1.5, который закомитил вставку после начала работы коннект_1
Правильно ли я понимаю, что описывается следующая хронология событий:
timesess #1sess #1.5sess #2
T1insert into t values(1, 111); -- БЕЗ commit`a!
T2insert into t values(99999999999, 999); -- БЕЗ commit`a!
T3update t set f01 = 0 where id >=0;

Если правильно, и при этом в момент Т1 для добавленной строки была выделена страница (блок) базы номер <самый_наименьший>, то апдейт (Т3) тут же упрётся в эту запись - она же залочена.
А если апдейт в sess #1 уже начался, то sess #1.5 не закоммитится до тех пор, пока апдейт не сделает commit/rollback.

Где я ошибаюсь ?
10 окт 12, 16:32    [13297399]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Yo.!
Guest
Таблоид,

неправильно. у вас понятно, что update стопорнет уже на ID=1
я говорил сначала запускается update .. where id>0 (T0), он пошел менять строки и пока он работает параллельные коннекты вставляют строку в начало таблицы + коммит (T1), потом в конец таблицы + коммит (T3).
firebird запись в конце проапдейтит, а ту что в начале нет, хотя такого состояния в БД ни в один момент времени не было.
в оракле я посмотрел, в столь простой ситуации рестарта не будет. оракл проапдейтит как и полагается только те записи, что были на момент старта апдета. имхо для рестарта более сложный предикат с участием другой таблицы быть обязан.
10 окт 12, 17:08    [13297731]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
Yo.!
коннекты вставляют строку в начало таблицы + коммит (T1), потом в конец таблицы + коммит (T3).
firebird запись в конце проапдейтит
Если под "началом таблицы" понимать физический номер страницы, куда шлёпнется добавленная коннектом_1.5 запись, то такая вставка обломится. Ибо эта страница будет к тому времени уже заблокирована апдейтом.
10 окт 12, 17:36    [13297984]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Yo.!
Guest
Таблоид
Если под "началом таблицы" понимать физический номер страницы, куда шлёпнется добавленная коннектом_1.5 запись, то такая вставка обломится. Ибо эта страница будет к тому времени уже заблокирована апдейтом.

брехня. оракл блокирует исключительно на уровне строк.
10 окт 12, 17:38    [13298006]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
Yo.!,

я не про оракл сейчас говорю. ФБ заблокирует перед изменением те строки, которые подпадают под критерий отбора. Он *не* будет, разумеется, лочить всю таблицу.
Меня заинтересовал ваш пример с коннект_1.5, который вставляет в "начало таблицы", но я не уверен, что правильно его понял.
Вы можете "на языке" Oracle его показать ? (я пойму и попробую аналогичное сделать в ФБ)
10 окт 12, 17:48    [13298113]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Yo.!
Guest
делаем IOT таблицу (что бы гарантировать, что пишем в начало и конец)
create table shit (id int primary key, a varchar2(20)) organization index;

загоняем туда млн записей начина с ID=2
declare
i int;
begin
for i in 2..1000000
loop
	insert into shit values (i, 'shit-shit-shit-shit') ;
end loop;
end;


сессия1:
update shit set a='updated' where id>0 ;
пока там шуршит

сессия2:
insert into shit values (1,'new') ;
commit;
insert into shit values (1000001,'new') ;
commit;

сколько записей проапдейтит FB ? практически наверняка, проапдейтит 1000001, а 1 оставит нетронутой.
10 окт 12, 17:58    [13298193]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
Yo.!
делаем IOT таблицу (что бы гарантировать, что пишем в начало и конец)
create table shit (id int primary key, a varchar2(20)) organization index;
в ФБ, к сож-ю, нет такого вида таблиц, на сегодня - только heap.
Но для проверки того, где сидит запись, в "начале" или в "конце" таблицы, можно юзать системное поле с именем rdb$db_key. Чем оно меньше, тем ближе запись к "началу" таблицы. Что я далее и сделаю.

Yo.!
сколько записей проапдейтит FB ? практически наверняка, проапдейтит 1000001, а 1 оставит нетронутой.
А вот и проверим. Создаём новую базу, наталкиваем в неё 999999 строк:
session #1
C:\MIX\firebird\fb25>isql T0.FDB
Database: T0.FDB
SQL> create table t(id int, f01 int); commit;
SQL> set term ^;
SQL> execute block as
CON> declare i int=2;
CON> begin
CON> while (i<=1000000) do insert into t values(:i, :i/2) returning :i+1 into i;
CON> end^
SQL> set term ;^
SQL> commit;
SQL> select first 5 rdb$db_key,id,f01 from t;

DB_KEY ID F01
================ ============ ============
8000000001000000 2 1
8000000002000000 3 1
8000000003000000 4 2
8000000004000000 5 2
8000000005000000 6 3

SQL> select first 5 rdb$db_key,id,f01 from t where id>=999995;

DB_KEY ID F01
================ ============ ============
800000009DA03000 999995 499997
800000009EA03000 999996 499998
800000009FA03000 999997 499998
80000000A0A03000 999998 499999
80000000A1A03000 999999 499999
-- как видно, младшим значениям поля ID соотв-вуют меньшие значения RDB$DB_KEY, т.е. записи легли в натуральном порядке.
-- Теперь удаляем первые 10 строк, делаем commit:
SQL> delete from t where id<=10; commit;

Далее запускаем второе isql-окно, и вводим там команду вставки + коммит, но БЕЗ нажатия Enter'a:
session #2
C:\MIX\firebird\fb25>isql T0.FDB
Database: T0.FDB
SQL> insert into t values(-1, 1000); commit; -- Enter пока НЕ нажимаем!

Идём снова в первое окно:
session #1
SQL> set transaction read committed record_version no wait;
SQL> update t set f01=null where id>-999999; -- и жамкаем ENTER

Переключаемся во второе окно и жамкаем там тоже Enter:
session #2
[Enter]
SQL> _ -- выполнилось ОК.

Ждём окончания выполнения в первом окне, затем вводим там:
session #1
SQL> select rdb$db_key,id,f01 from t where id>=999995;

DB_KEY ID F01
================ ============ ============
800000009DA03000 999995 <null>
800000009EA03000 999996 <null>
800000009FA03000 999997 <null>
80000000A0A03000 999998 <null>
80000000A1A03000 999999 <null>
80000000A2A03000 1000000 <null>

SQL> select rdb$db_key,id,f01 from t where id=-1;

DB_KEY ID F01
================ ============ ============
80000000A7E83000 -1 <null>

Таким обр., session #1 увидела запись, добавленную в session #2 с id=-1. Я так понимаю, что произошло это из-за добавления этой записи не в дырку, образованную от удаления первых 10 строк, а именно в конец таблицы (см её RDB$DB_KEY).
Я не знаю, всегда ли так происходит - это лучше у ФБ-разрабов спросить. Если строка будет добавлена действительно в начало таблицы, то апдейт уже не увидит её, конечно.
10 окт 12, 19:12    [13298553]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
да, получилось поймать этот момент... к сож-ю, в моей любимой СУБД действительно есть проблема с RC в вышеприведенном примере
Test: всё тоже самое, только увеличиваем число строк до 2 млн, затем удаляем 1 млн и сразу собираем мусор:
session #1
C:\MIX\firebird\fb25>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 't0.fdb'; commit;
SQL> create table t(id int, f01 int); commit;
SQL> set term ^;
SQL> execute block as
CON> declare i int=2;
CON> begin
CON> while (i<=2000000) do insert into t values(:i, :i/2) returning :i+1 into i;
CON> end^
SQL> set term ;^
SQL> commit;
SQL> select first 5 rdb$db_key,id,f01 from t;

DB_KEY ID F01
================ ============ ============
8000000001000000 2 1
8000000002000000 3 1
8000000003000000 4 2
8000000004000000 5 2
8000000005000000 6 3

SQL> delete from t where id<=1000000; commit;
SQL> select count(*) from t; commit;

COUNT
============
1000000

session #2
C:\MIX\firebird\fb25>isql T0.FDB
Database: T0.FDB
SQL> insert into t values(-1, 1000); commit; -- Enter пока НЕ жмём!

session #1
SQL> set transaction read committed record_version no wait;
SQL> update t set f01=null where id > -999999;

session #2 (быстро перескакиваем сюда по Alt-Tab):
[Enter]
SQL> _

session #1
SQL> select rdb$db_key,id,f01 from t where id < 0;

DB_KEY ID F01
================ ============ ============
8000000076370000 -1 1000

Трейс безжалостен: произошёл апдейт не 1'000'001 строки, а всё того же "старого" 1'000'000:
update t set f01=null where id > -999999

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T NATURAL)

0 records fetched

16617 ms, 13337 read(s), 12782 write(s), 9309604 fetch(es), 2136164 mark(s)



Table Natural Index Update Insert Delete Backout Purge Expunge

***************************************************************************************************************

T 1000000 1000000

PS. И еще непонятно вот что: судя по rdb$db_key, эта запись всё равно оказалась в "конце" таблицы:
SQL> select rdb$db_key,id,f01 from t where id >= 1999995;

DB_KEY ID F01
================ ============ ============
8000000051406100 1999995 <null>
8000000052406100 1999996 <null>
8000000053406100 1999997 <null>
8000000054406100 1999998 <null>
8000000055406100 1999999 <null>
8000000056406100 2000000 <null>
- а конечный результат уже другой. Печалько... :(
10 окт 12, 19:26    [13298587]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54800

Таблоид
действительно есть проблема с RC

Повторяю ещё раз, медленно: тот, кто понизил TIL с умолчания до RC - ССЗБ.

Posted via ActualForum NNTP Server 1.5

10 окт 12, 19:46    [13298636]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
Dimitry Sibiryakov
Таблоид
действительно есть проблема с RC
Повторяю ещё раз, медленно: тот, кто понизил TIL с умолчания до RC - ССЗБ.
Не, погодь!.. RC в SQL-стандарте есть или нет ? Есть. По стандарту стейтмент, стартовавший в RC, должен увидеть все изменения, зафиксированные другими транзакциями после своего старта ? Да, должен. Ну, и ?
ЗЫ. Я понимаю, что snapshot в IB/FB был гораздо раньше сделан, чем RC. Но на практике-то в OLTP-системах юзают именно RC, как более способствующий производительности.
10 окт 12, 20:05    [13298685]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54800

Таблоид
юзают именно RC, как более способствующий производительности.

С какого бы перепугу? Ты эту "разницу в производительности" мерял?

Posted via ActualForum NNTP Server 1.5

10 окт 12, 20:09    [13298695]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше FireBird 2.1 или MS SQL 2000?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
Dimitry Sibiryakov
Ты эту "разницу в производительности" мерял?
нет. и на нашей горе-аппликухе, думаю, не решился бы никогда. не знаю, почему... суеверен, наверное :-)
10 окт 12, 20:13    [13298709]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить