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

Откуда:
Сообщений: 18
Имеется таблица archive ([id] bigint, [tagid] int, [now] datetime, [value] real), [id] - primary key, [now]+[tagid],[now] исторически установленные некластеризованные индексы, содержит 234794111 записей.
Запрос select * from archive where [now] between @dt1 and @dt2 отрабатывает больше 7 минут возвращает около 5 млн. строк. Есть какие-то функции ускоряющие выборку?
21 июн 19, 09:38    [21912657]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
Sergey Syrovatchenko
Member

Откуда:
Сообщений: 126
Либо создавайте индекс покрывающий по полю по которому фильтруете. Либо если не принципиально модифицируйте свой кластерный индекс и туда на первое место ставьте стоблец по котороуми опять-же фильтруете. Либо если редакция позволяет загоняйте данные в кластерный колумнстор.
21 июн 19, 09:42    [21912661]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
nika1058
Member

Откуда:
Сообщений: 18
Таблица не моя, изменения вносить нельзя.
21 июн 19, 09:58    [21912675]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
nika1058,

Типа, функции "а ну ка работать быстро, и чтобы делать ничего не надо было"?

Сообщение было отредактировано: 21 июн 19, 10:01
21 июн 19, 10:01    [21912683]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
PsyMisha
Member

Откуда: другая столица
Сообщений: 744
nika1058,

Так начните с того, что проанализируйте/приложите план выполнения запроса, что физически реально под капотом происходит - понять.
Без этого всего - ниачом, гадание на кофейной гуще

P.S. - использовать * в конструкции SELECT - моветон, признак дурного вкуса
21 июн 19, 10:10    [21912695]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
L_argo
Member

Откуда:
Сообщений: 1139
nika1058
Таблица не моя, изменения вносить нельзя.
Даже простой индекс ?
Ну нельзя так нельзя. Пусть все работает, как сейчас. Чо 7 минут жалко, что ли ?
21 июн 19, 10:11    [21912698]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30813
nika1058
Таблица не моя, изменения вносить нельзя.
Тогда совет какого рода вы хотите услышать?

Вообще, запросы на какие то работы с БД обычно адресуют тем, чьи таблицы/базы/сервер.
"Чужим" что то делать, не имея полномочий, затруднительно.
21 июн 19, 10:14    [21912705]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
uaggster
Member

Откуда:
Сообщений: 769
Sergey Syrovatchenko
Либо создавайте индекс покрывающий по полю по которому фильтруете. Либо если не принципиально модифицируйте свой кластерный индекс и туда на первое место ставьте стоблец по котороуми опять-же фильтруете. Либо если редакция позволяет загоняйте данные в кластерный колумнстор.

А как кластерный колумнстор поможет при такой фильтрации?
Без подвоха вопрос.
Колумнстор, как я понимаю, всегда сканируется целиком, вне зависимости от фильтрующего предиката. Т.е. в общем случае там будет не ускорение, а некое гарантированное время выборки.
Или я о чем то не в ту степь?
21 июн 19, 10:33    [21912719]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
msLex
Member

Откуда:
Сообщений: 7734
uaggster
Sergey Syrovatchenko
Либо создавайте индекс покрывающий по полю по которому фильтруете. Либо если не принципиально модифицируйте свой кластерный индекс и туда на первое место ставьте стоблец по котороуми опять-же фильтруете. Либо если редакция позволяет загоняйте данные в кластерный колумнстор.

А как кластерный колумнстор поможет при такой фильтрации?
Без подвоха вопрос.
Колумнстор, как я понимаю, всегда сканируется целиком, вне зависимости от фильтрующего предиката. Т.е. в общем случае там будет не ускорение, а некое гарантированное время выборки.
Или я о чем то не в ту степь?


Колумнстор достаточно хорошо жмет данных.
Особенно те, где в полях есть много повторяющихся значений.
Соответственно,
1. Скан такого индекса проходить быстрее (если говорить про IO)
2. Количество данных, которые могут уместиться в кеше (буферпул) больше, а значит при чтение выше вероятность попасть на уже закешированные данные

К запросу с * не относиться, но
3. При выборе только части полей из таблицы, благодаря колоночному хранения, количество вычитываемых данных тоже меньше.
21 июн 19, 10:52    [21912736]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
Sergey Syrovatchenko
Member

Откуда:
Сообщений: 126
uaggster
А как кластерный колумнстор поможет при такой фильтрации? Без подвоха вопрос.

Ну и плюс к тому что сказал msLex можно добавить что в рамках каждой RowGroup колумнстора есть мин/макс по значению каждого столбца. Соотвественно если даты у нас по убыванию/возрастанию хранятся, то лишние RowGroup будут отбрасываться.
21 июн 19, 11:31    [21912780]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
nika1058
Member

Откуда:
Сообщений: 18
Спасибо всем за ответы.
Но, раз, с индексами мне экспериментировать не позволили и функций для ленивых не существует, буду джобом складывать в свою таблицу усредненные значения, а в чужую ходить только за данными за текущий получас.
21 июн 19, 12:00    [21912820]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
L_argo
Member

Откуда:
Сообщений: 1139
А чо если обновить статистику по таблице ?
Хоть сабжевое поле без индекса, статистика по нему может быть.
21 июн 19, 12:31    [21912862]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
nika1058
Member

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

Пробовала, почти не влияет на скорость.
21 июн 19, 13:36    [21912927]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
L_argo
Member

Откуда:
Сообщений: 1139
nika1058
L_argo,

Пробовала, почти не влияет на скорость.
Вообще-то ничто не мешает создать индекс по полю.

Поможет - ОК.
Не поможет - удалить.

Как-то навредить он точно не может.
И создастся за какие-то десятки секунд. На хорошем массиве за 5-7 сек.
21 июн 19, 13:49    [21912933]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
L_argo
nika1058
L_argo,

Пробовала, почти не влияет на скорость.
Вообще-то ничто не мешает создать индекс по полю.
Отсутствие прав еще как мешает.

Сообщение было отредактировано: 21 июн 19, 14:06
21 июн 19, 14:05    [21912950]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
nika1058
Member

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

Понимаю, но это политический вопрос, доступ к серверу дали только с условием, что буду только считывать данные ))
21 июн 19, 14:07    [21912952]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9127
nika1058,

В плане выполнения Clustered Index Scan/Table Scan?
21 июн 19, 14:19    [21912962]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30813
nika1058
это политический вопрос, доступ к серверу дали только с условием, что буду только считывать данные ))
Как же вы собираетесь "класть данные в свою таблицу", если доступ к серверу только на чтение???

Вы лучше опишите задачу целиком, и условия её выполнения (что можно делать, и где), может, можно что то придумать.
21 июн 19, 14:40    [21912999]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
nika1058
Member

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

Clustered Index Scan
21 июн 19, 14:45    [21913007]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
nika1058
Member

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

Линкованные серверы. На своем все права есть. С производственного сервера выбираю диапазон данных во временную таблицу в свою базу и выполняю вычисления. Сам select происходит очень долго.
21 июн 19, 14:57    [21913023]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9127
nika1058,

Если имеется индекс, где [now] первым столбцом, то можете попробовать так:
declare @max_id ..., @min_id ...;
 
select top (1)
 @min_id = [id]
from
 archive
where
 [now] >= @dt1
order by
 [now], [id];

select top (1)
 @max_id = [id]
from
 archive
where
 [now] <= @dt2
order by
 [now] desc, [id] desc;

select
 *
from
 archive
where
 [id] between @min_id and @max_id and
 [now] between @dt1 and @dt2;

Вариант
select * from archive with (index = ...) where [now] between @dt1 and @dt2
Тоже может отработать быстрее.
21 июн 19, 15:02    [21913036]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
vborets
Member

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

Ускоряйте сеть... другого решения нет.

Или копируйте всю таблицу себе ночью.. днём работайте у себя с индексами.
21 июн 19, 15:05    [21913039]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30813
nika1058
alexeyvg,

Линкованные серверы. На своем все права есть. С производственного сервера выбираю диапазон данных во временную таблицу в свою базу и выполняю вычисления. Сам select происходит очень долго.
А, понятно.
А если вместо переменных использовать константы, то есть написать:
select * from archive where [now] between 'дата 1' and 'дата 2'

не будет быстрее?
Ещё вариант, может, явно указать индекс?
Он ведь, вообще говоря, есть, но не используется
Либо сервер тупой, либо затраты на лукап будут неоправданно велики.
Вот это нужно проверить.
invm
Если имеется индекс, где [now] первым столбцом, то можете попробовать так:
Да, это отличная идея, хотя эффект зависит от данных, тоже нужно проверять.
21 июн 19, 15:16    [21913054]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
nika1058
Member

Откуда:
Сообщений: 18
invm
Если имеется индекс, где [now] первым столбцом, то можете попробовать так:
declare @max_id ..., @min_id ...;
 
select top (1)
 @min_id = [id]
from
 archive
where
 [now] >= @dt1
order by
 [now], [id];

select top (1)
 @max_id = [id]
from
 archive
where
 [now] <= @dt2
order by
 [now] desc, [id] desc;

select
 *
from
 archive
where
 [id] between @min_id and @max_id and
 [now] between @dt1 and @dt2;


Вариант
select * from archive with (index = ...) where [now] between @dt1 and @dt2

Тоже может отработать быстрее.


Спасибо! В половину быстрее оба варианта.
21 июн 19, 15:23    [21913064]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение запроса  [new]
nika1058
Member

Откуда:
Сообщений: 18
vborets
Ускоряйте сеть... другого решения нет.

Или копируйте всю таблицу себе ночью.. днём работайте у себя с индексами.


Не получится, сводка будет не актуальна. Данные в таблицу прилетают по несколько раз в секунду, да еще с 8-ми конвейеров.
21 июн 19, 15:34    [21913077]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить