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

Откуда: Москва
Сообщений: 95
Методом вырезания всего и вся имею запрос, который выполняется за 1 секунду

	SELECT 
	 	SLU.*
       	FROM RE_SLU AS SLU
	INNER JOIN RE_SR AS SR
	ON
		SLU.SR_ID=SR.SR_ID
	LEFT JOIN MAINSPR..SPR_LPU AS LPU
	ON
		SLU.LPU_ID=LPU.LPU_ID
	LEFT JOIN MAINSPR..SPR_MKB AS MKB
	ON
		SLU.SLU_DS=MKB.DS_ID

и запрос, который выполняется за 19 секунд

	SELECT 
	 	SLU.*,
		ISNULL(LPU.LPU_NAME,'') AS LPU_NAME
       	FROM RE_SLU AS SLU
	INNER JOIN RE_SR AS SR
	ON
		SLU.SR_ID=SR.SR_ID
	LEFT JOIN MAINSPR..SPR_LPU AS LPU
	ON
		SLU.LPU_ID=LPU.LPU_ID
	LEFT JOIN MAINSPR..SPR_MKB AS MKB
	ON
		SLU.SLU_DS=MKB.DS_ID

Как видно - отличие всего лишь в доп. строке! В таблице RE_SLU - чуть больше 10 тыс записей, в таблице SPR_LPU - 195 записей. Размерность поля LPU_ID - [LPU_ID] [varchar](15) NOT NULL. Чему тут тормозить не представляю! Сижу уже 2 день. Все индексы, статистики обновил. Не помогает

Дополнительная информация:

@@VERSION:

	Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
	Jul 9 2008 14:43:34 
	Copyright (c) 1988-2008 Microsoft Corporation
	Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2) (VM)


SERVERPROPERTY:

MachineName=MC-TSQL
Edition=Enterprise Edition
ProductVersion=10.0.1600.22
ProductLevel=RTM
Collation=Cyrillic_General_CI_AS

LicenseType=DISABLED

Размер базы [ MAIN ]: 74.19 MB (свободно: 1.38 MB)
Размер базы [ MAINSPR ]: 9.56 MB (свободно: 1.02 MB)

План в картинке

К сообщению приложен файл. Размер - 0Kb
18 ноя 09, 16:59    [7946510]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
aleks2
Guest
Покрывающий индекс (LPU_ID, LPU_NAME)
на MAINSPR..SPR_LPU
спасет отца русской демократии...
18 ноя 09, 17:11    [7946592]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
iljy
Member

Откуда:
Сообщений: 8711
tas,

план надо выкладывать в виде xml или текста. На картинке много чего не видно. И не помешает выложить план быстрого запроса для сравнения. И еще - проверьте блокировки.
18 ноя 09, 17:14    [7946611]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
tas
Member

Откуда: Москва
Сообщений: 95
Покрывающий индекс (LPU_ID, LPU_NAME) увы не спас ...

Быстрый план:

К сообщению приложен файл (sql1.sqlplan - 39Kb) cкачать
18 ноя 09, 17:34    [7946755]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
tas
Member

Откуда: Москва
Сообщений: 95
Долгий план (уже 30 секунд :( )

Блокировок там никаких нет - я один сейчас на сервере!

К сообщению приложен файл (sql2.sqlplan - 72Kb) cкачать
18 ноя 09, 17:35    [7946763]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
iljy
Member

Откуда:
Сообщений: 8711
tas,

а вас не смутило, что в быстром плане обращения к таблице LPU ВООБЩЕ НЕТ? Его оптимизатор выкидывает, т.к. из нее ничего не используется, а она присоединяется по LEFT JOIN.
18 ноя 09, 19:08    [7947202]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
iljy
Member

Откуда:
Сообщений: 8711
tas,

попробуйте добавить хинт option(hash join), сдается мне сортировка у вас дурит.
18 ноя 09, 19:12    [7947208]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
tas
Member

Откуда: Москва
Сообщений: 95
На хинт option(hash join) пишет:

Msg 8622, Level 16, State 1, Line 1
Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN.

Похоже дело не в таблицах и запросах а в сервере - вот 2 по сути одинаковых запроса

	SELECT 
	 	SLU.*,
		ISNULL(LPU.LPU_NAME,'') AS LPU_NAME
    FROM RE_SLU AS SLU
	LEFT JOIN RE_SR AS SR
	ON
		SLU.SR_ID=SR.SR_ID
	LEFT JOIN MAINSPR..SPR_LPU AS LPU
	ON
		SLU.LPU_ID=LPU.LPU_ID
	WHERE
		SR.SR_ID IS NOT NULL

время выполнения =30 сек.

	SELECT 
	 	SLU.*,
		ISNULL(LPU.LPU_NAME,'') AS LPU_NAME
    FROM RE_SLU AS SLU
	INNER JOIN RE_SR AS SR
	ON
		SLU.SR_ID=SR.SR_ID
	LEFT JOIN MAINSPR..SPR_LPU AS LPU
	ON
		SLU.LPU_ID=LPU.LPU_ID
	LEFT JOIN MAINSPR..SPR_MKB AS MKB
	ON
		SLU.SLU_DS=MKB.DS_ID

время выполнения =1 сек.

Так было до тех пор, пока я не запустил сразу 2 запроса, чтобы сравнить их планы. И первый запрос тоже выполнился за 1 сек! Планы одинаковы. Теперь при запуске только первого запроса он выполняется за 1 сек. - такое чувство, что он посмотрел быстрый план и теперь его использует.

на если я добавляю в запрос условие

	SELECT 
	 	SLU.*,
		ISNULL(LPU.LPU_NAME,'') AS LPU_NAME
   	FROM RE_SLU AS SLU
	INNER JOIN RE_SR AS SR
	ON
		SLU.SR_ID=SR.SR_ID
	LEFT JOIN MAINSPR..SPR_LPU AS LPU
	ON
		SLU.LPU_ID=LPU.LPU_ID
	WHERE
		SR.SR_ID='E4E61C7C-EC4C-4321-8FB9-67FA780F4FB8'

то получаю опять 30 секунд на выполнении

К сообщению приложен файл (sql4.sqlplan - 62Kb) cкачать
19 ноя 09, 09:49    [7948650]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
tas
Member

Откуда: Москва
Сообщений: 95
По поводу того, что в быстром плане нет таблицы LPU - это потому, что запрос сильно обрезан. Оставлены эти 3 несчастных JOIN и одна ссылка на поле присоединенной таблицы. На самом деле в этом запросе и полей и JOIN намного больше. В первом посте я писал - что я пытался обрезать запрос так, чтобы вычленить тормоза. И все равно не пойму, что здесь не так???
19 ноя 09, 09:54    [7948688]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
aleks2
Guest
Не так здеся: Index Scan в количестве >1.

Научитесь выводить статистику IO запроса и поведайте ее нам.
Заодно освойте вывод плана в ТЕКСТОВОМ виде.

А еще лучше снимите трассу профайлером...
19 ноя 09, 10:04    [7948748]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
iljy
Member

Откуда:
Сообщений: 8711
aleks2
Не так здеся: Index Scan в количестве >1.

При 1 проходе и количестве записей 10т - не может давать такого эффекта.

А вот непропатченный сервер - запросто.
tas
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22

Поставьте SP1 и CU5.
19 ноя 09, 13:14    [7950368]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
tas
Member

Откуда: Москва
Сообщений: 95
БОЛЬШОЕ спасибо!

Очень надеюсь, что дело действительно в патче!
19 ноя 09, 14:31    [7951020]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
tas
Member

Откуда: Москва
Сообщений: 95
Подскажите плиз - где посмотреть, CU5 установлен на машине или нет?
19 ноя 09, 16:35    [7952190]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит простой запрос к очень маленькой базе из за 1 таблицы  [new]
iljy
Member

Откуда:
Сообщений: 8711
tas,

SELECT @@VERSION

Если 10.0.2746.0 - установлен.
19 ноя 09, 16:44    [7952292]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить