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

Откуда: Украина, Винница
Сообщений: 277
Добрый день.

При выполнении Table-Valued функции на одном и том же наборе данных и при одних и тех же вх. параметрах иногода появляются сканы... Хотелось бы узнать, в каких случаях оптимизатору удобнее просканировать весь индекс вместо того, чтобы произвести поиск по индексу (при условии, что этот поиск возможен)? Понятно, если объём данных небольшой, то разницы можно и не заметить, но гарантируется ли то, что на больших объемах данных оптимизатор выберет seek?
18 май 11, 20:11    [10674204]     Ответить | Цитировать Сообщить модератору
 Re: Почему появляются сканы?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
...и вдогонку - насколько хороша идея использовать хинт USE PLAN, отловить план, в котором отсутсвуют сканы и потом его использовать?
18 май 11, 20:16    [10674226]     Ответить | Цитировать Сообщить модератору
 Re: Почему появляются сканы?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Из планов видно, что таблицы соединяются в разной последовательности, но FORCE ORDER применить не получтся, т.к. в функции используется 7 СТЕ-шек завязанных рекурсией...
18 май 11, 20:22    [10674240]     Ответить | Цитировать Сообщить модератору
 Re: Почему появляются сканы?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Вроде добился положительного результата при помощи комбинации (index(1), FORCESEEK).
Сейчас проверяю
18 май 11, 20:51    [10674329]     Ответить | Цитировать Сообщить модератору
 Re: Почему появляются сканы?  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
Гарантии нету. НИКАКОЙ. )

Оптимизатор - на то и потимизатор, шобы мы не ведали, что он там оптимизирует :)

но если запрос отрабатывает слишком долго (сиречь - минуты), то есть смысл разбить его ручками.
что-то прочитать во временную табличку, проиндексировать её, что-то во вторую, связать, и т.д.

Сам полгода жизни потратил на такое.
связывал одни 100 гиг с другими 100 гигами.
тогда это было много. :)

Мало того, оптимизатор (ну по крайней мере, тогдашний, 2000-й), может в один прекрасный момент передумать, и соптимизировать по другому. И ты сидишь, ждешь ответа за 30 сек, а он не приходит уже полчаса.
19 май 11, 04:31    [10675546]     Ответить | Цитировать Сообщить модератору
 Re: Почему появляются сканы?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Makar4ik
Гарантии нету. НИКАКОЙ. )

Оптимизатор - на то и потимизатор, шобы мы не ведали, что он там оптимизирует :)

но если запрос отрабатывает слишком долго (сиречь - минуты), то есть смысл разбить его ручками.
что-то прочитать во временную табличку, проиндексировать её, что-то во вторую, связать, и т.д.

Сам полгода жизни потратил на такое.
связывал одни 100 гиг с другими 100 гигами.
тогда это было много. :)

Мало того, оптимизатор (ну по крайней мере, тогдашний, 2000-й), может в один прекрасный момент передумать, и соптимизировать по другому. И ты сидишь, ждешь ответа за 30 сек, а он не приходит уже полчаса.

Мне в данном случае использовать временные таблицы нельзя - высокие требования к производительности (
Процедура должна отрабатывать 100 раз менее чем за 1 сек на приличном объеме данных.
19 май 11, 11:34    [10676586]     Ответить | Цитировать Сообщить модератору
 Re: Почему появляются сканы?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
очень много нюансов. в 2 словах - оптимизатор чем дальше тем меньше любит букмарки. включаемые поля - наше все :)
19 май 11, 11:57    [10676877]     Ответить | Цитировать Сообщить модератору
 Re: Почему появляются сканы?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Crimean
очень много нюансов. в 2 словах - оптимизатор чем дальше тем меньше любит букмарки. включаемые поля - наше все :)

Да, но если оптимизатору удалось-таки сгенерить план без сканов, неужели может быть что-то лучше этого? )
Вот, напимер, кусок плана
 |--Clustered Index Scan(OBJECT:([DBdev].[dbo].[SubUserGroups].[PK_CL_SubUserGroups_ChildID_ParentID] AS [P]), WHERE:([DBdev].[dbo].[SubUserGroups].[ChildGroupID] as [P].[ChildGroupID]=[Recr1152]))

В таблице [dbo].[SubUserGroups] есть первичный ключ

	--FillFactor should be set to 95, because it is a conposite primary key
   	,	CONSTRAINT [PK_CL_SubUserGroups_ChildID_ParentID] 
		PRIMARY KEY CLUSTERED ([ChildGroupID] ASC, [ParentGroupID] ASC)
	    WITH (PAD_INDEX					= ON
			, FILLFACTOR				= 95	
		    , IGNORE_DUP_KEY			= OFF
		    , ALLOW_ROW_LOCKS			= ON
		    , ALLOW_PAGE_LOCKS			= ON
		    , STATISTICS_NORECOMPUTE	= OFF
		  ) ON [SmallTables]
19 май 11, 12:13    [10677046]     Ответить | Цитировать Сообщить модератору
 Re: Почему появляются сканы?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а про ФФ = 95 вам наврали. 100 должно быть
19 май 11, 15:22    [10678900]     Ответить | Цитировать Сообщить модератору
 Re: Почему появляются сканы?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Crimean
а про ФФ = 95 вам наврали. 100 должно быть

Про ФФ - мой коммент. Я решил что т.к. это кросс-таблица и первичный ключ составной, то теоретически данные могут вставиться в любую часть таблицы, поэтому 2-х строк, резервируемых сервером на странице может не всегда хватить. Поэтому решил снизинь ФФ, дабы избежать фрагментации
24 май 11, 12:42    [10699360]     Ответить | Цитировать Сообщить модератору
 Re: Почему появляются сканы?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
о боги, опять про фф..

итого, если таблицу пустить "в свободное плавание" то ее ФФ будет определяться только распределением данных в потоке модификации. больше ничем. значение ФФ, которое мы ставим, просто говорит серверу, сколько свободного места оставить на странице ВО ВРЕМЯ ПЕРЕСТРОЕНИЯ ИНДЕКСА. все, больше этот параметр не работает. БОЛ говорит - ставьте ФФ отличный от 100 если вы СРАЗУ ПОСЛЕ индексации ждете заполнения этой самой разницы и хотите сэкономить на page split и/или росте файла данных. то есть даже в идеальных ситуациях (вы ждете +100% данных за счет одного - двух BULK INSERT) еще не факт, что перестроение индекса с ФФ = 50% вам окажет существенную помощь. опять все будет зависеть от распределения данных
в остальном ФФ должен быть 100 ибо при наличии индексов, форинов и прочего хозяйства отношение в страницах writes / reads почти всегда будет меньше 1% - проанализируйте трас работы своей системы за час
24 май 11, 13:08    [10699591]     Ответить | Цитировать Сообщить модератору
 Re: Почему появляются сканы?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Crimean
о боги, опять про фф..

итого, если таблицу пустить "в свободное плавание" то ее ФФ будет определяться только распределением данных в потоке модификации. больше ничем. значение ФФ, которое мы ставим, просто говорит серверу, сколько свободного места оставить на странице ВО ВРЕМЯ ПЕРЕСТРОЕНИЯ ИНДЕКСА. все, больше этот параметр не работает. БОЛ говорит - ставьте ФФ отличный от 100 если вы СРАЗУ ПОСЛЕ индексации ждете заполнения этой самой разницы и хотите сэкономить на page split и/или росте файла данных. то есть даже в идеальных ситуациях (вы ждете +100% данных за счет одного - двух BULK INSERT) еще не факт, что перестроение индекса с ФФ = 50% вам окажет существенную помощь. опять все будет зависеть от распределения данных
в остальном ФФ должен быть 100 ибо при наличии индексов, форинов и прочего хозяйства отношение в страницах writes / reads почти всегда будет меньше 1% - проанализируйте трас работы своей системы за час


В базу предполагается залить тучу данных сразу после её создания, а т.к. я maintenance'ом не занимаюсь и не знаю когда он будет произведён, то решил оставить некий "запас прочности". В любом случае - спасибо за объяснение.
24 май 11, 13:18    [10699674]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить