Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Уровень Serializable и индекс  [new]
Schors
Member

Откуда:
Сообщений: 13
Есть табличка
CREATE TABLE [dbo].[Locks](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[Name] [nvarchar](50) NOT NULL,
	[City] [int] NOT NULL,
	[Gender] [nchar](1) NOT NULL,
 CONSTRAINT [PK_Locks] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)

Есть индекс
CREATE NONCLUSTERED INDEX [IX_Locks_City] ON [dbo].[Locks] 
(
	[City] ASC
)

Выполняю запрос, и оставляю висеть транзакцию
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin tran
select * 
from dbo.locks --with (INDEX(IX_locks_city))
where City = 1
--rollback tran
оптимизатор решает не использовать индекс INDEX(IX_locks_city)

в другой транзакции делаю вставку
INSERT INTO [testip].[dbo].[Locks]
           ([Name]
           ,[City]
           ,[Gender])
     VALUES
           ('Egor Petrov'
           ,2
           ,'M')
Если в ручную использую хинт with (INDEX(IX_locks_city)) вставляет нормально, если
оставляю на усмотрение компилятора, то блокирует всю таблицу.

Вопрос: получается, что если оптимизатор решает не использовать индекс, то менеджер блокировок вешает блокировку на всю таблицу? как быть если нужно обеспечить 100% параллельность выполнения этих двух запросов? использовать хинты?
Буду благодарен любым ответам и ссылкам на статьи где можно об этом прочитать подробно.
Спасибо.
31 авг 09, 16:52    [7599212]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
Либо кластер по city, либо покрывающий на все поля, либо * не писать. Все как всегда.

Сообщение было отредактировано: 31 авг 09, 16:53
31 авг 09, 16:53    [7599221]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Вопрос: получается, что если оптимизатор решает не использовать индекс, то менеджер блокировок вешает блокировку на всю таблицу?


А Вы вставьте с SELECT перед ROLLBACK sp_lock @@spid и посмотрите, какие блокировки вешаются. Вопрос, почему оптимизатор отказался от индекса - отдельная тема.

И...Вам действительно нужен SERIALIZABLE?
31 авг 09, 16:57    [7599248]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
erererererу1
Guest
первый селект заблокирует таблицу до конца транзакции, поэтому вторая операция инсерт не будет выполнена, пока не выполниться селект. почему он всю таблицу блокирует у вас - хз. может таблица у вас умещается на одной страничке
31 авг 09, 17:09    [7599359]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
Schors
Member

Откуда:
Сообщений: 13
pkarklin
автор
Вопрос: получается, что если оптимизатор решает не использовать индекс, то менеджер блокировок вешает блокировку на всю таблицу?


А Вы вставьте с SELECT перед ROLLBACK sp_lock @@spid и посмотрите, какие блокировки вешаются. Вопрос, почему оптимизатор отказался от индекса - отдельная тема.

И...Вам действительно нужен SERIALIZABLE?


Проблема тут, 1-я строка select;2-я инсерт транзакция:

KEY (ffffffffffff) RangeS-S LOCK GRANT
KEY (ffffffffffff) RangeI-N LOCK WAIT

что это за хэш функция (ffffffffffff) ? как-нибудь посмотреть можно?
Вообще основная задача - повысить уровень параллельности при одновременном проведении 2-х тяжелых документов 1С: Предприятие 8.1 по разным организациям. Цель - выяснить поможет ли индекс по организации если селективность это индекса низкая, теперь вижу, что нет.
31 авг 09, 17:32    [7599573]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Проблема тут, 1-я строка select;2-я инсерт транзакция:

KEY (ffffffffffff) RangeS-S LOCK GRANT
KEY (ffffffffffff) RangeI-N LOCK WAIT

что это за хэш функция (ffffffffffff) ? как-нибудь посмотреть можно?


Блокировка диапазона ключа индекса.

автор
Вообще основная задача - повысить уровень параллельности при одновременном проведении 2-х тяжелых документов 1С: Предприятие 8.1 по разным организациям. Цель - выяснить поможет ли индекс по организации если селективность это индекса низкая, теперь вижу, что нет.


Гм... Если слективность низкая - индекс не поможет. Но вот тока использование самого жесткого уровня изоляции вряд ли поможет повысить уровень параллельности.
31 авг 09, 17:36    [7599600]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
Schors
Member

Откуда:
Сообщений: 13
erererererу1
первый селект заблокирует таблицу до конца транзакции, поэтому вторая операция инсерт не будет выполнена, пока не выполниться селект. почему он всю таблицу блокирует у вас - хз. может таблица у вас умещается на одной страничке


таблица действительно маленькая на 1 странице.
31 авг 09, 17:36    [7599601]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
Schors,

Расскажите поподробнее о задаче. У Вас эти 2 запроса оба в одной транзакции предполагают быть? И select * случайно выполняется не с целью проверки узнать есть ли уже такое значение в таблице?
1 сен 09, 04:35    [7600757]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
Schors
Member

Откуда:
Сообщений: 13
Кудряшка
Schors,

Расскажите поподробнее о задаче. У Вас эти 2 запроса оба в одной транзакции предполагают быть? И select * случайно выполняется не с целью проверки узнать есть ли уже такое значение в таблице?


Задача немного другая. Есть документ, который проводится долго и вешает на транзакцию тоже надолго. Документ - "Закрытие месяца" по одной организации. В базе 40 организаций. Бухгалтера хотят закрывать месяц одновременно. При проведении документа по одной организации проводить документ по другой организации нельзя.
Документ при проведении блокирует "Х" блокировкой KEY в таблице документа свою собственную строку (это вешает платформа и управлять этим нельзя). Есть, например, запрос Select из таблицы документа с условием where по организации. Уровень изоляции транзакции Read Commited (минимальный доступный для установки).
1. Начинаем проведение 1-го документа по организации "А".
2. Вешаем блокировку "Х" на KEY строку 1-го документа в таблице
3. Начинаем проведение 2-го документа по организации "Б".
4. Вешаем блокировку "Х" на KEY строку 2-го документа в таблице
5. 1-ый документ выполняет Select [несколько полей] from [таблица документа] where [организация] = "А". Оптимизатор использует Cluster index scan ввиду низкой селективности индекса по организации, доходит до попытки повесить "S" блокировку на KEY 2-го документа и через несколько минут вываливается по таймауту. Бухи недовольны.

Использовать хинт на принудительное использование индекса я не могу. Поскольку покрывающий индекс не стандартное решение для 1С: Предприятия 8.1, какие могут быть варианты решения кроме покрывающего индекса на все поля в Select?
1 сен 09, 11:02    [7601755]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
5. 1-ый документ выполняет Select [несколько полей] from [таблица документа] where [организация] = "А". Оптимизатор использует Cluster index scan ввиду низкой селективности индекса по организации, доходит до попытки повесить "S" блокировку на KEY 2-го документа и через несколько минут вываливается по таймауту. Бухи недовольны.


И что, кроме условия по организации других условий нет? А идентификатор документа. Чего он там селектит?
1 сен 09, 11:37    [7602010]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
Schors
Member

Откуда:
Сообщений: 13
pkarklin
автор
5. 1-ый документ выполняет Select [несколько полей] from [таблица документа] where [организация] = "А". Оптимизатор использует Cluster index scan ввиду низкой селективности индекса по организации, доходит до попытки повесить "S" блокировку на KEY 2-го документа и через несколько минут вываливается по таймауту. Бухи недовольны.


И что, кроме условия по организации других условий нет? А идентификатор документа. Чего он там селектит?


Кроме организации в условиях еще период (Дата документа), признак проведения и удаления документа. Селектит признаки закрытия областей учета (т.е. проверяет, что в этом периоде по этой организации не был 2 раза начислена амортизация, например)
1 сен 09, 11:49    [7602106]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Schors
Кроме организации в условиях еще период (Дата документа), признак проведения и удаления документа. Селектит признаки закрытия областей учета (т.е. проверяет, что в этом периоде по этой организации не был 2 раза начислена амортизация, например)


Эээ... Этот SELECT c EXISTS? Неужели нет дургого подходящего индекса, чтобы запрос смог уйти от сканирования таблицы?
1 сен 09, 11:58    [7602188]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
Schors
Member

Откуда:
Сообщений: 13
pkarklin
Schors
Кроме организации в условиях еще период (Дата документа), признак проведения и удаления документа. Селектит признаки закрытия областей учета (т.е. проверяет, что в этом периоде по этой организации не был 2 раза начислена амортизация, например)


Эээ... Этот SELECT c EXISTS? Неужели нет дургого подходящего индекса, чтобы запрос смог уйти от сканирования таблицы?


Нет, без Exists. Самый обычный селект. Сама таблица маленькая, несколько десятков документов в месяц.
1 сен 09, 12:04    [7602254]     Ответить | Цитировать Сообщить модератору
 Re: Уровень Serializable и индекс  [new]
Schors
Member

Откуда:
Сообщений: 13
pkarklin
Schors
Кроме организации в условиях еще период (Дата документа), признак проведения и удаления документа. Селектит признаки закрытия областей учета (т.е. проверяет, что в этом периоде по этой организации не был 2 раза начислена амортизация, например)


Эээ... Этот SELECT c EXISTS? Неужели нет дургого подходящего индекса, чтобы запрос смог уйти от сканирования таблицы?


Добавление даты в индекс помогло включить index seek. Спасибо.
1 сен 09, 12:34    [7602468]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить