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

Откуда:
Сообщений: 442
Есть таблица А. В ней есть идентификатор K(и первичный ключ) и BLOB столбец B
Запрос типа:

select K from A
where K = 5 AND DATALENGTH(B) > 15 

увисает хотя

select K from A
where K = 5 

выполняется мгновенно

sql server 2008
5 окт 11, 16:39    [11389758]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор запроса выбирает неправильный индекс  [new]
BERSERC
Member

Откуда:
Сообщений: 442
причем на столбце B вообще никаких индексов нет
5 окт 11, 16:41    [11389770]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор запроса выбирает неправильный индекс  [new]
Glory
Member

Откуда:
Сообщений: 104751
А DATALENGTH(B) оптимизатор откуда должен будет взять ?
5 окт 11, 16:41    [11389773]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор запроса выбирает неправильный индекс  [new]
BERSERC
Member

Откуда:
Сообщений: 442
Glory
А DATALENGTH(B) оптимизатор откуда должен будет взять ?


А зачем он его вообще вычисляет для всех строк, ведь по первичному ключу подходит только одна??
И как поправить with(index=PK_A) не помогает
5 окт 11, 16:44    [11389820]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор запроса выбирает неправильный индекс  [new]
Glory
Member

Откуда:
Сообщений: 104751
Опять сферический конь ?
Скрипт таблицы. Статистику по фрагментации. План выполнения. Версию сервера. Настройки коннекта.
5 окт 11, 16:46    [11389845]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор запроса выбирает неправильный индекс  [new]
BERSERC
Member

Откуда:
Сообщений: 442
Glory
Опять сферический конь ?
Скрипт таблицы. Статистику по фрагментации. План выполнения. Версию сервера. Настройки коннекта.



CREATE TABLE [dbo].[T_TASK_FILES](
	[FILE_ID] [int] IDENTITY(1,1) NOT NULL,
	[TASK_ID] [int] NOT NULL,
	[FILE_NAME] [varchar](500) NOT NULL,
	[FILE_BLOB] [varbinary](max) NOT NULL,
	[FILE_ICON] [varbinary](max) NULL,
	[USER_ID] [int] NOT NULL,
	[FILE_DATE] [datetime] NOT NULL,
	[DOC_TYPE_ID] [int] NULL,
	[DOC_ID] [int] NULL,
	[DOC_NUMBER] [int] NULL,
 CONSTRAINT [PK_T_FILES] PRIMARY KEY CLUSTERED 
(
	[FILE_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]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[T_TASK_FILES]  WITH CHECK ADD  CONSTRAINT [FK_T_TASK_FILES_T_TASKS] FOREIGN KEY([TASK_ID])
REFERENCES [dbo].[T_TASKS] ([TASK_ID])
GO

ALTER TABLE [dbo].[T_TASK_FILES] CHECK CONSTRAINT [FK_T_TASK_FILES_T_TASKS]
GO

ALTER TABLE [dbo].[T_TASK_FILES]  WITH CHECK ADD  CONSTRAINT [FK_T_TASK_FILES_T_USERS] FOREIGN KEY([USER_ID])
REFERENCES [dbo].[T_USERS] ([USER_ID])
GO

ALTER TABLE [dbo].[T_TASK_FILES] CHECK CONSTRAINT [FK_T_TASK_FILES_T_USERS]
GO

ALTER TABLE [dbo].[T_TASK_FILES] ADD  CONSTRAINT [DF_T_TASKS_FILES_FILE_DATE]  DEFAULT (getdate()) FOR [FILE_DATE]

Такой запрос увисает навечно
SELECT 1
FROM [support_system3].[dbo].[T_TASK_FILES]
 where FILE_ID = 1 and LEN(FILE_BLOB) = 54

такой отрабатывает мгновенно
SELECT case when LEN(FILE_BLOB) = 54 then 1 end
FROM [support_system3].[dbo].[T_TASK_FILES]
 where FILE_ID = 1 
5 окт 11, 16:53    [11389941]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор запроса выбирает неправильный индекс  [new]
BERSERC
Member

Откуда:
Сообщений: 442
Microsoft SQL Server 2008 (SP2) - 10.0.4064.0 (X64) Feb 25 2011 13:56:11 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2) (VM)

при попытке выполнить Display Estimated Execution Plan увисает.

Не затруднит ли сказать где и как посмотреть " Статистику по фрагментации"
5 окт 11, 16:59    [11389994]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор запроса выбирает неправильный индекс  [new]
Glory
Member

Откуда:
Сообщений: 104751
BERSERC
при попытке выполнить Display Estimated Execution Plan увисает.

Что то у вас по-моему с таблицей или базой или сервером
Предварительный план не должен себя так вести
5 окт 11, 17:02    [11390027]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор запроса выбирает неправильный индекс  [new]
BERSERC
Member

Откуда:
Сообщений: 442
выполнил update statistics T_TASK_FILE with fullscan
и все стало как и должно быть)

Есть у кого предположения почему получилась такая ситуация хотя в плане обслудивания сервера есть пересчет статистики. Может что-то не так настроена в плане обслуживания?
5 окт 11, 17:14    [11390162]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор запроса выбирает неправильный индекс  [new]
Glory
Member

Откуда:
Сообщений: 104751
BERSERC
хотя в плане обслудивания сервера есть пересчет статистики

И что и как там указано обновлять ?

BERSERC
Есть у кого предположения почему получилась такая ситуация

так надо было проверять DBCC SHOW_STATISTICS до обновления статистики
5 окт 11, 17:34    [11390311]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор запроса выбирает неправильный индекс  [new]
BERSERC
Member

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

Оказалось все достаточно просто, почему-то в плане обслуживания слетело расписание и план не выполнялся. И статистика не пересчитывалась.

Спасибо за подсказки!
5 окт 11, 17:43    [11390377]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить