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

Откуда:
Сообщений: 800
Есть табличка:
CREATE TABLE [DS_IMAGES](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[DOC_UID] [uniqueidentifier] NOT NULL,
	[DOCIMAGE] [image] NULL,
	[ORDR] [smallint] NULL,
	[PRUZ] [tinyint] NOT NULL CONSTRAINT [DF_DS_IMAGES_PRUZ]  DEFAULT ((0)),
 CONSTRAINT [PK_DS_IMAGES] PRIMARY KEY CLUSTERED 
(
	[ID] 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 [IMG]
GO
CREATE NONCLUSTERED INDEX [IX_DS_IMAGES] ON [DS_IMAGES] 
(
	[DOC_UID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [IDX]
Запрос
SELECT [ID], ORDR, PRUZ FROM DS_IMAGES WHERE DOC_UID = '327e6c7d-7bdc-4c2b-bfe2-613656ee0b5e'
выполняется 0.08 секунд
SELECT [ID], ORDR, PRUZ FROM DS_IMAGES WHERE DOC_UID = '327e6c7d-7bdc-4c2b-bfe2-613656ee0b5e' and DOCIMAGE IS NOT NULL
выполняется 4 мин 20 секунд
в обеих случаях возвращается одна запись
План запроса второго оператора:
  |--Filter(WHERE:([ESED2_Smoln].[dbo].[DS_IMAGES].[DOCIMAGE] IS NOT NULL))
|--Nested Loops(Inner Join, OUTER REFERENCES:([PtnIds1006], [Uniq1002], [ESED2_Smoln].[dbo].[DS_IMAGES].[ENTERDATE]) PARTITION ID:([PtnIds1006]))
|--Compute Scalar(DEFINE:([PtnIds1006]=RangePartitionNew([ESED2_Smoln].[dbo].[DS_IMAGES].[ENTERDATE],(0),'2001-01-01 00:00:00.000'.......
| |--Nested Loops(Inner Join, OUTER REFERENCES:([PtnIds1007]) PARTITION ID:([PtnIds1007]))
| |--Constant Scan(VALUES1)),((2)),((3)),((4)),((5)),((6)),((7)),((8)),((9)),((10)),((11))))
| |--Index Seek(OBJECT:([ESED2_Smoln].[dbo].[DS_IMAGES].[IX_DS_IMAGES_DOC_UID]), SEEK:([ESED2_Smoln].[dbo].[DS_IMAGES].[DOC_UID]={guid'327E6C7D-7BDC-4C2B-BFE2-613656EE0B5E'}) ORDERED FORWARD PARTITION ID:([PtnIds1007]))
|--Clustered Index Seek(OBJECT:([ESED2_Smoln].[dbo].[DS_IMAGES].[IX_DS_IMAGES_ENTERDATE]), SEEK:([ESED2_Smoln].[dbo].[DS_IMAGES].[ENTERDATE]=[ESED2_Smoln].[dbo].[DS_IMAGES].[ENTERDATE] AND [Uniq1002]=[Uniq1002]) LOOKUP ORDERED FORWARD PARTITION ID:([PtnIds1006]))
Почему такая разница? Если я правильно понимаю план запроса, то сначала делается SSEK по индексу, а потом накладывается фильтр на найденые записи. Это он 4 минуты накладывает фильтр на 1 запись?

PS. SQL 2005 SP2 x64
16 окт 09, 17:56    [7798710]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36824
Добавить вычисляемое поле
is_docimage_empty  as case when DOCIMAGE is null then cast(1 as bit) else cast(0 as bit) end
и запихать его в индекс IX_DS_IMAGES. Так же в него можно инклудом включить ORDR и PRUZ, если мы говорим о данном конкретном запросе.

Сообщение было отредактировано: 16 окт 09, 18:12
16 окт 09, 18:11    [7798764]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса  [new]
Slider_spb
Member

Откуда:
Сообщений: 800
Ну как бороться я где-то так и предпологал, но почему такое странное поведение при проверке Image полей на NULL? Ведь для того, чтобы проверить пустое оно или нет, ведь не считывается всё поле, тем более что его считывание явно не 4 мин.?
16 окт 09, 18:17    [7798797]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить