Проблемы с длительностью выполнения запроса на 2008 сервере

gallam
Дата: 06.06.2011 16:11:36
Коллеги, нужна ваша помощь.

Есть 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 с.
В чем может быть дело?
Гавриленко Сергей Алексеевич
Дата: 06.06.2011 16:15:34
А количество записей?

Полный план покажите, что ли. И статистику set statistics io on.
gallam
Дата: 06.06.2011 16:55:50
Гавриленко Сергей Алексеевич,

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

gallam
Дата: 06.06.2011 16:56:54
Гавриленко Сергей Алексеевич,
Для 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
gallam
Дата: 06.06.2011 17:02:28
Гавриленко Сергей Алексеевич,
Для 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.
Гавриленко Сергей Алексеевич
Дата: 06.06.2011 17:20:57
Тогда уж, чтобы добить, то и SET STATISTICS TIME ON покажите.

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

З.Ы. А без сабстринга как работает?
pkarklin
Дата: 06.06.2011 17:28:04
Полагаю, что "проблема" в этом:

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


Что будет, если переписать запрос на SELECT TOP 1?
Crimean
Дата: 06.06.2011 17:30:47
а время как замеряли?
gallam
Дата: 06.06.2011 17:34:16
Гавриленко Сергей Алексеевич,
Для 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.
gallam
Дата: 06.06.2011 17:34:55
pkarklin,
Длительность не изменяется