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

Откуда: Moscow
Сообщений: 610
Сам запрос:


Select 
	doc.IDDocument,
	'6001' as smallname
	
From
	mBLDocuments doc(nolock index = IX_mDoc_DateReal)
	inner join mBLPayIO pio(nolock index = XPKmBLPayIO) on pio.IDPayIO = doc.IDFinOper 
		
		and Isnull(pio.IDDogovorDeb, 0) <> 0
		
		and pio.FinOperTypeDeb = 2	
		and pio.PayIOTypeDeb = 1
	inner join mBLTreeAccount t2(nolock index = XPKmBLTreeAccount) on t2.IDAccount = doc.IDAccountCre and left(t2.Account, 5) = '20202'
Where
	doc.DateReal = '2012.03.22'
	and doc.IDBank = 1000
	and doc.IDBranch = isnull(31046, doc.IDBranch) 
	and doc.IDBalance = 1
	
	and exists 
		(select 1 from mBLPayIO p2(nolock index = IX_mPIO_DogovorModuleCre)						
		where p2.IDDogovorCre = pio.IDDogovorDeb
			and p2.IDModuleCre = pio.IDModuleDeb
			and p2.IDAccountCre= pio.IDAccountDeb
			and p2.OperDate <= doc.DateReal
			and p2.OperDate >= doc.DateReal - 2
			and p2.FinOperTypeCre = 1
			and p2.PayIOTypeCre = 2) 



План выполнения запроса:

+
+

StmtText
  
       |--Nested Loops(Left Semi Join, OUTER REFERENCES:([doc].[DateReal], [pio].[IDModuleDeb], [pio].[IDDogovorDeb], [pio].[IDAccountDeb], [Expr1011]) OPTIMIZED)
            |--Nested Loops(Inner Join, OUTER REFERENCES:([doc].[IDFinOper]) OPTIMIZED)
            |    |--Nested Loops(Inner Join, OUTER REFERENCES:([doc].[IDAccountCre], [Expr1016]) OPTIMIZED WITH UNORDERED PREFETCH)
            |    |    |--Compute Scalar(DEFINE:([Expr1011]=[FM].[dbo].[mBLDocuments].[DateReal] as [doc].[DateReal]-'1900-01-03 00:00:00.000'))
            |    |    |    |--Filter(WHERE:([FM].[dbo].[mBLDocuments].[IDBranch] as [doc].[IDBranch]=CONVERT_IMPLICIT(numeric(16,0),isnull((31046),CONVERT_IMPLICIT(int,[FM].[dbo].[mBLDocuments].[IDBranch] as [doc].[IDBranch],0)),0) AND [FM].[dbo].[mBLDocuments].[IDBank] as [doc].[IDBank]=(1000.)))
            |    |    |         |--Nested Loops(Inner Join, OUTER REFERENCES:([doc].[IDDocument], [Expr1015]) OPTIMIZED WITH UNORDERED PREFETCH)
            |    |    |              |--Index Seek(OBJECT:([FM].[dbo].[mBLDocuments].[IX_mDoc_DateReal] AS [doc]), SEEK:([doc].[DateReal]='2012-03-22 00:00:00.000' AND [doc].[IDBalance]=(1.)) ORDERED FORWARD)
            |    |    |              |--Clustered Index Seek(OBJECT:([FM].[dbo].[mBLDocuments].[XPKmBLDocuments] AS [doc]), SEEK:([doc].[IDDocument]=[FM].[dbo].[mBLDocuments].[IDDocument] as [doc].[IDDocument]) LOOKUP ORDERED FORWARD)
            |    |    |--Clustered Index Seek(OBJECT:([FM].[dbo].[mBLTreeAccount].[XPKmBLTreeAccount] AS [t2]), SEEK:([t2].[IDAccount]=[FM].[dbo].[mBLDocuments].[IDAccountCre] as [doc].[IDAccountCre]),  WHERE:(substring([FM].[dbo].[mBLTreeAccount].[Account] as [t2].[Account],(1),(5))='20202') ORDERED FORWARD)
            |    |--Clustered Index Seek(OBJECT:([FM].[dbo].[mBLPayIO].[XPKmBLPayIO] AS [pio]), SEEK:([pio].[IDPayIO]=[FM].[dbo].[mBLDocuments].[IDFinOper] as [doc].[IDFinOper]),  WHERE:([FM].[dbo].[mBLPayIO].[FinOperTypeDeb] as [pio].[FinOperTypeDeb]=(2) AND [FM].[dbo].[mBLPayIO].[PayIOTypeDeb] as [pio].[PayIOTypeDeb]=(1) AND isnull([FM].[dbo].[mBLPayIO].[IDDogovorDeb] as [pio].[IDDogovorDeb],(0.))<>(0.)) ORDERED FORWARD)
            |--Filter(WHERE:([FM].[dbo].[mBLPayIO].[OperDate] as [p2].[OperDate]<=[FM].[dbo].[mBLDocuments].[DateReal] as [doc].[DateReal] AND [FM].[dbo].[mBLPayIO].[OperDate] as [p2].[OperDate]>=[Expr1011] AND [FM].[dbo].[mBLPayIO].[FinOperTypeCre] as [p2].[FinOperTypeCre]=(1) AND [FM].[dbo].[mBLPayIO].[PayIOTypeCre] as [p2].[PayIOTypeCre]=(2)))
                 |--Nested Loops(Inner Join, OUTER REFERENCES:([p2].[IDPayIO]) OPTIMIZED)
                      |--Index Seek(OBJECT:([FM].[dbo].[mBLPayIO].[IX_mPIO_DogovorModuleCre] AS [p2]), SEEK:([p2].[IDDogovorCre]=[FM].[dbo].[mBLPayIO].[IDDogovorDeb] as [pio].[IDDogovorDeb] AND [p2].[IDModuleCre]=[FM].[dbo].[mBLPayIO].[IDModuleDeb] as [pio].[IDModuleDeb] AND [p2].[IDAccountCre]=[FM].[dbo].[mBLPayIO].[IDAccountDeb] as [pio].[IDAccountDeb]) ORDERED FORWARD)
                      |--Clustered Index Seek(OBJECT:([FM].[dbo].[mBLPayIO].[XPKmBLPayIO] AS [p2]), SEEK:([p2].[IDPayIO]=[FM].[dbo].[mBLPayIO].[IDPayIO] as [p2].[IDPayIO]) LOOKUP ORDERED FORWARD)




Или же графический план выполнения я прикрепил. Вопрос собственно какие индексы надо использовать в джоинах:

например XPKmBLPayIO - кластерный индекс таблицы mBLPayIO, построенный по IDPayIO. Но есть же еще отбор по полям

(pio.IDDogovorDeb, 0) <> 0
pio.FinOperTypeDeb = 2
pio.PayIOTypeDeb = 1

т.е. может имеет смысл создать не кластерный индекс по полю IDPayIO + include поля по IDDogovorDeb, FinOperTypeDeb, PayIOTypeDeb

В подзапросе в условии Where используется индекс IX_mPIO_DogovorModuleCre это составной не кластерный индекс по полям
IDDogovorCre
IDModuleCre
IDAccountCre

но ведется так же отбор и по
OperDate
OperDate
FinOperTypeCre
PayIOTypeCre
имеет ли смысл добавлять эти поля в составной индекс, или может сделать один не кластерный индекс со всеми полями таблицы mBLPayIO, которые используются в отборе, включенными в include?

Сообщение было отредактировано: 26 мар 12, 15:26
26 мар 12, 15:25    [12314821]     Ответить | Цитировать Сообщить модератору
 Re: использование индексов в запросе  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610


К сообщению приложен файл (1.sqlplan - 47Kb) cкачать
26 мар 12, 15:25    [12314829]     Ответить | Цитировать Сообщить модератору
 Re: использование индексов в запросе  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
Таблицы используемые в запросе содержат 5-8 млн записей.
26 мар 12, 15:26    [12314838]     Ответить | Цитировать Сообщить модератору
 Re: использование индексов в запросе  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
andrew shalaev,Версия сервера?
На предупреждение о пропущенных индексах в плане запроса внимания не обращаем?
26 мар 12, 15:33    [12314890]     Ответить | Цитировать Сообщить модератору
 Re: использование индексов в запросе  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
denis2710,

select @@version


Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

Предупреждение о недостающем индексе я видел, но оно не по той таблице по которой я задаю вопрос. Я вижу, что самый дорого элемент это Key lookup, который пропадет при создании, предлагаемого сервером индекса. Но по другим таблицам тоже можно изменить существующие индексы и они тоже достаточно большие.
26 мар 12, 15:40    [12314957]     Ответить | Цитировать Сообщить модератору
 Re: использование индексов в запросе  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
может немного почитать BOL ?
26 мар 12, 16:09    [12315286]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить