все верно, если хотите чтобы ваш процесс других не лочил, то ваш подход бить на транзакции это норм. но с rowlock я бы глянул сколько строк, если много лучше убрать его
Тогда там где не класстеризованный индекс идёт блокировка страниц, боюсь большая блокировка...
А ещё важный наверное момент, есть коллеги и их очень много, кто в этом вообще не понимает, а порезать им права мне не дают, они могут писать запросы плохо и вызывают блокировки, поэтому думал в сторону rowlock, что бы минимизировать возможность этих блоков
Не, наоборт, нужно блокировки делать если фактически есть что писать или считывать. Мне нужно, что бы не было лишних блокировок, что бы данные другие процедуры (тоже массовые) могли использовать и не ожидать просто так :)
Т.е. я как в голове строю... Я пишу данные в тэмп таблицу и блокирую только построчно. Потом я смотрю есть ли данные в таблице, если да, то накладываю блокировку на запись
Begin tran
If exists ( Select top 1 1 FROM [db1].[dbo].[table1] AS t1 JOIN [db1].[dbo].[table2] AS t2 ON t1.[id] = t2.[id]) Begin Truncate table [db3].[dbo].[table3] Insert into [db3].[dbo].[table3] Select * FROM [db1].[dbo].[table1] AS t1 WITH (ROWLOCK) JOIN [db1].[dbo].[table2] AS t2 WITH (ROWLOCK) ON t1.[id] = t2.[id] End Commit tran
If exists ( Select top 1 1 FROM [db1].[dbo].[table1] AS t1 JOIN [db1].[dbo].[table2] AS t2 ON t1.[id] = t2.[id]) Begin Truncate table [db3].[dbo].[table3] Insert into [db3].[dbo].[table3] Select * FROM [db1].[dbo].[table1] AS t1 WITH (ROWLOCK) JOIN [db1].[dbo].[table2] AS t2 WITH (ROWLOCK) ON t1.[id] = t2.[id] End Commit tran
А exists в этом случае не накладывает лишнюю блокировку? Возможно я не совсем понимаю как отрабатывает exists в данном случае. Т.е. он же по идее вызывает две таблицы и если true потом вызывает снова две таблицы...
А exists в этом случае не накладывает лишнюю блокировку? Возможно я не совсем понимаю как отрабатывает exists в данном случае. Т.е. он же по идее вызывает две таблицы и если true потом вызывает снова две таблицы...
Конечно наложит лочку, но очень быструю, т.к. отпустит ее при первом совпадении
У меня есть БД примерно 200 Гб, я хочу ускорить и поделить её на 4 файла m(n)df, все БД которые я создавал я создавал сразу сам и делил их на файловые группы. Эта БД у меня историческое наследие, ранее я не делил уже существующие БД, в инете пишут, что бы разделить надо сделать SHRINK EMPTYFILE сделать, но нашёл это не на очень офф сайтах...
Странно... прирост производительности однако есть, не большой, но всё же прирост. Сравнивал чисто по скорости отработки запросов, некоторые БД мигрировали путём копирования данных... при том что 2 сервера с одинаковыми параметрами, различие только в том, что одна БД была записана в 1 файл, у меня в несколько... Поэтому я и задумался над этим.
Странно... прирост производительности однако есть, не большой, но всё же прирост. Сравнивал чисто по скорости отработки запросов, некоторые БД мигрировали путём копирования данных... при том что 2 сервера с одинаковыми параметрами, различие только в том, что одна БД была записана в 1 файл, у меня в несколько... Поэтому я и задумался над этим.
В вашем случае это можно отнести к погрешности. Эффект плацебо.