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

Откуда: Санкт-Петербург
Сообщений: 520
Добрый день, коллеги!

В системе требуется делать каждый определенный период времени опрос базы на некие изменения.
В таблице Requests находится около 300 000 записей, столько же в таблице Request_TitleAndDescription.
В таблице SD_Systems всего 20.

Конфигурация сервера:
Xeon 2.6, 6 GB Ram. Размер базы 500 МБ.

Когда данный запрос выполняют 20 пользователей, то нагрузка на сервер небольшая и запрос обрабатывается за 140-180 мс
Но если подключаются 1000-1200 пользователей, то нагрузка вырастает до 98% и запросы начинают обрабатываться по 13-20 секунд.

Запрос (простынка):
	declare @FIDUser uniqueidentifier

	set @FIDUser=convert(uniqueidentifier,'6941FA90-7E1A-4CB3-B86D-5A8BFEFE89F4') --пример

	create table #t(IDRequest int, 
						  IDSystem int, 
						  SystemName nvarchar(50), 
						  RequestTitle nvarchar(50), 
						  RequestType int)

		 --Get waiting approvals
		 insert into #t
			  (IDRequest, IDSystem, SystemName, RequestTitle, RequestType)
		 select
			  r.id_request
			  ,s.id_system
			  ,s.system_name
			  ,td.request_title
			  ,0
		 from Request_Approvals ra
		 inner join Requests r on
		 ra.id_request=r.id_request
		 inner join SD_Systems s on
		 r.id_system=s.id_system
		 left join Request_TitleAndDescription td on
		 td.id_request=r.id_request
		 where 
			  ra.id_manager=@FIDUser and
			  ra.actual = 1 and 
			  ra.approved is null

		 --New request in your system

		 union

		 --insert into #t
			--  (IDRequest, IDSystem, SystemName, RequestTitle, RequestType)
		 select
			  r.id_request
			  ,s.id_system
			  ,s.system_name
			  ,td.request_title
			  ,1
		 from Requests r
		 inner join SD_Systems s on
		 r.id_system=s.id_system
		 left join Request_TitleAndDescription td on
		 td.id_request=r.id_request
		 where 
			  s.id_system in (select 
										  ur.id_system 
									from SD_Users_Roles ur 
									where 
										  ur.id_user=@FIDUser and
										  ur.id_role>1									 
										  ) and
			  r.id_status=(select ss.id_status_new from SD_Systems ss where ss.id_system=s.id_system)

	
		 --User commented request where you are responsible

		 union

		 --insert into #t
			--  (IDRequest, IDSystem, SystemName, RequestTitle, RequestType)
		 select
			  r.id_request
			  ,s.id_system
			  ,s.system_name
			  ,td.request_title
			  ,2
		 from Requests r
		 inner join SD_Systems s on
		 r.id_system=s.id_system
		 left join Request_TitleAndDescription td on
		 td.id_request=r.id_request
		 where
			  r.id_ballstatus=2 and
			  r.id_administrator=@FIDUser

		 --Request are waiting your approval (Waiting For Approval for closing)

		 union

		 --insert into #t
			--  (IDRequest, IDSystem, SystemName, RequestTitle, RequestType)
		 select
			  r.id_request
			  ,s.id_system
			  ,s.system_name
			  ,td.request_title
			  ,3
		 from Requests r
		 inner join SD_Systems s on
		 r.id_system=s.id_system
		 left join Request_TitleAndDescription td on
		 td.id_request=r.id_request
		 where
			  r.id_status=(select ss.id_status_WfA from SD_Systems ss where ss.id_system=s.id_system) and
			  r.id_owner=@FIDUser


		 --Admin commented request where you are owner

		 union

		 --insert into #t
			--  (IDRequest, IDSystem, SystemName, RequestTitle, RequestType)
		 select
			  r.id_request
			  ,s.id_system
			  ,s.system_name
			  ,td.request_title
			  ,4
		 from Requests r
		 inner join SD_Systems s on
		 r.id_system=s.id_system
		 left join Request_TitleAndDescription td on
		 td.id_request=r.id_request
		 where
			  r.id_ballstatus=1 and
			  r.id_owner=@FIDUser

	--end

		 select * from #t t order by t.RequestType,t.IDRequest


Как видно из запроса, то постоянно используется обращение
		 inner join SD_Systems s on
		 r.id_system=s.id_system
		 left join Request_TitleAndDescription td on
		 td.id_request=r.id_request


Можно ли как-то объединить данные запросы для ускорения обработки?

Спасибо.

Никогда не бойся делать то, что не умеешь.
Помни, профессионалы построили Титаник, а Ковчег любители.
16 май 16, 09:44    [19177362]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Kast2K,

ну так судя по тому что этот кусок только для доставки(кроме одного места), то и пишите его в итоговый селект...
ps UNION довольно прилично тормозит всё, сделайте ALL и отбросьте в результате или через NOT EXISTS переделать
16 май 16, 09:51    [19177383]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @FIDUser UNIQUEIDENTIFIER
SET @FIDUser = '6941FA90-7E1A-4CB3-B86D-5A8BFEFE89F4'

SELECT *
FROM (
    SELECT IDRequest = r.id_request,
           IDSystem = s.id_system,
           SystemName = s.system_name,
           RequestTitle = td.request_title,
           RequestType = 0
    FROM Request_Approvals ra
    JOIN Requests r ON ra.id_request = r.id_request
    JOIN SD_Systems s ON r.id_system = s.id_system
    LEFT JOIN Request_TitleAndDescription td ON td.id_request = r.id_request
    WHERE ra.id_manager = @FIDUser
        AND ra.actual = 1
        AND ra.approved IS NULL

    UNION

    SELECT r.id_request,
           s.id_system,
           s.system_name,
           td.request_title,
           1
    FROM Requests r
    JOIN SD_Systems s ON r.id_system = s.id_system
    LEFT JOIN Request_TitleAndDescription td ON td.id_request = r.id_request
    WHERE s.id_system IN (
            SELECT ur.id_system
            FROM SD_Users_Roles ur
            WHERE ur.id_user = @FIDUser
                AND ur.id_role > 1
        )
        AND r.id_status = s.id_status_new

    UNION

    SELECT r.id_request,
           s.id_system,
           s.system_name,
           td.request_title,
           CASE
               WHEN r.id_ballstatus = 1 AND r.id_owner = @FIDUser THEN 4
               WHEN r.id_status = s.id_status_WfA AND r.id_owner = @FIDUser THEN 3
               ELSE 2
           END
    FROM Requests r
    JOIN SD_Systems s ON r.id_system = s.id_system
    LEFT JOIN Request_TitleAndDescription td ON td.id_request = r.id_request
    WHERE (r.id_ballstatus = 1 AND r.id_owner = @FIDUser)
        OR (r.id_ballstatus = 2 AND r.id_administrator = @FIDUser)
        OR (r.id_status = s.id_status_WfA AND r.id_owner = @FIDUser)
) t
ORDER BY t.RequestType,
         t.IDRequest
OPTION(RECOMPILE)

Не устану повторять. Без плана выполнения это как пальцем в небо. Пробуйте... Основные косяки думаю очевидны. Подозрение на: параметер снифферинг, отсутствие покрывающих индексов + многократное чтение из одних и тех же таблиц...
16 май 16, 10:19    [19177478]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @FIDUser UNIQUEIDENTIFIER
SET @FIDUser = '6941FA90-7E1A-4CB3-B86D-5A8BFEFE89F4'

SELECT *
FROM (
    SELECT IDRequest = r.id_request,
           IDSystem = s.id_system,
           SystemName = s.system_name,
           RequestTitle = r.id_request,
           RequestType = 0
    FROM dbo.Request_Approvals ra
    JOIN dbo.Requests r ON ra.id_request = r.id_request
    JOIN dbo.SD_Systems s ON r.id_system = s.id_system
    WHERE ra.id_manager = @FIDUser
        AND ra.actual = 1
        AND ra.approved IS NULL

    UNION

    SELECT r.id_request,
           s.id_system,
           s.system_name,
           r.id_request,
           1
    FROM dbo.Requests r
    JOIN dbo.SD_Systems s ON r.id_system = s.id_system
    WHERE s.id_system IN (
            SELECT ur.id_system
            FROM dbo.SD_Users_Roles ur
            WHERE ur.id_user = @FIDUser
                AND ur.id_role > 1
        )
        AND r.id_status = s.id_status_new

    UNION

    SELECT r.id_request,
           s.id_system,
           s.system_name,
           r.id_request,
           CASE
               WHEN r.id_ballstatus = 1 AND r.id_owner = @FIDUser THEN 4
               WHEN r.id_status = s.id_status_WfA AND r.id_owner = @FIDUser THEN 3
               ELSE 2
           END
    FROM dbo.Requests r
    JOIN dbo.SD_Systems s ON r.id_system = s.id_system
    WHERE (r.id_ballstatus = 1 AND r.id_owner = @FIDUser)
        OR (r.id_ballstatus = 2 AND r.id_administrator = @FIDUser)
        OR (r.id_status = s.id_status_WfA AND r.id_owner = @FIDUser)
) t
LEFT JOIN dbo.Request_TitleAndDescription td ON td.id_request = t.id_request
ORDER BY t.RequestType, t.IDRequest
OPTION(RECOMPILE)
16 май 16, 10:24    [19177498]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
AlanDenton, спасибо!
Нечто похожее я также написал, но через ALL.

Благодаря вашему коду скорость обработки увеличилась с 13 до 7,5 секунд (установил для 1000 пользователей), но загрузка все равно большая(80-90%) у сервака.
В приложении план выполнения.

Может дело в самом серваке? Данная хранимка дергается пользователем каждые 5 секунд.

К сообщению приложен файл (notifyplan.zip - 6Kb) cкачать
16 май 16, 11:20    [19177817]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
1. Какие столбцы есть в dbo.Request_TitleAndDescription (кроме request_title, id_reques)?
2. Статистику для dbo.Request_TitleAndDescription обновляли когда?
3. Такой вариант быстрее работает?

+
DECLARE @FIDUser UNIQUEIDENTIFIER
SET @FIDUser = '6941FA90-7E1A-4CB3-B86D-5A8BFEFE89F4'

IF OBJECT_ID('tempdb.dbo.#t') IS NOT NULL
    DROP TABLE #t

CREATE TABLE #t (
    IDRequest INT,
    IDSystem INT,
    SystemName NVARCHAR(50),
    RequestID INT,
    RequestType TINYINT,
    PRIMARY KEY CLUSTERED (RequestType, IDRequest)
)

INSERT INTO #t
SELECT r.id_request,
       s.id_system,
       s.system_name,
       r.id_request,
       0
FROM dbo.Request_Approvals ra
JOIN dbo.Requests r ON ra.id_request = r.id_request
JOIN dbo.SD_Systems s ON r.id_system = s.id_system
WHERE ra.id_manager = @FIDUser
    AND ra.actual = 1
    AND ra.approved IS NULL

UNION

SELECT r.id_request,
       s.id_system,
       s.system_name,
       r.id_request,
       1
FROM dbo.Requests r
JOIN dbo.SD_Systems s ON r.id_system = s.id_system
WHERE s.id_system IN (
        SELECT ur.id_system
        FROM dbo.SD_Users_Roles ur
        WHERE ur.id_user = @FIDUser
            AND ur.id_role > 1
    )
    AND r.id_status = s.id_status_new

UNION

SELECT r.id_request,
       s.id_system,
       s.system_name,
       r.id_request,
       CASE
           WHEN r.id_ballstatus = 1 AND r.id_owner = @FIDUser THEN 4
           WHEN r.id_status = s.id_status_WfA AND r.id_owner = @FIDUser THEN 3
           ELSE 2
       END
FROM dbo.Requests r
JOIN dbo.SD_Systems s ON r.id_system = s.id_system
WHERE (r.id_ballstatus = 1 AND r.id_owner = @FIDUser)
    OR (r.id_ballstatus = 2 AND r.id_administrator = @FIDUser)
    OR (r.id_status = s.id_status_WfA AND r.id_owner = @FIDUser)
OPTION(RECOMPILE)

SELECT *
FROM #t t
LEFT JOIN dbo.Request_TitleAndDescription td ON td.id_request = t.id_request
ORDER BY t.RequestType, t.IDRequest


4. Что со статистикой ожиданий?
5. Как вариант рассмотрите вариант денормальзации (нужные столбцы добавить из SD_Systems в Requests и создать покрывающий индекс)
16 май 16, 11:51    [19177999]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
явно беда с Request_TitleAndDescription, что там за индексы? Обслуживание индексов в принципе делаете?
16 май 16, 11:54    [19178015]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
TaPaK
явно беда с Request_TitleAndDescription, что там за индексы?

Нет там индексов кроме кластерного (вангую что 3 столбца и последний varchar(4000+)) и явно видно лажу при оценке строк.

Kast2K, SQL Server 2008?
16 май 16, 11:57    [19178033]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
AlanDenton
TaPaK
явно беда с Request_TitleAndDescription, что там за индексы?

Нет там индексов кроме кластерного (вангую что 3 столбца и последний varchar(4000+)) и явно видно лажу при оценке строк.

Kast2K, SQL Server 2008?

ну так пусть создаст :)
16 май 16, 12:00    [19178052]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
AlanDenton,

1. таблица Request_TitleAndDescription: id_request(int), request_description(nvarchar(max)), request_title nvarchar(50))
в ней всего лишь 1 индекс по полю id_request (primary) и полнотекстовый индекс по данным полям.
2. статистика обновляется 1 раз в неделю.
3. не быстрее, также 7,5-8 секунд в профайлере
4. статистика ожиданий
wait_type wait_time wait_resource wait_signal waiting_tasks_count percentage avg_wait avg_wait_resource avg_wait_signal
SOS_SCHEDULER_YIELD 0.216000 0.000000 0.216000 8 100.000000000000000 0.0270000000000000000 0.0000000000000000000 0.027000000000000000
16 май 16, 12:12    [19178123]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
AlanDenton,

в точку.
В поле request_description юзер может записать огроменный текст, если потребуется
16 май 16, 12:14    [19178137]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Создаем покрывающий индекс (если сервер его игнорит, хардкодим хинтом):

CREATE NONCLUSTERED INDEX ix
    ON dbo.Request_TitleAndDescription (id_request) INCLUDE (request_title)
GO

Kast2K
3. не быстрее, также 7,5-8 секунд в профайлере

А * убрали?
+
DECLARE @FIDUser UNIQUEIDENTIFIER
SET @FIDUser = '6941FA90-7E1A-4CB3-B86D-5A8BFEFE89F4'

IF OBJECT_ID('tempdb.dbo.#t') IS NOT NULL
    DROP TABLE #t

CREATE TABLE #t (
    IDRequest INT,
    IDSystem INT,
    SystemName NVARCHAR(50),
    RequestID INT,
    RequestType TINYINT,
    PRIMARY KEY CLUSTERED (RequestType, IDRequest) WITH (IGNORE_DUP_KEY=ON)
)

INSERT INTO #t
SELECT r.id_request,
       s.id_system,
       s.system_name,
       r.id_request,
       0
FROM dbo.Request_Approvals ra
JOIN dbo.Requests r ON ra.id_request = r.id_request
JOIN dbo.SD_Systems s ON r.id_system = s.id_system
WHERE ra.id_manager = @FIDUser
    AND ra.actual = 1
    AND ra.approved IS NULL

UNION ALL

SELECT r.id_request,
       s.id_system,
       s.system_name,
       r.id_request,
       1
FROM dbo.Requests r
JOIN dbo.SD_Systems s ON r.id_system = s.id_system
WHERE s.id_system IN (
        SELECT ur.id_system
        FROM dbo.SD_Users_Roles ur
        WHERE ur.id_user = @FIDUser
            AND ur.id_role > 1
    )
    AND r.id_status = s.id_status_new

UNION ALL

SELECT r.id_request,
       s.id_system,
       s.system_name,
       r.id_request,
       CASE
           WHEN r.id_ballstatus = 1 AND r.id_owner = @FIDUser THEN 4
           WHEN r.id_status = s.id_status_WfA AND r.id_owner = @FIDUser THEN 3
           ELSE 2
       END
FROM dbo.Requests r
JOIN dbo.SD_Systems s ON r.id_system = s.id_system
WHERE (r.id_ballstatus = 1 AND r.id_owner = @FIDUser)
    OR (r.id_ballstatus = 2 AND r.id_administrator = @FIDUser)
    OR (r.id_status = s.id_status_WfA AND r.id_owner = @FIDUser)
OPTION(RECOMPILE)

SELECT t.IDRequest,
       t.IDSystem,
       t.SystemName,
       RequestTitle = td.request_title,
       t.RequestType
FROM #t t
LEFT JOIN dbo.Request_TitleAndDescription td ON td.id_request = t.id_request
ORDER BY t.RequestType, t.IDRequest

Kast2K
4. статистика ожиданий

Эх... зачем же выполнили:

DBCC SQLPERF("sys.dm_os_wait_stats", CLEAR)

Так же ничего не понятно теперь в чем затык высокого потребления ЦП.
16 май 16, 12:21    [19178175]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
AlanDenton,

а для не продвинутых, зачем индекс на id_request если он у него и так кластерный? т.е. прям сейчас это офигенно решит проблему, но исходя из того что видим выше у него вставка "дробит страницы" и в результате мы получим и на новом индексе туже фигню. Я не прав?
16 май 16, 12:27    [19178205]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
TaPaK
а для не продвинутых, зачем индекс на id_request если он у него и так кластерный?

Не нравится предыдущий вариант можно и так сделать:

EXEC sp_tableoption 'dbo.Request_TitleAndDescription', 'large value types out of row', 1;

Идея сократить логические чтения... не более.
16 май 16, 12:34    [19178258]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
TaPaK
из того что видим выше у него вставка "дробит страницы"

Позвольте узнать, а где Вы это увидели? Я видимо упустил из виду.
16 май 16, 12:45    [19178315]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
AlanDenton
TaPaK
из того что видим выше у него вставка "дробит страницы"

Позвольте узнать, а где Вы это увидели? Я видимо упустил из виду.

ну я это вижу исходя из того что у него идёт scan с неверное оценкой по кластерному(и единственному) индексу.

для интереса Kast2K покажите:

SELECT a.index_id, name, avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(N'DB'), OBJECT_ID(N'Request_TitleAndDescription'), NULL, NULL, NULL) AS a
    JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id; 
16 май 16, 12:53    [19178357]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
TaPaK,

1 PK_Request_Description 0,458978772231784
1 PK_Request_Description 0
16 май 16, 13:00    [19178381]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
AlanDenton
Создаем покрывающий индекс (если сервер его игнорит, хардкодим хинтом):
А * убрали?

конечно.
16 май 16, 13:02    [19178392]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
invm
Member

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

1. Покажите результат select @@version

2. В плане у вас есть явное безобразие для фрагмента
    SELECT r.id_request,
           s.id_system,
           s.system_name,
           r.id_request,
           1
    FROM dbo.Requests r
    JOIN dbo.SD_Systems s ON r.id_system = s.id_system
    WHERE s.id_system IN (
            SELECT ur.id_system
            FROM dbo.SD_Users_Roles ur
            WHERE ur.id_user = @FIDUser
                AND ur.id_role > 1
        )
        AND r.id_status = s.id_status_new
Явно зывышенная оценка для одного из NL - на входах 1 и 15 строк, на выходе более 3000. Отсюда и дальнейший hash join с Request_TitleAndDescription.
Так же оптимизатор завершил поиск плана по таймауту, что, опять же, несколько странно для такого относительно простого запроса.
Возможно у вас просто непатченная RTM-версия сиквела (см. п. 1)

3. 7-8 секунд для такого запроса и на таких данных - очень много. Явно есть ожидания.
Убедится в этом можно отследив разницу между elapsed time и worker time в sys.dm_exec_query_stats для этого запроса.
Чтобы выяснить какие именно ожидания, отслеживайте их для конкретного запроса через Extended Events. Как это сделать описано, например, тут - http://www.sqlskills.com/blogs/paul/capturing-wait-stats-for-a-single-operation/
16 май 16, 13:03    [19178399]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
TaPaK
ну я это вижу исходя из того что у него идёт scan с неверное оценкой по кластерному

Мне кажется ситуация тут в другом. Большинство значений request_description помешяется на страницу (а значит храниться как INROW), но за счет того что вычитывать их не надо получаются лишние логические чтения при сканировании кластерного индекса. sp_tableoption либо индекс должны решить проблему.
16 май 16, 13:07    [19178427]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
AlanDenton
TaPaK
ну я это вижу исходя из того что у него идёт scan с неверное оценкой по кластерному

Мне кажется ситуация тут в другом. Большинство значений request_description помешяется на страницу (а значит храниться как INROW), но за счет того что вычитывать их не надо получаются лишние логические чтения при сканировании кластерного индекса. sp_tableoption либо индекс должны решить проблему.

возможно я не прав...

Kast2K, всё-таки покажите создание PK_Request_Description
16 май 16, 13:10    [19178443]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
invm,

Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (Intel X86) Sep 16 2010 20:09:22 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2) (VM)

CREATE TABLE [dbo].[Request_TitleAndDescription](
	[id_request] [int] NOT NULL,
	[request_description] [nvarchar](max) NOT NULL,
	[request_title] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Request_Description] PRIMARY KEY CLUSTERED 
(
	[id_request] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
16 май 16, 13:13    [19178462]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
Сервер тупил на простейшем селекте (select top 1 from table (3 строчки)) из данной базы.
Перезагрузил.
Повторно обновил статистику.
Результат -
Time Statistics
Client processing time 4 4.0000
Total execution time 45 45.0000
Wait time on server replies 41 41.0000

Т.е. проблема была в самом сервере? не понимаю :(
16 май 16, 13:35    [19178591]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
Execution plan

К сообщению приложен файл (notifyplan_v2.zip - 6Kb) cкачать
16 май 16, 13:36    [19178595]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация объединения нескольких запросов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Kast2K,
сейчас актуальный план запроса совпадает с приведённым вами?
16 май 16, 13:36    [19178597]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить