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

Откуда: Москва
Сообщений: 366
Всем добрый день! Вопрос такой. Есть таблица вида
CREATE TABLE [РН] (
	[РН_У] [int] IDENTITY (1, 1) NOT NULL ,
	[Дата] [datetime] NULL ,
	...
	CONSTRAINT [PK_РН] PRIMARY KEY  CLUSTERED 
	(
		[РН_У]
	) WITH  FILLFACTOR = 90  ON [PRIMARY] 
) ON [PRIMARY]
с индексом по дате:
CREATE  INDEX [IX_РН_2] ON [dbo].[РН]([Дата]) WITH  FILLFACTOR = 90 ON [PRIMARY]


Непонятно следующее. Почему при запросе
select * from рн where РН.Дата Between '11/01/05' and '11/30/05'
Строится план исполнения с использованием индекса по дате, а для того же самого запроса, только с датами, заданными через переменные
DECLARE @DateBegin datetime, @DateEnd datetime
SELECT @DateBegin = '11/01/05', @DateEnd = '11/30/05'
select * from рн where РН.Дата Between @DateBegin and @DateEnd
- сканирование primary key.
Планы соответственно:
|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([bagrat].[dbo].[РН]) WITH PREFETCH)
|--Index Seek(OBJECT:([bagrat].[dbo].[РН].[IX_РН_2]), SEEK:([РН].[Дата] >= Convert([@1]) AND [РН].[Дата] <= Convert([@2])) ORDERED FORWARD)

|--Clustered Index Scan(OBJECT:([bagrat].[dbo].[РН].[PK_РН]), WHERE:([РН].[Дата]>=[@DateBegin] AND [РН].[Дата]<=[@DateEnd]))

Спасибо!!
7 ноя 05, 13:12    [2042045]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по дате  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
Вотжешь как... немогу найти статью, там вроде как какраз ваш случай для примера привадился...
7 ноя 05, 13:23    [2042112]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по дате  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
http://www.osp.ru/win2000/sql/dialogs/311_1_print.htm
7 ноя 05, 13:26    [2042137]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по дате  [new]
Брюлик
Member

Откуда:
Сообщений: 690
Это потому что SQL Server не знает значени пременнух и поэтому может создать не "эффективныи" план

Попробуи так

DECLARE @DateBegin datetime, @DateEnd datetime
SELECT @DateBegin = '11/01/05', @DateEnd = '11/30/05'
select * from рн where РН.Дата >= @DateBegin and РН.Дата <dateadd(day,1,@DateEnd)
7 ноя 05, 13:35    [2042184]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить