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

Откуда:
Сообщений: 55
Коллеги,

Есть достаточно сложный запрос, который возвращает относительно много данных. Как можно получить оценку (пусть даже приблизительную) количества строк, которых вернет этот запрос. Делать count(*) перед запросом не вариант, т.к. это будет слишком долго. Делать select @@rowcount после запроса и возвращать 2 резалт сета тоже не получится похоже... Т.к. SqlDataReader не поволяет прочитать значение 2-го резалт сета перед чтением первого резалтсета. Есть ли еще какие-то варианты.

P.S. Сейчас в голову пришла идея использовать row_number, но боюсь также скажется на производительности (под рукой нет данных чтобы прогнать запрос). Вобщем никто не сталкивался? Как такой вопрос решать можно?
27 авг 14, 22:37    [16503905]     Ответить | Цитировать Сообщить модератору
 Re: Получить оценку количества строк, который вернет запрос перед его выполнением  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Spinifex
Как можно получить оценку (пусть даже приблизительную) количества строк, которых вернет этот запрос
Можно, вытащить оценочное количество строк из плана запроса. Например вот так:
declare
 @proc sysname = quotename(N'#' + cast(newid() as sysname)),
 @mark nvarchar(50) = N'/*' + cast(newid() as nvarchar(36)) + N'*/';

declare
 @query nvarchar(max) = N'select * from sys.objects where type = ''P'';' + @mark;

declare
 @s nvarchar(max) = N'create procedure ' + @proc + N'as begin select p.query_plan from sys.dm_exec_requests r cross apply sys.dm_exec_query_plan(r.plan_handle) p where r.session_id = @@spid; return; ' + @query + N' end;';

exec(@s);

declare @t table (query_plan xml);

insert into @t
 exec @proc;

with xmlnamespaces(default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
select
 s.x.value('@StatementEstRows', 'numeric(18,2)') as [Estimated number of rows]
from
 @t t cross apply
 t.query_plan.nodes(N'//StmtSimple[contains(@StatementText, sql:variable("@mark"))]') s(x);

exec('drop procedure ' + @proc);

Но такая оценка может быть весьма приблизительной.
28 авг 14, 00:17    [16504193]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить