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

Откуда:
Сообщений: 524
День добрый!
Есть примерно такой запрос:

SELECT top 10 'abc'
FROM   T1 WITH (NOLOCK) 
LEFT OUTER JOIN T2 WITH (NOLOCK) 
ON T1.ID= T2.ID 
WHERE 
(
T1.a IN (SELECT col FROM #temp1)
OR 
T1.b IN (SELECT col FROM #temp2)
) 


Все поля GUID.

В таблицах есть индексы.

Если убрать топ 10 или взять топ 100000000, то план меняется и запрос выполняется на порядок быстрее.
Вот планы запросов с топом и без:


Картинка с другого сайта.

Картинка с другого сайта.

Почему топ так тормозит и как можно ускорить именно этот запрос? Добавить индекс?

Спасибо!
14 авг 13, 20:45    [14709896]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
gergerger
Guest
abrashka,

а так?

select top(10) 'abc'
from
	t1 z1
		inner join
	#temp1 z2 on z1.a = z2.col
		inner join
	#temp2 z3 on z1.b = z3.col
		left join
	t2 z4 on z1.id = z4.id
14 авг 13, 22:27    [14710140]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
abrashka
Member

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

Спасибо! Запрос трогать нельзя, он генерируется автоматически. Интересует почему так получается и как можно изменить план при помощи индексов.
14 авг 13, 22:31    [14710157]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
terthertherth
Guest
abrashka
gergerger,

Спасибо! Запрос трогать нельзя, он генерируется автоматически. Интересует почему так получается и как можно изменить план при помощи индексов.


+ после

create table t1(id int primary key, a int, b int);
create table t2(id int primary key, a int, b int);

create table #temp1(col int);
create table #temp2(col int);

;with
l0(n) as (select 1 union all select 1),
l1(n) as (select 1 from l0 t1, l0 t2),
l2(n) as (select 1 from l1 t1, l1 t2),
l3(n) as (select 1 from l2 t1, l2 t2),
l4(n) as (select 1 from l3 t1, l3 t2),
rt(n) as(select row_number() over(order by (select 0)) from l4 t1, l4 t2)
insert into t1(id, a, b)
select top(1000000) n as id, rand(checksum(newid())) * 100 as a, rand(checksum(newid())) * 100 as b
from rt

;with
l0(n) as (select 1 union all select 1),
l1(n) as (select 1 from l0 t1, l0 t2),
l2(n) as (select 1 from l1 t1, l1 t2),
l3(n) as (select 1 from l2 t1, l2 t2),
l4(n) as (select 1 from l3 t1, l3 t2),
rt(n) as(select row_number() over(order by (select 0)) from l4 t1, l4 t2)
insert into t2(id)
select top(500000) 2 * n + 1 as id
from rt

;with
l0(n) as (select 1 union all select 1),
l1(n) as (select 1 from l0 t1, l0 t2),
l2(n) as (select 1 from l1 t1, l1 t2),
l3(n) as (select 1 from l2 t1, l2 t2),
l4(n) as (select 1 from l3 t1, l3 t2),
rt(n) as(select row_number() over(order by (select 0)) from l4 t1, l4 t2)
insert into #temp1(col)
select top(1000) rand(checksum(newid())) * 100
from rt

;with
l0(n) as (select 1 union all select 1),
l1(n) as (select 1 from l0 t1, l0 t2),
l2(n) as (select 1 from l1 t1, l1 t2),
l3(n) as (select 1 from l2 t1, l2 t2),
l4(n) as (select 1 from l3 t1, l3 t2),
rt(n) as(select row_number() over(order by (select 0)) from l4 t1, l4 t2)
insert into #temp2(col)
select top(1000) rand(checksum(newid())) * 100
from rt

create index idx_#temp1_col on #temp1(col);
create index idx_#temp2_col on #temp2(col);
create index idx_t1_ab on t1(a,b) include(id);

set statistics io on
set statistics time on

SELECT top 10 'abc'
FROM   T1 WITH (NOLOCK) 
LEFT OUTER JOIN T2 WITH (NOLOCK) 
ON T1.ID= T2.ID 
WHERE 
(
T1.a IN (SELECT col FROM #temp1)
OR 
T1.b IN (SELECT col FROM #temp2)
) 


set statistics io off
set statistics time off


(10 row(s) affected)
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "#temp1______________________________________________________________________________________________________________000000000036". Число просмотров 1, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "t1". Число просмотров 1, логических чтений 3, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

(1 row(s) affected)

 Время работы SQL Server:
   Время ЦП = 0 мс, затраченное время = 103 мс.

 Время работы SQL Server:
   Время ЦП = 0 мс, затраченное время = 0 мс.



К сообщению приложен файл (plan.sqlplan - 23Kb) cкачать
14 авг 13, 23:07    [14710368]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
abrashka,
вы приводите планы к какому то другому запросу. А ваш запрос из сообщения без top работает медленнее
15 авг 13, 10:13    [14711430]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Cygapb-007
Member

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

Оптимизатор T2 выкинул нафиг из плана.
И в общем-то он прав... :)
15 авг 13, 10:43    [14711573]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
terthertherth
Guest
Cygapb-007
terthertherth,

Оптимизатор T2 выкинул нафиг из плана.
И в общем-то он прав... :)


хм. вчера думал над этим, не смог понять потому что в голове было убеждение, что в тесте t1(id pk,...) <---FK--->t2(id FK), а щас глянул у меня в тесте просто t1(id PK...), t2(id PK)... потому оптимизатор t2 и выкинул ее... на количество строк не влияет :). интересно у автора PK/FK?.... обычно вроде не называют FK как id, а id_t1 например... хз вобщем.
15 авг 13, 11:17    [14711742]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
terthertherth,
не, выкинул потому, что в select нет ни одного поля из T2, и нигде в ключевых точках T2 не задействована
15 авг 13, 11:57    [14712061]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
terthertherth
Guest
Cygapb-007
terthertherth,
не, выкинул потому, что в select нет ни одного поля из T2, и нигде в ключевых точках T2 не задействована


хм вон оно как..., а я думал что из-за условия top 10 'abc' ему надо определить только есть хотя бы до 10 строк в результате и вернуть до 10 констант 'abc'... а так как там left join таблиц по их PK, то на количество строк этот join не повлияет и количество строк результата будет равно количеству строк в t1 (left join же) ну и поля в t2 не используются в предложении select... ну и тогда количество строк фактически определяется устловиями в where... это так человек может мыслить... а детально алгоритмы, как работает оптимизатор еще не читал... :)
15 авг 13, 12:04    [14712112]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Cygapb-007
нигде в ключевых точках T2 не задействована

Что такое "ключевые точки"?
15 авг 13, 12:11    [14712142]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
terthertherth
Guest
щас убрал PK, с таблицы t2, в план добавилась таблица t2 :)

причем, даже если в t1 много больше строк чему указано в top(10), а в t2 только 1, t2 все равно остается в плане.
15 авг 13, 12:13    [14712156]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
terthertherth
щас убрал PK, с таблицы t2, в план добавилась таблица t2 :)

причем, даже если в t1 много больше строк чему указано в top(10), а в t2 только 1, t2 все равно остается в плане.

так без t2 совсем другой зарос получится, даже если в результате ни одного поля из t2 не используется - количество итоговых записей из за внешнего соединения может поменяться. Вот убрали из t2 первичный ключ и уже нельзя сказать, что t2.id = t1.id даст нам соединение 1 к 1 , тут табличка t2 и появляется. Но, господа, я не понимаю каким все это боком относится к проблеме топикстартера, когда его планы не относятся никак к приведенному проблемному запросу
15 авг 13, 12:26    [14712270]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
_ч_
Member

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

а покажете кластерные индексы на таблицах T1 и T2?
15 авг 13, 12:26    [14712274]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Мистер Хенки
его планы не относятся никак к приведенному проблемному запросу

Почему не относятся? Вполне относятся, просто имена таблиц/индексов анонимизированы.
15 авг 13, 12:29    [14712311]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Glory
Member

Откуда:
Сообщений: 104751
Гость333
Мистер Хенки
его планы не относятся никак к приведенному проблемному запросу

Почему не относятся? Вполне относятся, просто имена таблиц/индексов анонимизированы.

И какая же таблица из запроса какой таблице соответствует из плана ?

В запросе
T1, T2, #temp1, #temp2
В плане
Table1, Table2, Table3, Table4

Вы можете гарантированно сказать что во что "отмаплено" ?
15 авг 13, 12:33    [14712351]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Гость333
Cygapb-007
нигде в ключевых точках T2 не задействована

Что такое "ключевые точки"?
Имел в виду влияние на число результирующих строк.
15 авг 13, 12:34    [14712369]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Glory
Гость333
пропущено...

Почему не относятся? Вполне относятся, просто имена таблиц/индексов анонимизированы.

И какая же таблица из запроса какой таблице соответствует из плана ?

В запросе
T1, T2, #temp1, #temp2
В плане
Table1, Table2, Table3, Table4

Вы можете гарантированно сказать что во что "отмаплено" ?

Да, вот это и смущает. Просто ничего не понятно. Пускай уж тогда и исходный запрос по этому же принципу преобразует.
15 авг 13, 12:38    [14712412]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3757
Гость333
Мистер Хенки
его планы не относятся никак к приведенному проблемному запросу

Почему не относятся? Вполне относятся, просто имена таблиц/индексов анонимизированы.

ТС надо на T2.Id повесить PK constraint (If its possible) и у него она тоже из плана исчезнет.
15 авг 13, 12:40    [14712436]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Glory
Вы можете гарантированно сказать что во что "отмаплено" ?

Маппинг в первом плане:
T1 -> Table1
T2 -> Table4
#temp1, #temp2 -> Table2, Table3

Маппинг во втором плане:
T1 -> Table2
T2 -> Table1
#temp1, #temp2 -> Table3, Table3

"Я гарантирую это" :-)
15 авг 13, 12:41    [14712437]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гость333
Маппинг во втором плане:
T1 -> Table2
T2 -> Table1
#temp1, #temp2 -> Table3, Table3 Table4

Кривой копипаст fixed.
15 авг 13, 12:42    [14712449]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
SomewhereSomehow
Member

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

Это довольно распространенный случай влияния механизма row goal на производительность.

Обычно, оптимизатор оценивает предполагаемую кардинальность (число строк) двигаясь по плану снизу вверх, т.е. от базовых элементов (таблиц,индексов) к верхним операторам (джойнам, группировкам и т.д.), при это модифицируя оценку в соответсвии со своей моделью. Но для определенных запросов (например, в которых есть top) оптимизатор использует механизм row goal - т.е. когда он заранее знает, что есть некая "цель", некое целевое число строк, которые нужно получить. В таком случае, ограничение идет сверху, от оператора ТОП, например.

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

В данном случае оптимизатор полагает, то должно быть выбрано всего 10 строк, которые потенциально могут сджойниться с другими таблицами (на самом деле он предполгает что нужно просканировать чуть больше 10, чтобы получить искомые 10, но все-равно - сканировать не много, не всю таблицу). Исходя из того, что строк будет выбрано не много, выбирается тип соединения Nested Loops.

На деле же происходит следующее, оптимизатор начинает скан таблицы T1, получает одну строку, ищет ее в нижних - не находит, переходит к следующей строке из T1, опять ищет - не находит, берет следующую и т.д. Получается, вместо того, чтобы быстро найти строки из T1 которые джойнятся с другими просканировав небольшую часть T1 и выполнив небольшое число сканов таблиц, которые находятся на внутренней стороне Nested Loops, оптимизатор полностью сканирует T1 и выполняет столько сканов внутренних таблиц, сколько строк в T1. У вас это видно на плане: 252 690. Вот и прикиньте если во внутренних таблицах хотя бы по 100 строк, сколько это просмотров и проверок в джойне.

Репро если кому-то захочется пощупать:
+
use tempdb;
go
create table t1(id uniqueidentifier primary key, a uniqueidentifier, b uniqueidentifier);
create table t2(id uniqueidentifier primary key);
create table #temp1(col uniqueidentifier)
create table #temp2(col uniqueidentifier)
go
with cte as (select top(300000) v1.* from master..spt_values v1,master..spt_values v2,master..spt_values v3)
insert t1(id,a,b)
select newid(),newid(),newid()
from cte;
insert t2(id) select top(1000) newid() from t1
insert #temp1(col) select top(50) newid() from t1
insert #temp2(col) select top(50) newid() from t1
go

set statistics time, io on
SELECT top 10 'abc'
FROM   T1 WITH (NOLOCK) 
LEFT OUTER JOIN T2 WITH (NOLOCK) 
ON T1.ID= T2.ID 
WHERE 
(
T1.a IN (SELECT col FROM #temp1)
OR 
T1.b IN (SELECT col FROM #temp2)
)
set statistics time, io off
go
set statistics time, io on
SELECT 'abc'
FROM   T1 WITH (NOLOCK) 
LEFT OUTER JOIN T2 WITH (NOLOCK) 
ON T1.ID= T2.ID 
WHERE 
(
T1.a IN (SELECT col FROM #temp1)
OR 
T1.b IN (SELECT col FROM #temp2)
)
set statistics time, io off
go
set statistics time, io on
SELECT top 10 'abc'
FROM   T1 WITH (NOLOCK) 
LEFT OUTER JOIN T2 WITH (NOLOCK) 
ON T1.ID= T2.ID 
WHERE 
(
T1.a IN (SELECT col FROM #temp1)
OR 
T1.b IN (SELECT col FROM #temp2)
)
option(merge join, hash join)
set statistics time, io off


автор
Table '#temp2_000000000003'. Scan count 1, logical reads 300000, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#temp1_000000000002'. Scan count 300000, logical reads 300000, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 't1'. Scan count 1, logical reads 2128, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 2281 ms, elapsed time = 2299 ms.

Table '#temp1_000000000002'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 't1'. Scan count 10, logical reads 4256, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#temp2_000000000003'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 109 ms, elapsed time = 108 ms.

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 't1'. Scan count 2, logical reads 4256, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#temp2_000000000003'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#temp1_000000000002'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 94 ms, elapsed time = 113 ms.


Нечто похожее, только на примере с неправильным распределением статистики я описывал у себя в блоге RowGoal и неравномерное распределенных данных, только там пример максимально упрощен, таблица одна, но механизм такой же.
15 авг 13, 14:00    [14713116]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Гость333
Member

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

Спасибо за подробное объяснение.

А у вас есть какой-нибудь ответ на второй вопроса ТСа?
abrashka
как можно ускорить именно этот запрос?

С учётом того, что "Запрос трогать нельзя, он генерируется автоматически".

Я вот сходу подумал, что можно сделать plan guide для этого запроса. Сначала рассмотрел возможность создания простых плангайдов на основе хинтов.
1) Если бы была возможность параметризовать кляузу "TOP 10" и указать, что нужно строить план для "TOP 100000000", то это спасло бы положение. Но кляуза TOP не параметризуется.
2) Если указать OPTION(TABLE HINT(T1, INDEX(...))), то это могло бы спасти положение. Но здесь должны использоваться два индекса, по T1.a и T1.b, причём с OR-соединением. А такое в MSSQL, как я понял из BOL, нельзя захинтовать (можно захинтовать только AND-соединение индексов).
3) Попробовать указать тип соединения. Но в "плохом" плане используется loop join, а в "хорошем" — loop и hash. Снова ничего не получается.

Выходит, простыми хинтами не отделаться, и в плангайде нужно целиком указывать "хороший" план запроса? Как этого можно добиться? Построить план для "TOP 100000000" и вручную исправить текст в XML'е на "TOP 10"? Такой плангайд подхватится? Или надо ещё как-то исправлять QueryHash и QueryPlanHash?

Просто никогда не имел дела с плангайдами, где целиком указан план запроса.

А может, всё гораздо проще, и можно пофиксить ситуацию какими-то другими средствами.
15 авг 13, 15:18    [14713654]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
SomewhereSomehow
Member

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

Не могу ответить насчет правки планов "вручную", никогда так не делал, проще всего проэкспериментировать.
Что касается плангайда с простыми хинтами - хинт forceseek дает очень похожий план, за исключением последнего джойна и порядка соединений, и, имхо, получается даже лучше (дешевле). По времени - на уровне погрешности. Думаю, вполне нормальный вариант.
Картинка с другого сайта.

+ скрипт
use tempdb;
go
if object_id('t1','U') is not null drop table t1;
if object_id('t2','U') is not null drop table t2;
if object_id('#temp1','U') is not null drop table #temp1;
if object_id('#temp2','U') is not null drop table #temp2;
go
create table t1(id uniqueidentifier primary key, a uniqueidentifier not null, b uniqueidentifier not null, filler char(100) not null default(''));
create index ix_a on t1(a);
create index ix_b on t1(b);
create table t2(id uniqueidentifier primary key, b uniqueidentifier,);
create table #temp1(col uniqueidentifier not null)
create table #temp2(col uniqueidentifier not null)
go
with cte as (select top(300000) v1.* from master..spt_values v1,master..spt_values v2,master..spt_values v3)
insert t1(id,a,b)
select newid(),newid(),newid()
from cte;
insert t2(id) select top(50) newid() from t1
insert #temp1(col) select top(10) newid() from t1
insert #temp2(col) select top(10) newid() from t1
go
set statistics xml, io, time on
go
--top
SELECT top 10 *
FROM   
	T1 WITH (NOLOCK) 
	LEFT OUTER JOIN T2 WITH (NOLOCK) ON T1.ID = T2.ID
WHERE 
	T1.a IN (SELECT col FROM #temp1) OR 
	T1.b IN (SELECT col FROM #temp2)
go
--without top
SELECT *
FROM   
	T1 WITH (NOLOCK) 
	LEFT OUTER JOIN T2 WITH (NOLOCK) ON T1.ID = T2.ID
WHERE 
	T1.a IN (SELECT col FROM #temp1) OR 
	T1.b IN (SELECT col FROM #temp2)
go
set statistics xml, io, time off
go
--create pg
exec sp_create_plan_guide 
    @name = N'pg1', 
    @stmt = N'SELECT top 10 *
FROM   
	T1 WITH (NOLOCK) 
	LEFT OUTER JOIN T2 WITH (NOLOCK) ON T1.ID = T2.ID
WHERE 
	T1.a IN (SELECT col FROM #temp1) OR 
	T1.b IN (SELECT col FROM #temp2)', 
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints = N'option (table hint(t1, NOLOCK, forceseek))';
go
set statistics xml, io, time on
go
--top (guide) 
exec ('SELECT top 10 *
FROM   
	T1 WITH (NOLOCK) 
	LEFT OUTER JOIN T2 WITH (NOLOCK) ON T1.ID = T2.ID
WHERE 
	T1.a IN (SELECT col FROM #temp1) OR 
	T1.b IN (SELECT col FROM #temp2)')
go
set statistics xml, io, time off
go
exec sp_control_plan_guide 'DROP', 'pg1';
drop table t1, t2, #temp1, #temp2;
15 авг 13, 18:04    [14714916]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
abrashka
Member

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

Огромное спасибо!
Я проблему не решил, но рад, что Вы помогли разобраться с причиной.
18 авг 13, 13:10    [14722947]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с планом плз  [new]
Гость333
Member

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

И даже плангайды не помогли?
19 авг 13, 11:36    [14724551]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить