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

Откуда:
Сообщений: 33
Доброго времени суток, подскажите пожалуйста как ускорить SELECT ?
Есть большая таблица:
CREATE TABLE [...].[Recs](
	[Location] [geography] NOT NULL,
	[Time] [datetime] NOT NULL,
	[VehicleID] [int] NOT NULL,
	[Speed] [real] NOT NULL,
	[IsIgnition] [bit] NOT NULL,
	[IsIgnition2] [bit] NULL,
	[SatelliteCount] [int] NULL,
	[Temperature] [real] NULL,
	[IsMainPower] [bit] NULL,
	[DateModify] [datetime] NOT NULL CONSTRAINT [DF_Recs_DateModify]  DEFAULT (getdate()),
	[FuelCount2] [real] NULL,
	[Voltage] [smallint] NULL,
	[FuelCount] [real] NULL,
	[Geozones]  AS ([...].[Geozones_GetForPoint]([VehicleID],[Location])),
	[FuelLiters]  AS ([...].[FuelLiters_Get]([VehicleID],[FuelCount])),
	[flow_sensor] [float] NULL CONSTRAINT [DF_Recs_flow_sensor]  DEFAULT ((0)),
	[flow_sensor2] [float] NULL CONSTRAINT [DF_Recs_flow_sensor2]  DEFAULT ((0)),
	[z] [smallint] NOT NULL DEFAULT ((0)),
	[bearing] [smallint] NOT NULL DEFAULT ((0)),
 CONSTRAINT [PK_Recs] PRIMARY KEY CLUSTERED 
(
	[Time] ASC,
	[VehicleID] 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 [PRIMARY]

GO

ALTER TABLE [...].[Recs] SET (LOCK_ESCALATION = DISABLE)
GO

ALTER TABLE [...].[Recs]  WITH CHECK ADD  CONSTRAINT [FK_Recs_Vehicles] FOREIGN KEY([VehicleID])
REFERENCES [...].[Vehicles] ([VehicleID])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[Recs] CHECK CONSTRAINT [FK_Recs_Vehicles]
GO 


В ней больше 5 млн строк и обычный SELECT выполняется довольно долго, подскажите пожалуйста какое нибудь решение...
Если нужна доп.информация с скажите какая.

И еще посоветуйте хорошую литературу по performance ms sql.
Прошу прощение за такой вопрос но я человек новый в этом, но хочу вникнуть и разобраться !

Сообщение было отредактировано: 10 май 16, 19:56
10 май 16, 19:43    [19155152]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
o-o
Guest
"обычный селект" это все поля из всех 5млн строк?
10 май 16, 19:57    [19155201]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
ilya_hin
обычный SELECT выполняется довольно долго
Обычный сферический SELECT в вакууме оптимизируется шарообразными индексами.
10 май 16, 19:58    [19155204]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
ilya_hin
Member

Откуда:
Сообщений: 33
o-o,

Да просто делаю (SELECT * FROM Recs), и он выполняется около 13-15 минут
10 май 16, 20:09    [19155236]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
ilya_hin
Member

Откуда:
Сообщений: 33
Гавриленко Сергей Алексеевич, а что можно с этим сделать, нужно перестраивать таблицу ?Без полей с Computed text работает в разы быстрей...
10 май 16, 20:12    [19155245]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
ilya_hin
Гавриленко Сергей Алексеевич, а что можно с этим сделать, нужно перестраивать таблицу ?Без полей с Computed text работает в разы быстрей...
Подумать, зачем каждый раз выбирать SELECT * FROM Recs. И не выбирать SELECT * FROM Recs каждый раз.
10 май 16, 20:15    [19155263]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
ilya_hin
Member

Откуда:
Сообщений: 33
Гавриленко Сергей Алексеевич,
Понятно, а на счет литературы посоветуете, что нибудь ?
10 май 16, 20:23    [19155285]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
ilya_hin
Да просто делаю (SELECT * FROM Recs), и он выполняется около 13-15 минут
Без полей с Computed text работает в разы быстрей...
Попробуйте заменить функции в Computed-полях на выражения, если это возможно.
Если невозможно, заменяйте вычисляемые поля на обычные. (можно их поддерживать триггерами)
10 май 16, 20:37    [19155335]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
ilya_hin
Member

Откуда:
Сообщений: 33
alexeyvg,
Извините за просьбу но все таки... Можно ли пример какой нибудь, в частности, как поддерживать триггерами ? Просто вычисляемые поля считают в какой геолокации находится объект и количество топлива.
10 май 16, 20:49    [19155376]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
LoopN
Guest
ilya_hin
alexeyvg,
Извините за просьбу но все таки... Можно ли пример какой нибудь, в частности, как поддерживать триггерами ? Просто вычисляемые поля считают в какой геолокации находится объект и количество топлива.

У тебя каждый раз при выполнении select идет подсчет значений:
[Geozones]  AS ([...].[Geozones_GetForPoint]([VehicleID],[Location])),
[FuelLiters]  AS ([...].[FuelLiters_Get]([VehicleID],[FuelCount])),


Попробуй выполнить селект без этих двух столбцов и сравнить.

Если разница будет значительной, то можно материализовать вычисляемые столбцы (добавить PERSISTED).
10 май 16, 20:55    [19155397]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
ilya_hin
Можно ли пример какой нибудь, в частности, как поддерживать триггерами ? Просто вычисляемые поля считают в какой геолокации находится объект и количество топлива.
Можно и без триггеров - сделайте вычисляемые столбцы PERSISTED
10 май 16, 20:57    [19155404]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
LoopN
Guest
А вот еще, попробуй использовать сжатие страниц у таблицы. Может сильно помочь.
10 май 16, 21:07    [19155427]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
ilya_hin
Member

Откуда:
Сообщений: 33
LoopN,
Без этих двух столбцов SELECT выполняется значительно быстрей. Получается мне нужно удалить [Geozones] и [FuelLiters] или добавить PERSISTED атрибут в них ? Извините за глупый вопрос )
10 май 16, 21:10    [19155439]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
ilya_hin
Member

Откуда:
Сообщений: 33
LoopN,
я пробовал
ALTER DATABASE ... SET ALLOW_SNAPSHOT_ISOLATION ON
GO

ALTER DATABASE ... SET READ_COMMITTED_SNAPSHOT ON
GO

это было уместно ?
10 май 16, 21:13    [19155452]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
iljy
Member

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

скалярные функции в TSQL в принципе работают медленно. Так что вычислять их каждый раз при выборке данных - так себе идея.

А очень интересует вот такой вот вопрос: за каким хреном вообще понадобилось выбирать из таблицы 5млн записей, да еще и на регулярной основе?
10 май 16, 21:13    [19155455]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
Rankatan
Member

Откуда:
Сообщений: 250
ilya_hin
LoopN,
Без этих двух столбцов SELECT выполняется значительно быстрей. Получается мне нужно удалить [Geozones] и [FuelLiters] или добавить PERSISTED атрибут в них ? Извините за глупый вопрос )

ничего удалять не нужно.
ALTER TABLE Recs ALTER COLUMN flow_sensor ADD PERSISTED;
ALTER TABLE Recs ALTER COLUMN flow_sensor2 ADD PERSISTED;


+ сжатие
ALTER TABLE Recs REBUILD WITH (DATA_COMPRESSION = PAGE);
10 май 16, 21:15    [19155460]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
ilya_hin
Member

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

Для формирования отчета, о пути следования транспорта ) просто нужно разобраться, чтобы SELECT * FROM Recs не использовать каждый раз )
10 май 16, 21:16    [19155461]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
ilya_hin
Member

Откуда:
Сообщений: 33
Rankatan,
Спасибо, попробую...
И еще можете подсказать литературу по perfomance ms sql ) кроме гугла )
10 май 16, 21:18    [19155470]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
LoopN
Guest
ilya_hin
LoopN,
я пробовал
ALTER DATABASE ... SET ALLOW_SNAPSHOT_ISOLATION ON
GO

ALTER DATABASE ... SET READ_COMMITTED_SNAPSHOT ON
GO

это было уместно ?

И да и нет. Думаю что нет. В вашем случае проще вернуть обратно на OFF, но запускать селект с хинтом WITH(NOLOCK): select * from table WITH(NOLOCK)

Таблица каждый раз обновляется или хранит старые данные? Отчет строится с группировкой? Если группировка, то по каким столбцам?
10 май 16, 21:23    [19155484]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
ilya_hin
Member

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

Она постоянно пополняется, а потом раз в месяц чистятся данные, чтобы оставались 3 последние месяца.
Группировок там нет (GRUP BY если их имеете ввиду) есть только условие
WHERE
VehicleID = @VehicleID
AND [Time] BETWEEN @MinDate AND @MaxDate
10 май 16, 21:37    [19155524]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
LoopN
Guest
ilya_hin
LoopN,

Она постоянно пополняется, а потом раз в месяц чистятся данные, чтобы оставались 3 последние месяца.
Группировок там нет (GRUP BY если их имеете ввиду) есть только условие
WHERE
VehicleID = @VehicleID
AND [Time] BETWEEN @MinDate AND @MaxDate

CONSTRAINT [PK_Recs] PRIMARY KEY CLUSTERED
(
[Time] ASC,
[VehicleID] ASC
)

Порядок Time, VehicleID неправильный, нужно менять на: VehicleID, Time. Тогда будет быстрее работать.
10 май 16, 21:40    [19155538]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
ilya_hin
Member

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

При создании таблицы ? Просто изменить порядок ключей? А почему он неправильный ?
10 май 16, 21:47    [19155564]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
ilya_hin
Member

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

ALTER TABLE Recs ALTER COLUMN Geozones ADD PERSISTED;
ALTER TABLE Recs ALTER COLUMN FuelLiters ADD PERSISTED;

Msg 4936, Level 16, State 1, Line 3
Невозможно материализовать вычисляемый столбец "Geozones" в таблице "Recs", так как он является недетерминированным.



ALTER TABLE Recs ALTER COLUMN flow_sensor ADD PERSISTED;
ALTER TABLE Recs ALTER COLUMN flow_sensor2 ADD PERSISTED;

Msg 4919, Level 16, State 0, Line 8
Невозможно изменить атрибут PERSISTED в столбце "flow_sensor", так как этот столбец не является вычисляемым.
10 май 16, 21:52    [19155578]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
LoopN
Guest
ilya_hin
LoopN,

При создании таблицы ? Просто изменить порядок ключей? А почему он неправильный ?

Можно удалить кластерный индекс и создать новый. Почему неправильный я объяснить не смогу, если кратко то связано с хранением подуровней индекса.

Перестроение индексов выполняются? Если нет то нужно настроить выполнение. Можно раз в день.
10 май 16, 21:54    [19155583]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить SELECT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
LoopN
ilya_hin
LoopN,

При создании таблицы ? Просто изменить порядок ключей? А почему он неправильный ?

Можно удалить кластерный индекс и создать новый. Почему неправильный я объяснить не смогу, если кратко то связано с хранением подуровней индекса.
Может еще винду перествить? Если объянить не можете, то не несите чушь.

LoopN
Перестроение индексов выполняются? Если нет то нужно настроить выполнение. Можно раз в день.
Почему раз в день, и почему вообще это необходимо, тоже объяснить не можете?

Сообщение было отредактировано: 10 май 16, 21:57
10 май 16, 21:57    [19155591]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить