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

Откуда:
Сообщений: 22
 
USE ADDAXDB_APPSERVER
go
SELECT sl.DeviceId,sl.LogicalName,sl.[date],sl.[times]
FROM
(SELECT  DeviceId,LogicalName,Value,Unit,Scaler,NormValue,Convert(varchar(8),ReceivedTime,112) AS date,
Convert(varchar(8),ReceivedTime,108) AS Times
FROM Rw_receivedData
WHERE classId=4 AND Unit=30 AND logicalname BETWEEN 0x01000F0800FF AND 0x01000F0803FF ) sl
WHERE sl.[times] BETWEEN '00:00:00' AND '24:60:60' AND sl.date=20111115
 

Есть база данных, в которую записываются данные, показания счетчиков. В данном Select'e вывести все столбцы из Rw_receivedData, где есть столбец ReceivedTime в который записываются показания счетчиков, где дата и время снятия показания. нужно отфильтровать по дате,т.е. по определенной дате вывести показания и от туда взять самое первое снятое показание за введеную дату. Вроде задача простая, пробовал отделять дату и искать по ней и с помощью Datepart и datename итог один, либо запрос длится до бесконечности, ждал больше часа, так и не вывел ничего и продолжал выполнятся, либо выводит пустые столбцы. Подумал что отсекает время, так как по некоторым старым датам например за 2008 год и некоторые дни он выводит, но опять же не все значения. а за нынешний год не хочет вообще(ситуация выше), разделил в этом запросе дату и время, указал диапозон времени, но без успеха, выполняется очень долго запрос. Если убрать дату, то выборку полную делает нормально. Посмотрел предлагаемый план выполнения,пишет что: Индекс отсутствует Create nonclustered index (<name of Missing Index, sysname> include DeviceId,ReceivedTime. ) Хотя индексы есть, 4 штуки , в таблице, причем на нужных полях. Пытался реорганизацию индексов делать, так SQL Server виснет. В что может быть, я так понимаю индекс как то отключен, как это можно проверить и его включить , или еще что? Хм.... Пробовал создать индекс как предлагает SQL server, не получилось, долгое время выполняется запрос(час) после чего прервал операцию создания индекса((
19 дек 11, 13:34    [11788514]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом...  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
VDionisV,

приведите скрипт создания таблицы, хотя бы. Что бы знать какого типа поля.
19 дек 11, 13:44    [11788642]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Какое еще такое использование индексов при фильтрации по вычисляемым тут же полям?

З.Ы. А вот это вообще какая-то песня: '24:60:60'.
19 дек 11, 13:48    [11788673]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Напишите и уберите все ваши конверты.
... and ReceivedTime >= '20111115' and ReceivedTime < '20111116'
19 дек 11, 13:49    [11788680]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом...  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
"нужно отфильтровать по дате,т.е. по определенной дате вывести показания и от туда взять самое первое снятое показание за введеную дату"

Не понятно что нужно. И более не понятно, что вы делаете.
Получить первую/последниюю запись за определенный период для каждого счетчика. Такая задача?

Просто записей в этот период может не оказаться. Может вам надо последниюю запись на определенную дату?
Например показатели на 1ое сентября(и туда попадут последниие считанные данные до сентября).
19 дек 11, 13:57    [11788764]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом...  [new]
VDionisV
Member

Откуда:
Сообщений: 22
CREATE TABLE [dbo].[RW_ReceivedData](
	[Ident] [int] IDENTITY(1,1) NOT NULL,
	[DeviceId] [int] NOT NULL,
	[ClassId] [smallint] NOT NULL,
	[LogicalName] [binary](6) NOT NULL,
	[AttId] [tinyint] NOT NULL,
	[Time] [datetime] NOT NULL,
	[ReceivedTime] [datetime] NOT NULL,
	[Value] [bigint] NULL,
	[Event] [tinyint] NULL,
	[Unit] [tinyint] NOT NULL,
	[Scaler] [tinyint] NOT NULL,
	[NormValue] [numeric](38, 19) NULL,
 CONSTRAINT [PK_RW_ReceivedData] PRIMARY KEY NONCLUSTERED 
(
	[Ident] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


Сообщение было отредактировано: 19 дек 11, 14:30
19 дек 11, 14:28    [11789100]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом...  [new]
VDionisV
Member

Откуда:
Сообщений: 22
SELECT  [Ident]
      ,[DeviceId]
      ,[ClassId]
      ,[LogicalName]
      ,[AttId]
      ,[Time]
      ,[ReceivedTime]
      ,[Value]
      ,[Event]
      ,[Unit]
      ,[Scaler]
      ,[NormValue]
  FROM [ADDAXDB_APPSERVER].[dbo].[RW_ReceivedData]
  where receivedTime>='20111021' and 
  receivedTime<'20111021' and 
  logicalName between 0x01000F0800FF and 0x01000F0803FF
  and unit=30 and 
  classid=4


Задача состоит в том, чтобы вывести первые показания счетчиков за определенную дату. Я сначала хотел отделить дату от времени, затем отфильтровать по дате, и далее как нить выбрать первые показания счетчиков за дату. Сейчас еще раз попробовал ввел дату 20111021, под критерии поиска попадает, записи есть такие, но ничего не выводит.
19 дек 11, 14:43    [11789282]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом...  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
VDionisV
where receivedTime>='20111021'
  and receivedTime< '20111021'

Меня терзают смутные сомнения, что здесь всегда будет пустое множество...
19 дек 11, 14:47    [11789333]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
VDionisV
where receivedTime>='20111021' and
receivedTime<'20111021' and
- это взаимоисключающие условия, вообще-то. Неудивительно, что не выводит ничего.
19 дек 11, 14:47    [11789337]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом...  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
select top (1) with ties
       [Ident]
      ,[DeviceId]
      ,[ClassId]
      ,[LogicalName]
      ,[AttId]
      ,[Time]
      ,[ReceivedTime]
      ,[Value]
      ,[Event]
      ,[Unit]
      ,[Scaler]
      ,[NormValue]
  FROM [ADDAXDB_APPSERVER].[dbo].[RW_ReceivedData]
  where receivedTime>='20111021' and 
  receivedTime<'20111021' and 
  logicalName between 0x01000F0800FF and 0x01000F0803FF
  and unit=30 and 
  classid=4
order by
 row_number() over (partition by cast(receivedTime as date), order by receivedTime);
 
19 дек 11, 14:48    [11789349]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом...  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
VDionisV,

Если данные у вас льются в таблицу монотонно и [ReceivedTime] в момент вставки = getdate(), или откуда нить еще текущюю дату берет, и в дальнейшем это значение не меняется. Рекомендую построить по этому полу кластерный индекс, это даст гарантию того, что данные будут постоянно добавлятся в конец таблицы (минимальная дифрагментация данных). В запросах на выборку данные будут читаться несколькими блоками (экстентами) с диска.
По поводу интексов. Если ReceivedTime будет кластерный индекс, то можно сделать по classId, Unit и logicalname один индекс. Единственное, посмотрите какое поле более селективно - его желательно использовать первым.
И вот ваш запрос (вроде ничего не упустил)
SELECT  DeviceId,LogicalName,
	 Convert(varchar(8),ReceivedTime,112) AS date,
	 Convert(varchar(8),ReceivedTime,108) AS Times
FROM Rw_receivedData
WHERE 
ReceivedTime >= '20111115' and ReceivedTime < '20111116' and
classId=4 AND Unit=30 AND logicalname BETWEEN 0x01000F0800FF AND 0x01000F0803FF


+ Если по ReceivedTime будет кластерный индекс, то операции вставки, обновления и удаления с опцией paglock не будут блокировать операции селекта, но при условии не пересечения периодов.
19 дек 11, 14:50    [11789363]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом...  [new]
VDionisV
Member

Откуда:
Сообщений: 22
прошу прощения за
here receivedTime>='20111021'
and receivedTime< '20111021'
19 дек 11, 14:57    [11789453]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом...  [new]
VDionisV
Member

Откуда:
Сообщений: 22
Всем огромное спасибо за помощь!!!
19 дек 11, 15:02    [11789501]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить