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

Откуда:
Сообщений: 178
Коллеги, нужна ваша помощь.

Есть 2 cервера MS SQL

2008 10.0.4000
2000 8.0.2282

Есть запрос:
set rowcount 1; select DOCNO from _1SJOURN(NOLOCK) where DNPREFIX=' 9145 ' and DOCNO>='р-' and substring(DOCNO,1,2)='р-' order by DNPREFIX DESC, DOCNO DESC; set rowcount 0

Использует индекс:

CREATE UNIQUE NONCLUSTERED INDEX [DOCNO] ON [dbo].[_1sjourn]
(
[DNPREFIX] ASC,
[DOCNO] ASC,
[ROW_ID] ASC
)

План выполнения на обоих серверах одинаковый.
Для 2008:
set rowcount 1;
select DOCNO from _1SJOURN(NOLOCK) where DNPREFIX=' 9145 ' and DOCNO>='р-' and substring(DOCNO,1,2)='р-' order by DNPREFIX DESC, DOCNO DESC;
|--Index Seek(OBJECT:([rik_7].[dbo].[_1sjourn].[DOCNO]), SEEK:([rik_7].[dbo].[_1sjourn].[DNPREFIX]=' 9145 ' AND [rik_7].[dbo].[_1sjourn].[DOCNO] >= 'р-'), WHERE:(substring([rik_7].[dbo].[_1sjourn].[DOCNO],(1),(2))='р-') ORDERED BACKWARD)
set rowcount 0

Для 2000:
set rowcount 1;
select DOCNO from _1SJOURN(NOLOCK) where DNPREFIX=' 9145 ' and DOCNO>='р-' and substring(DOCNO,1,2)='р-' order by DNPREFIX DESC, DOCNO DESC;
|--Index Seek(OBJECT:([rik_7].[dbo].[_1sjourn].[DOCNO]), SEEK:([_1sjourn].[DNPREFIX]=' 9145 ' AND [_1sjourn].[DOCNO] >= 'р-'), WHERE:(substring([_1sjourn].[DOCNO], 1, 2)='р-') ORDERED BACKWARD)
set rowcount 0

На 2008 выполняется не менее 3 секунд, на 2000 менее 1 с.
В чем может быть дело?
6 июн 11, 16:11    [10771094]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А количество записей?

Полный план покажите, что ли. И статистику set statistics io on.
6 июн 11, 16:15    [10771138]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
gallam
Member

Откуда:
Сообщений: 178
Гавриленко Сергей Алексеевич,

StmtText StmtId NodeId Parent PhysicalOp LogicalOp Argument DefinedValues EstimateRows EstimateIO EstimateCPU AvgRowSize TotalSubtreeCost OutputList Warnings Type Parallel EstimateExecutions
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------- ------------- ------------- ------------- ----------- ---------------- --------------------------------------------------------------------------------------------------------- -------- ---------------------------------------------------------------- -------- ------------------
set rowcount 1; 1 1 0 NULL NULL 1 NULL NULL NULL NULL NULL NULL NULL NULL SET ROWCNT 0 NULL
select DOCNO from _1SJOURN(NOLOCK) where DNPREFIX=' 9145 ' and DOCNO>='р-' and substring(DOCNO,1,2)='р-' order by DNPREFIX DESC, DOCNO DESC; 2 2 0 NULL NULL 2 NULL 1 NULL NULL NULL 0,01371792 NULL NULL SELECT 0 NULL
|--Index Seek(OBJECT:([rik_7].[dbo].[_1sjourn].[DOCNO]), SEEK:([rik_7].[dbo].[_1sjourn].[DNPREFIX]=' 9145 ' AND [rik_7].[dbo].[_1sjourn].[DOCNO] >= 'р-'), WHERE:(substring([rik_7].[dbo].[_1sjourn].[DOCNO],(1),(2))='р-') ORDERED BACKWARD) 2 3 2 Index Seek Index Seek OBJECT:([rik_7].[dbo].[_1sjourn].[DOCNO]), SEEK:([rik_7].[dbo].[_1sjourn].[DNPREFIX]=' 9145 ' AND [rik_7].[dbo].[_1sjourn].[DOCNO] >= 'р-'), WHERE:(substring([rik_7].[dbo].[_1sjourn].[DOCNO],(1),(2))='р-') ORDERED BACKWARD [rik_7].[dbo].[_1sjourn].[ROW_ID], [rik_7].[dbo].[_1sjourn].[DNPREFIX], [rik_7].[dbo].[_1sjourn].[DOCNO] 1 37,35498 12,78614 35 0,01371792 [rik_7].[dbo].[_1sjourn].[ROW_ID], [rik_7].[dbo].[_1sjourn].[DNPREFIX], [rik_7].[dbo].[_1sjourn].[DOCNO] NULL PLAN_ROW 0 1
set rowcount 0 3 4 0 NULL NULL 3 NULL NULL NULL NULL NULL NULL NULL NULL SET ROWCNT 0 NULL

6 июн 11, 16:55    [10771672]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
gallam
Member

Откуда:
Сообщений: 178
Гавриленко Сергей Алексеевич,
Для 2000

StmtText StmtId NodeId Parent PhysicalOp LogicalOp Argument DefinedValues EstimateRows EstimateIO EstimateCPU AvgRowSize TotalSubtreeCost OutputList Warnings Type Parallel EstimateExecutions
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------------------------- ------------- ------------- ------------- ----------- ---------------- ---------------------------------------------------- -------- ------------------------------ -------- ------------------
set rowcount 1; 14 1 0 NULL NULL 1 NULL NULL NULL NULL NULL NULL NULL NULL SETRCON 0 NULL
select DOCNO from _1SJOURN(NOLOCK) where DNPREFIX=' 9145 ' and DOCNO>='р-' and substring(DOCNO,1,2)='р-' order by DNPREFIX DESC, DOCNO DESC; 15 2 0 NULL NULL 2 NULL 1 NULL NULL NULL 0,004081652 NULL NULL SELECT 0 NULL
|--Index Seek(OBJECT:([rik_7].[dbo].[_1sjourn].[DOCNO]), SEEK:([_1sjourn].[DNPREFIX]=' 9145 ' AND [_1sjourn].[DOCNO] >= 'р-'), WHERE:(substring([_1sjourn].[DOCNO], 1, 2)='р-') ORDERED BACKWARD) 15 4 2 Index Seek Index Seek OBJECT:([rik_7].[dbo].[_1sjourn].[DOCNO]), SEEK:([_1sjourn].[DNPREFIX]=' 9145 ' AND [_1sjourn].[DOCNO] >= 'р-'), WHERE:(substring([_1sjourn].[DOCNO], 1, 2)='р-') ORDERED BACKWARD [_1sjourn].[DNPREFIX], [_1sjourn].[DOCNO], [KeyCo1] 1 0,002024683 0,002024683 35 0,004049367 [_1sjourn].[DNPREFIX], [_1sjourn].[DOCNO], [KeyCo1] NULL PLAN_ROW 0 1
set rowcount 0
6 июн 11, 16:56    [10771687]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
gallam
Member

Откуда:
Сообщений: 178
Гавриленко Сергей Алексеевич,
Для 2008:
Таблица "_1sjourn". Число просмотров 1, логических чтений 27900, физических чтений 0, упреждающих чтений 88, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

Для 2000:
Table '_1sjourn'. Scan count 1, logical reads 27756, physical reads 0, read-ahead reads 0.
6 июн 11, 17:02    [10771741]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Тогда уж, чтобы добить, то и SET STATISTICS TIME ON покажите.

И пару слов про окружение: нагрузка, блокировки и т.п., железяки.

З.Ы. А без сабстринга как работает?
6 июн 11, 17:20    [10771945]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Полагаю, что "проблема" в этом:

автор
упреждающих чтений 88


Что будет, если переписать запрос на SELECT TOP 1?
6 июн 11, 17:28    [10772022]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а время как замеряли?
6 июн 11, 17:30    [10772054]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
gallam
Member

Откуда:
Сообщений: 178
Гавриленко Сергей Алексеевич,
Для 2008:
Время работы SQL Server:
Время ЦП = 3214 мс, затраченное время = 3239 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 1 мс.

Для 2000:
SQL Server Execution Times:
CPU time = 1093 ms, elapsed time = 1187 ms.

Эксперимент хорошо воспроизводиться, вне зависимости от блокировок, нагрузок (в любое время).
По данным - таблицы идентичны. INDEX и статистика пересчитывалась, статистика с FULL.
По железу:
2008
16 Гб памяти, 2 шт. х 2 ядер Intel(R) Xeon(R) CPU 5110 @ 1.60GHz 64 бит Таблица _1SJourn - 64 млн.
2000
16 Гб памяти, 16 шт.Процессор Intel(R) Pentium(R) III Xeon 64 бит

На другом сервере 2000 - с 8Гб и 4 процессорами время выполнения 1 с.
Есть основания полагать, что проблема из-за версий MS SQL.
6 июн 11, 17:34    [10772091]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
gallam
Member

Откуда:
Сообщений: 178
pkarklin,
Длительность не изменяется
6 июн 11, 17:34    [10772098]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
По данным - таблицы идентичны. INDEX и статистика пересчитывалась, статистика с FULL.


А что с фрагментацией?

Сообщение было отредактировано: 6 июн 11, 17:36
6 июн 11, 17:36    [10772117]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
gallam
Member

Откуда:
Сообщений: 178
pkarklin,
Проводили чистый эксперимент, переиндексация, перезагрузка серверов - картина не меняется.

set rowcount 1; select DOCNO from _1SJOURN(NOLOCK) where DNPREFIX=' 9145 ' and DOCNO>='р-' and DOCNO<='р-яяяяя' /*substring(DOCNO,1,2)='р-'*/ order by DNPREFIX DESC, DOCNO DESC; set rowcount 0

Отрабатывает мгновенно и на 2008, но в таком виде он не универсальный.

И вопрос почему 2000 выполняет за приемлемое время?
6 июн 11, 17:40    [10772164]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
gallam
Member

Откуда:
Сообщений: 178
pkarklin,
Или имеется в виду файловая фрагментация?
6 июн 11, 17:40    [10772171]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
gallam,

Нет, не файловая.
6 июн 11, 17:51    [10772317]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
Crimean
Member

Откуда:
Сообщений: 13147
снимите трас и там и там
как минимум - батч старт и батч комплит, если это не рпц, конечно
6 июн 11, 17:53    [10772342]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
gallam
Member

Откуда:
Сообщений: 178
pkarklin,
Вообще в глобальном плане стоит задача перевода с 2000 на 2008,
и вот встала проблема. Что только не делали, предварительно пришлось менять collation с SQL_Latin1_General_CP1251_CI_AS на Cyrillic_General_CI_AS для всех таблиц и колонок.
Когда был старый collation, то план выполнения был еще хуже: добавился блок sort и время выполнения было около 15-20 секунд.
Потом план стал аналогичным с MS SQL 2000, но длительность хуже.

Может есть подводные камни при замене collation.
6 июн 11, 17:56    [10772378]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
gallam
Member

Откуда:
Сообщений: 178
Crimean,
Трассы собирали, но их результаты аналогично показанным выше (CPU,READS).
Если принципиально требуется, то собрать не проблема?
6 июн 11, 17:59    [10772410]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
Crimean
Member

Откуда:
Сообщений: 13147
gallam
Crimean,
Трассы собирали, но их результаты аналогично показанным выше (CPU,READS).
Если принципиально требуется, то собрать не проблема?


так вот как раз интересно сравнить цифры по reads / cpu на обоих системах
6 июн 11, 18:24    [10772646]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а substring на like менять не пробовали?
6 июн 11, 18:32    [10772702]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
gallam,

попробуйте поменять
substring(DOCNO,1,2)='р-'
на
DOCNO>='р-'
6 июн 11, 18:52    [10772835]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
хотя нет я поторопился:)

так не пойдет:)

попробуйте и вправду like как Crimeam советует
6 июн 11, 18:56    [10772856]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
gallam
pkarklin,
Проводили чистый эксперимент, переиндексация, перезагрузка серверов - картина не меняется...
И всё же, что вернет DBCC SHOWCONTIG с обоих серверов?
7 июн 11, 09:03    [10774429]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
gallam
Member

Откуда:
Сообщений: 178
tpg,
SHOWCONTIG для _1SJourn и индекса DOCNO в данный момент.

На 2000
DBCC SHOWCONTIG scanning '_1sjourn' table...
Table: '_1sjourn' (1656529751); index ID: 4, database ID: 7
LEAF level scan performed.
- Pages Scanned................................: 277690
- Extents Scanned..............................: 34927
- Extent Switches..............................: 39388
- Avg. Pages per Extent........................: 8.0
- Scan Density [Best Count:Actual Count].......: 88.13% [34712:39389]
- Logical Scan Fragmentation ..................: 0.44%
- Extent Scan Fragmentation ...................: 13.04%
- Avg. Bytes Free per Page.....................: 40.6
- Avg. Page Density (full).....................: 99.50%
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

На 2008
DBCC SHOWCONTIG просматривает таблицу "_1sjourn"..
Таблица: "_1sjourn" (1143368900); идентификатор индекса: 5, идентификатор базы данных: 5
Выполнен просмотр LEAF уровня.
- Просмотрено страниц................: 277285
- Просмотрено экстентов................: 34678
- Переключений экстентов................: 36733
- Среднее число страниц на экстент............: 8.0
- Плотность просмотра [лучший счетчик:фактический счетчик]....: 94.36% [34661:36734]
- Логическое разбиение просмотра.........: 0.91%
- Разбиение просмотра по экстентам.........: 11.97%
- В среднем байт на страницу............: 28.8
- Средняя плотность страницы (полная)...........: 99.64%
Выполнение DBCC завершено. Если DBCC выдает сообщения об ошибках, обратитесь к системному администратору.

Crimean,
like отрабатывает мгновенно.
7 июн 11, 09:17    [10774495]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
Crimean
Member

Откуда:
Сообщений: 13147
ну так замените substring на like. будет совместимо / переносимо / быстро. + это бест практикс как ни крути. а то ms в порыве "оптимизнуть" в 2008 сервере хомутов столько наделало, что обходить не успеваю
7 июн 11, 10:45    [10774937]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с длительностью выполнения запроса на 2008 сервере  [new]
gallam
Member

Откуда:
Сообщений: 178
Crimean,
Думаю это единственный вариант. Спасибо
7 июн 11, 11:56    [10775609]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить