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

Откуда: From Russia
Сообщений: 146
Всем привет,
Есть запрос, в котором в качестве условия используется: where in (1,2,3,4,5).
Если заменить это условие на where in (select ID from @inputTable) и добавить в @inputTable те же значения, то время выполнения резко увеличивается.
Смотрю план, в первом случае простой Index Seek, во втором - страшный Tabel Scan.

Можно ли как-то исхитриться, чтобы в условие значения задавались НЕ статически, и это не приводило бы к Tabel Scan?
Динамик сиквел немного не подходит, так как входные данные представляют собой примерно от 500 до 1000 наборов id'шников.
4 фев 12, 13:05    [12032025]     Ответить | Цитировать Сообщить модератору
 Re: Table Scan при where in  [new]
_Shakill
Guest
Kudep, создайте на поле ID в вашей @inputTable первичный ключ или просто уникальное ограничение
4 фев 12, 13:23    [12032074]     Ответить | Цитировать Сообщить модератору
 Re: Table Scan при where in  [new]
iljy
Member

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

план покажите. И версию сервера. И запрос хотелось бы целиком, иначе гадание на кофейной гуще будет, на формирование плана влияет огромное количество факторов.
4 фев 12, 13:39    [12032116]     Ответить | Цитировать Сообщить модератору
 Re: Table Scan при where in  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
_Shakill
Kudep, создайте на поле ID в вашей @inputTable первичный ключ или просто уникальное ограничение

Tabel Scan идет конечно же не по @inputTable, а по большой таблице в БД.

iljy
Kudep,
план покажите. И версию сервера. И запрос хотелось бы целиком, иначе гадание на кофейной гуще будет, на формирование плана влияет огромное количество факторов.

Версия Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)
Вот запрос целиком:
declare @ttt table(Number smallint not null, WordId bigint not null, NumWord int not null)
insert into @ttt values(2,14872,2),(2,15918,2)

select top 1 q.*
from (
	select wq.ProductID
	from dbo.VeryBigTable1 (nolock) wq 
	where wq.WordID in (
		select WordId from @ttt where Number = 2
	) and wq.NumWord = 2
	group by wq.ProductID
	having count(*) = 2					
) as t
inner loop join dbo.VeryBigTable2 (nolock) q
	on q.ID = t.ProductID 
order by NumTransitions desc 
option (maxdop 8)
4 фев 12, 15:21    [12032394]     Ответить | Цитировать Сообщить модератору
 Re: Table Scan при where in  [new]
_Shakill
Guest
Kudep
_Shakill
Kudep, создайте на поле ID в вашей @inputTable первичный ключ или просто уникальное ограничение

Tabel Scan идет конечно же не по @inputTable, а по большой таблице в БД.


то есть вы решили, что я вас не так понял и не попробовали?
4 фев 12, 15:48    [12032475]     Ответить | Цитировать Сообщить модератору
 Re: Table Scan при where in  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
_Shakill
Kudep
пропущено...

Tabel Scan идет конечно же не по @inputTable, а по большой таблице в БД.


то есть вы решили, что я вас не так понял и не попробовали?

попробовал так:
create table #ttt(Number smallint not null, WordId bigint not null, NumWord int not null, Processed bit not null)
insert into #ttt values(2,14872,2,0),(2,15918,2,0)
create clustered index IX_clast on #ttt (WordId, NumWord)

ничего не изменилось
4 фев 12, 16:04    [12032525]     Ответить | Цитировать Сообщить модератору
 Re: Table Scan при where in  [new]
_Shakill
Guest
Kudep
ничего не изменилось


попробуйте вместо where in() явный inner join к (select distinct wordId ...)
обновите статистику
протрите пыль с сервера :)
и как крайняя мера остаётся хинт with (forceseek)
4 фев 12, 16:13    [12032571]     Ответить | Цитировать Сообщить модератору
 Re: Table Scan при where in  [new]
Crimean
Member

Откуда:
Сообщений: 13147
это же входные параметры? раз так - вы знаете из диапазон. добавьте кроме свего in еще и and value between min and max
4 фев 12, 16:18    [12032600]     Ответить | Цитировать Сообщить модератору
 Re: Table Scan при where in  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Kudep
входные данные представляют собой примерно от 500 до 1000 наборов id'шников.


возможно спасет не @ а # таблица - на нее статистики ведутся. ессно, с primary key. предложение с and between - в силе. возможно придется добавить option recompile, если запрос не массовый и/или не конкурентный
задача стандартная, но однозначного решения нет - опять вопрос селективностей и перестроения плана. точнее адекватности уже выбранного плана параметрам
4 фев 12, 16:32    [12032645]     Ответить | Цитировать Сообщить модератору
 Re: Table Scan при where in  [new]
iljy
Member

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

забыли один пункт из моего списка, самый главный.
4 фев 12, 16:35    [12032655]     Ответить | Цитировать Сообщить модератору
 Re: Table Scan при where in  [new]
iljy
Member

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

ну и если так, чисто глядя в хрустальный шар, - сделайте maxdop 1.
4 фев 12, 16:37    [12032659]     Ответить | Цитировать Сообщить модератору
 Re: Table Scan при where in  [new]
Crimean
Member

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

вы похоже не видите разницу между primary key / unique ( f1, f2 ) и index ( f1, f2 ). но вот сервер - очень видит, поверьте
4 фев 12, 16:43    [12032683]     Ответить | Цитировать Сообщить модератору
 Re: Table Scan при where in  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Kudep,

Почему планы скрываете? Выкладывайте два actual плана, один для констант, другой для табличной переменной. Может быть из них будет понятно что происходит.
4 фев 12, 17:59    [12032934]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить