Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

Откуда:
Сообщений: 25
Две 4-х ядерные машинки:
1) Win XP Home SP3 MS SQL 2000 SP4
Microsoft SQL Server 2000 - 8.00.2066 (Intel X86) May 11 2012 18:41:14 Developer Edition

2) Win 7 Pro MS SQL 2005
Microsoft SQL Server 2005 - 9.00.5057.00 (Intel X86) Mar 25 2011 13:50:04 Developer Edition

База переехала с 1 на 2 через backup\restore

Есть запрос:
Select <некоторые поля всех 3-х таблиц>
into javaDb.dbo.tempbd_data
from (javaDB.dbo.Data2 m left outer join javaDB.dbo.corp c on m.Number = c.Number) 
right outer join javaDb.dbo.dbGroup_test_new g on m.Number2 like ('%'+g.Number)


Подключаемся и выполняем запрос локально 1 пользователь.

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

Сравниваемые поля всех таблиц проиндексированы.

Какую еще информацию предоставить?
Что сделать, чтобы добиться распараллеливания на 2 машине?

К сообщению приложен файл. Размер - 41Kb
20 май 13, 16:04    [14322053]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Exproment
Member

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

Andrey_od, А с чего вы взяли что он должен быть распараллелен на новом сервере ? Оптимизатор решил что его параллелить не надо. Вроде все логично. А если все-таки надо, то есть статьи на тему принудительного распараллеливания.
20 май 13, 16:15    [14322128]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Гость333
Member

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

У вас во втором плане идёт обращение не к таблице data2, а к какой-то другой, ведь так?
Ищите, чем отличаются data2 и эта другая таблица.
20 май 13, 16:27    [14322216]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

Откуда:
Сообщений: 25
Гость333,

Запрос один и то же
20 май 13, 16:47    [14322388]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

Откуда:
Сообщений: 25
Гость333,

После restore база не изменялась, кроме возможно переиндексации (при этом старые не удалялись, новых не добавляли).
20 май 13, 16:56    [14322476]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Гость333
Member

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

На плане выполнения для SQL 2005 видно имя объекта:
[javaDB].[dbo].    Data2]

Отсюда я, например, сделал вывод, что в запросе используется не таблица Data2, а какая-то другая. Например, NewData2, у которой первые три буквы на картинке были стёрты. Конечно, я могу ошибаться — подтвердите или опровергните моё предположение.

Если таблица другая, то она может отличаться от data2, например, наличием/отсутствием индексов, статистиками и т.д. При этом будет неважно, что
Andrey_od
Запрос один и то же
— планы выполнения будут отличаться.
20 май 13, 17:14    [14322627]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

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

Дело в том, что таблица data2 большая (десятки миллионов строк)
При выполнении на старом ПК - 3 часа
При выполнении на новом в один поток больше 8 часов.


Подскажите статьи, потому что, то что я находил касалось только ограничения сверху.
20 май 13, 17:25    [14322722]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

Откуда:
Сообщений: 25
Гость333,

:)
Вы правы только в одном, я действительно стер первые 3 буквы, но они одинаковы и там и там.
20 май 13, 17:26    [14322734]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Гость333
Member

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

Хех, про то, что в плане SQL 2000 тоже можно стереть буковки, я как-то не подумал :-)
Пересобрать статистику на SQL 2005 (возможно, даже с фуллсканом) по Number, Number2 не пробовали?
20 май 13, 17:38    [14322795]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
Andrey_od
Гость333,

:)
Вы правы только в одном, я действительно стер первые 3 буквы, но они одинаковы и там и там.

планы совсем разные. на 2к Мерж джоин после скана индексов - а на 2005 - хэш после скана таблиц.
20 май 13, 17:59    [14322910]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

Откуда:
Сообщений: 25
Гость333,

Выполнял только sp_updatestats
20 май 13, 18:26    [14323039]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

Откуда:
Сообщений: 25
Ivan Durak,

В том то и дело, что я не могу понять почему так происходит
База одна и та же.
Запрос один и тот же.
Настройка использования процессора и там и там разрешено использовать 3 ядра из 4.

А план строит совсем другой.

Я читал мельком где-то, что в 2005 изменили оптимизатор, вот спрашиваю знатоков, как SQL руки повыкручивать :)
20 май 13, 18:30    [14323063]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
Andrey_od
Ivan Durak,

В том то и дело, что я не могу понять почему так происходит
База одна и та же.
Запрос один и тот же.
Настройка использования процессора и там и там разрешено использовать 3 ядра из 4.

А план строит совсем другой.

Я читал мельком где-то, что в 2005 изменили оптимизатор, вот спрашиваю знатоков, как SQL руки повыкручивать :)

ты можешь попробовать хинтами план похожий на старый подобрать
20 май 13, 18:37    [14323092]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

Откуда:
Сообщений: 25
Ivan Durak,

извините, за наглость, Вы не могли бы переписать мой запрос
или подробнее пояснить.
20 май 13, 19:07    [14323182]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Модели восстановления баз одинаковы?
20 май 13, 19:38    [14323266]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
+ Какой порог стоимости для включения распаралеливания установлен на обоих серверах?
+ Чем отличаются результаты sp_configure?
21 май 13, 06:32    [14324237]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

Откуда:
Сообщений: 25
andrey odegov,

да
simple
21 май 13, 10:42    [14324954]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Andrey_od
m.Number2 like ('%'+g.Number)

Вот этот предикат соединения, кстати, очень нехороший. Из-за него у вас в плане запроса для SQL2005 получается Table Spool.

Попробуйте переписать запрос так:
Select <некоторые поля всех 3-х таблиц>
into javaDb.dbo.tempbd_data
from (javaDB.dbo.Data2 m left outer join javaDB.dbo.corp c on m.Number = c.Number) 
right outer join javaDb.dbo.dbGroup_test_new g on m.Number2 = g.Number

union all

Select <некоторые поля всех 3-х таблиц>
into javaDb.dbo.tempbd_data
from (javaDB.dbo.Data2 m left outer join javaDB.dbo.corp c on m.Number = c.Number) 
right outer join javaDb.dbo.dbGroup_test_new g on substring(m.Number2, 2, 8000) = g.Number
и посмотреть полученный план выполнения.

А вообще вам надо подумать над структурой данных. С какой целью делается такое соединение, какая бизнес-логика реализуется? Может быть, можно эту бизнес-логику реализовать более подходящими для РСУБД методами?
21 май 13, 11:01    [14325099]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Andrey_od
После restore база не изменялась

1) Перестроить ВСЕ индексы
2) Обновить ВСЕ статистики
21 май 13, 11:05    [14325121]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гость333
Попробуйте переписать запрос так:

Это при условии, что g.Number не задаёт каких-то шаблонов поиска, т.е. не содержит подстановочных символов навроде _, %, квадратных скобок и т.д.
21 май 13, 11:05    [14325128]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Exproment
Member

Откуда:
Сообщений: 416
Гость333, +1

Даже смею предположить, что раз в запросе идет лайк по Number, то скорее всего его можно с легкостью нормализовать и вместо лайка будет "=".

Вообще это ужасная практика составлять в одном поле некоторый "номер" из нескольких других номеров. Ибо по к нему нельзя сделать foreign ограничение и его рано или поздно придется вот такими лайками разбивать. Гораздо правильнее сделать его индексированным вычисляемым полем из нормализованных составных частей.
21 май 13, 11:48    [14325423]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

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

Во вложении настройки

К сообщению приложен файл (options.xls - 35Kb) cкачать
21 май 13, 12:06    [14325627]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

Откуда:
Сообщений: 25
Knyazev Alexey
Andrey_od
После restore база не изменялась

1) Перестроить ВСЕ индексы
2) Обновить ВСЕ статистики


Да после restore делал полную переиндексацию и обновление статистики
под изменениямми имел виду добавление и удаление данных, а также полей и таблиц
21 май 13, 12:18    [14325754]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

Откуда:
Сообщений: 25
[quot Гость333]
Andrey_od
m.Number2 like ('%'+g.Number)


А вообще вам надо подумать над структурой данных. С какой целью делается такое соединение, какая бизнес-логика реализуется? Может быть, можно эту бизнес-логику реализовать более подходящими для РСУБД методами?


Расскажу про логику происходящего.
Есть 3 таблицы:
1 - большая (10-ки млн строк) обоновляется примерно раз в месяц, иногда чаще
2 и 3 не большие до 5 тыс. Таблицы 2 и 3 определяют критерии поиска в большой таблице.

поля Number на самом деле строки varchar и char (для "=")
в большой таблице они не могут быть int и т.д., так как данные приходят от источника в виде: abc123, 123, 123abc, abc
Таким образом имя поля Number чисто условно, в 95% сляучаях дествительно нужно выявить цифровую часть.

В дальнейшем эта промежуточная таблица (после перемножения) обрабатывается дополнительными запросами,
в котором отсеивают значения Null в поле m.Number и др. фильтры
21 май 13, 13:28    [14326418]     Ответить | Цитировать Сообщить модератору
 Re: Распараллеливание запроса на MS SQL 2000 и MS SQL 2005  [new]
Andrey_od
Member

Откуда:
Сообщений: 25
[quot Andrey_od]
Гость333
пропущено...

поля Number на самом деле строки varchar и char (для "=")
в большой таблице они не могут быть int и т.д., так как данные приходят от источника в виде: abc123, 123, 123abc, abc
Таким образом имя поля Number чисто условно, в 95% сляучаях дествительно нужно выявить цифровую часть.


даже иногда из строки вида "abc12345" нужно выявить 234
21 май 13, 13:31    [14326441]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить