Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Обход CROSS APPLY для Server 2000 (80)  [new]
Egen
Guest
Привет!
Есть скрипт который отлично работает с базами 2005 сервера, на что можно изменить CROSS APPLY что-бы скрипт отработал с 2000 сервером?
З.Ы.
Если возможно то поподробней )

USE AdventureWorks;
GO
SELECT TOP 5 query_stats.query_hash AS "Query Hash", 
    SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time",
    MIN(query_stats.statement_text) AS "Statement Text"
FROM 
    (SELECT QS.*, 
    SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
    ((CASE statement_end_offset 
        WHEN -1 THEN DATALENGTH(st.text)
        ELSE QS.statement_end_offset END 
            - QS.statement_start_offset)/2) + 1) AS statement_text
     FROM sys.dm_exec_query_stats AS QS
     CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;
GO
19 ноя 09, 00:19    [7948020]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36800
И типа в 2000м от этого сразу схема sys появится со всеми объектами в ней?
19 ноя 09, 00:48    [7948137]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
Egen
Guest
Не совсем так написал.
Реально строит 2005 сервер
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)   Nov 24 2008 13:01:59   Copyright (c) 1988-2005 Microsoft Corporation  Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2) 
на нем крутится база от 2000 сервера. В целом задача выглядит в необходимости получения самых тяжелых запросов на сервере.
В принципе нашел стандартный отчет который показывается TOP 10 тяжелых запросов, интересно, как получить ту же информацию скриптом.
19 ноя 09, 10:04    [7948746]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Гавриленко Сергей Алексеевич
И типа в 2000м от этого сразу схема sys появится со всеми объектами в ней?


это 5+!

автору - скрипт не будет работать на 2000, даже если там появится CROSS APPLY - он работает с системными представлениями 2005 / 2008, которых нет в 2000 и уже не будет точно, даже если туда CROSS APPLY притянут во внеочередном сервиспаке
19 ноя 09, 10:06    [7948759]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
Crimean
Member

Откуда:
Сообщений: 13148
> Реально строит 2005 сервер
> на нем крутится база от 2000 сервера

просто уровень совместимости поднять
19 ноя 09, 10:16    [7948820]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Crimean
> Реально строит 2005 сервер
> на нем крутится база от 2000 сервера

просто уровень совместимости поднять
При этом много чего другого отвалится!

Если уж на то пошло, серьёзно взяться за причёсывание базы для 90-го уровеня,
прежде чем его поднимать. Может, быстро и не получится...
19 ноя 09, 10:24    [7948891]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

так apply, вроде, и при уровне 80 работает на 2005-ом.

Posted via ActualForum NNTP Server 1.4

19 ноя 09, 10:26    [7948906]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
daw

так apply, вроде, и при уровне 80 работает на 2005-ом.
По-моему, как раз-таки нет. При вызове функции с аргументом - не константой и не-переменной получается сообщение об ошибке.
А с производными таблицами работает.

В данном случае имеется именно вызов функции.
19 ноя 09, 10:40    [7948989]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
Egen
Guest
Поднять базу до 90 не представляется возможным, софт понимает только 80 (

Порывшись по форуму нашел скрипт который вроде меня устраивает, если кому интересно:
[url=]blogs.gotdotnet.ru/personal/DeColores/PermaLink.aspx?guid=d0009292-66b2-415a-81f9-0740484908f9[/url]
как не странно тот же CROSS APPLY там отрабатывает...
19 ноя 09, 11:00    [7949114]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Egen
Поднять базу до 90 не представляется возможным, софт понимает только 80 (

Порывшись по форуму нашел скрипт который вроде меня устраивает, если кому интересно:
[url=]blogs.gotdotnet.ru/personal/DeColores/PermaLink.aspx?guid=d0009292-66b2-415a-81f9-0740484908f9[/url]
как не странно тот же CROSS APPLY там отрабатывает...
Можно увидеть здесь скрипт, который Вы выполняете при уровне совместимости 80, и он "отрабатывает"?
19 ноя 09, 11:08    [7949188]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
У нас как раз базы "в уровне совместимости" 80.
Но ничто не мешает успешно запускать эти скрипты в контексте базы master, которая естественно нормально в 90 работает. ;)
19 ноя 09, 11:17    [7949269]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
Egen
Guest
Сорри, вот скрипт:
select top 30 rank() over(order by total_logical_reads desc,sql_handle,statement_start_offset) as row_no, 
             (rank() over(order by total_logical_reads desc,sql_handle,statement_start_offset))%2 as l1,
 creation_time,
 last_execution_time,
 (total_worker_time+0.0)/1000 as total_worker_time,
 (total_worker_time+0.0)/(execution_count*1000) as [AvgCPUTime],
 total_logical_reads as [LogicalReads],
 total_logical_writes as [logicalWrites],
 execution_count,
 total_logical_reads+total_logical_writes as [AggIO],
 (total_logical_reads+total_logical_writes)/(execution_count + 0.0) as [AvgIO],
case when sql_handle IS NULL
 then ' '
else ( substring(st.text,(qs.statement_start_offset+2)/2,(case when qs.statement_end_offset = -1        then len(convert(nvarchar(MAX),st.text))*2      else qs.statement_end_offset    end - qs.statement_start_offset) /2  ) )
        end as query_text,
               db_name(st.dbid) as database_name,
               so.name as procedure_name,
               plan_handle
from sys.dm_exec_query_stats  qs
cross apply sys.dm_exec_sql_text(sql_handle) st
left join myDB.dbo.sysobjects so ON so.id = st.objectid
where total_logical_reads > 0
order by total_logical_reads  DESC

DeColo®es

Но ничто не мешает успешно запускать эти скрипты в контексте базы master, которая естественно нормально в 90 работает. ;)

А можно пример в студию ))
19 ноя 09, 11:43    [7949546]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Egen,

наверно, так:
master.dbo.sp_executesql N'select top (30) rank() over(order by total_logical_reads desc,sql_handle,statement_start_offset) as row_no, 
             (rank() over(order by total_logical_reads desc,sql_handle,statement_start_offset))%2 as l1,
 creation_time,
 last_execution_time,
 (total_worker_time+0.0)/1000 as total_worker_time,
 (total_worker_time+0.0)/(execution_count*1000) as [AvgCPUTime],
 total_logical_reads as [LogicalReads],
 total_logical_writes as [logicalWrites],
 execution_count,
 total_logical_reads+total_logical_writes as [AggIO],
 (total_logical_reads+total_logical_writes)/(execution_count + 0.0) as [AvgIO],
case when sql_handle IS NULL
 then '' ''
else ( substring(st.text,(qs.statement_start_offset+2)/2,(case when qs.statement_end_offset = -1 then len(convert(nvarchar(MAX),st.text))*2 else qs.statement_end_offset end - qs.statement_start_offset)/2))
        end as query_text,
               db_name(st.dbid) as database_name,
               so.name as procedure_name,
               plan_handle
from sys.dm_exec_query_stats  qs
cross apply sys.dm_exec_sql_text(sql_handle) st
left join MyDB.dbo.sysobjects so ON so.id = st.objectid
where total_logical_reads > 0
order by total_logical_reads  DESC';
19 ноя 09, 12:26    [7949939]     Ответить | Цитировать Сообщить модератору
 Re: Обход CROSS APPLY для Server 2000 (80)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Или USE master; перед SELECTом
19 ноя 09, 12:27    [7949947]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить