powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / блокировки при удалении покрывающего индекса
7 сообщений из 32, страница 2 из 2
блокировки при удалении покрывающего индекса
    #40034785
Sandist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,
привет
выше речь шла о том, что подразумевается работа в RCSI

я проверил, если создать синоним на таблицу, затем в одном сеансе вызвать select * from synonym, а в другом попробовать
переименовать таблицу EXEC sp_rename 'dbo.tbl', 'dbo.tbl2';
или попробовать удалить синоним, чтобы пересоздать его указывая на новую таблицу
то в обоих случаях система ждет пока не завершится select
я неправильно понял Вашу идею?

а если правильно, то нет смысла играть с синонимами (в моем случае), легче тогда использовать truncate + switch
...
Рейтинг: 0 / 0
блокировки при удалении покрывающего индекса
    #40034797
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist
удалить синоним, чтобы пересоздать его указывая на новую таблицу
В этом случае не ждет. Потому что синоним (или обычное представление) блокируются только при компиляции плана выполнения использующего их запроса.
Что-то делали не так. Либо что-еще держит синоним.
...
Рейтинг: 0 / 0
блокировки при удалении покрывающего индекса
    #40034804
Sandist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

ну вот что я делаю:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
if OBJECT_ID('dbo.tbl1') is not null drop table dbo.tbl1
create table dbo.tbl1 (id int primary key)
insert into dbo.tbl1 (id)
select t1.n + t2.n*10+ t3.n*100+t4.n*1000+t5.n*10000+t6.n*100000+t7.n*1000000
from (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9))t1(n)
cross join (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9))t2(n)
cross join (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9))t3(n)
cross join (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9))t4(n)
cross join (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9))t5(n)
cross join (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9))t6(n)
cross join (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9))t7(n)
order by t1.n + t2.n*10+ t3.n*100+t4.n*1000+t5.n*10000+t6.n*100000+t7.n*1000000

if OBJECT_ID('dbo.tbl2') is not null drop table dbo.tbl2
create table dbo.tbl2 (id int primary key)
insert into dbo.tbl2 (id)
select id
from tbl1

if OBJECT_ID('syn_tbl') is not null drop synonym syn_tbl
create synonym syn_tbl for dbo.tbl1



в отдельном окне запускаю (вообще работает read_commited_snapshot, но на всякий проверял и с with(nolock)):
Код: sql
1.
2.
select *
from syn_tbl --with(nolock)



и затем в отдельном окне запускаю:
Код: sql
1.
2.
if OBJECT_ID('syn_tbl') is not null drop synonym syn_tbl
create synonym syn_tbl for dbo.tbl2



и по итогу получаю ожидание удаления синонима
что делаю не так?
...
Рейтинг: 0 / 0
блокировки при удалении покрывающего индекса
    #40034828
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist,

Да, действительно, держит Sch-S на синоним до конца запроса...
...
Рейтинг: 0 / 0
блокировки при удалении покрывающего индекса
    #40035571
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для тех кто не хочет заморачиваться и готов накрячить сервер (железяку) во имя красивости:

Код: sql
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.
create table t1 (rowid bigint identity (1,1)
                 ,rowtime datetime default getdate()
                 ,smthng_id nvarchar(max)
                 ,smthng_value nvarchar(max)
                 );
go
-- insert t1 (smthng_id, smthng_value) values (1, 'one in dbo.t1'), ('two', 'second value in dbo.t1');
insert t1 (smthng_id, smthng_value) values (1, 'one in dbo.t1');
insert t1 (smthng_id, smthng_value) values ('two', 'second value in dbo.t1');
go
waitfor delay '0:0:1';
go
create table t2 (rowid bigint identity (1,1)
                 ,rowtime datetime default getdate()
                 ,smthng_id nvarchar(max)
                 ,smthng_value nvarchar(max)
                 );
go
-- insert t2 (smthng_id, smthng_value) values (1, '1 from dbo.t2'), ('two', '2 from dbo.t2'), ('3', 'here is 3 from dbo.t2') ;
insert t2 (smthng_id, smthng_value) values (1, '1 from dbo.t2');
insert t2 (smthng_id, smthng_value) values ('two', '2 from dbo.t2');
insert t2 (smthng_id, smthng_value) values ('3', 'here is 3 from dbo.t2') ;
go

create view GrandVU as 
select * from (select * from t1 WITH (NOLOCK) union select * from t2 WITH (NOLOCK)) t 

go 
select * from GrandVU
go
create view VU as 
select * from GrandVU where rowtime = (select max(rowtime) from GrandVU);
go
select * from VU;

go
drop view VU;
drop view GrandVU;
drop table t1;
drop table t2;



Должно работать.

После каждой поочерёдной перезаливки будут автоматически отображаться последние залитые данные (значение колонки rowtime при заливке очередной таблицы должно быть идентичным).

Плюсы:
+ неограниченное число таблиц
+ конечной вьюхе, если не ошибаюсь, плевать на блокировки в плане отражения результатов
+ клиентская часть ни чего не знает о засаде (лишние поля скрываются через указание полей выдачи в селектах на таблицы)
+ любой скуль-сервер это должен сожрать,- ибо в логике и языке ни чего не нарушено

Минусы:
- всё остальное
...
Рейтинг: 0 / 0
блокировки при удалении покрывающего индекса
    #40036611
Sandist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_,

спасибо за вариант, но у меня есть стойкое ощущение, что если добавить таблицу с одним полем и одной строкой с временем (или еще лучше с номером) текущих данных, а потому ее джоинить к основной и таким образом отбирать актуальные данные (в совокупности с read_commited_snapshot) - это будет быстрее чем union
...
Рейтинг: 0 / 0
блокировки при удалении покрывающего индекса
    #40036758
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist
SIMPLicity_,
спасибо за вариант, но у меня есть стойкое ощущение, что если добавить таблицу с одним полем и одной строкой с временем (или еще лучше с номером) текущих данных, а потому ее джоинить к основной и таким образом отбирать актуальные данные (в совокупности с read_commited_snapshot) - это будет быстрее чем union


Ммммм.... Смысл был в чередовании таблиц ради обновления. Кстати, мой вариант тоже,- как бы сказать,- с говнецом. Так как в момент перезаливки таблицы в ней будут отражены неполные данные (с последней датой модификации). По хорошему надо лить с датой null и по окончании апдейтить дату на свежую. Но это всё весьма условно. Я думаю, что многострочные UNION-ы - это зло (как минимум - с точки зрения скорости выполнения запросов).

JOIN-ить таблицу?,- тут я не понял идею. Вероятно подразумевался .... outer apply (select top 1 * from ... order by RowDate desc) ,- но это адская просадка по производительности в принципе. ИМБО.

PS Я в подобных случаях оцениваю риск "провала в данных" и ищу решение исходя из ситуации. Но схожих ситуаций у меня не было,- у меня данные НЕ столь быстро и кардинально меняются ;)
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / блокировки при удалении покрывающего индекса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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