Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
 Аватар для Kill100
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209

Как оптимизировать запрос?

11.03.2014, 19:22. Показов 871. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть запрос который по фильтру возвращает записи разбивая по страницам и выбирая только указанную страницу. А так же возвращает общее количество записей
Смущает то что выборка делается дважды для общего количества и постраничного. (Вложенные выборки пока что не считаю)
Возможно ли упростить и ускорить скрипт. Пока записей немного в бд. но уже сей час выполняется достаточно медленно. При выборке 200 странице по 20 на каждой уже запрос намного медленнее выполняется чем выборка 1 страницы
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
ALTER PROCEDURE [dbo].[GetPayByFilter] 
@PaySystemId        NVARCHAR(16) = NULL,
@PayStateId         NVARCHAR(16) = NULL,
@StartDate          DATETIME = NULL,
@EndDate            DATETIME = NULL,
@ShowPage           INT,
@CountByPage        INT,
@COUNTROW           BIGINT OUTPUT
AS
BEGIN
  IF @CountByPage < 1
    SET @CountByPage = 20;
  IF @ShowPage < 1
    SET @ShowPage = 1;
 
  SELECT @COUNTROW = COUNT(p.PayId)
  FROM [dbo].[Pay] p
  WHERE (p.CreateDate >= @StartDate OR @StartDate IS NULL)
        AND (p.CreateDate <= @EndDate OR @EndDate IS NULL)
        AND (p.PaySystemId = @PaySystemId OR @PaySystemId IS NULL)
        AND (p.PayStateId = @PayStateId OR @PayStateId IS NULL)
 
  SELECT TOP (@CountByPage) pa.*
  FROM (SELECT TOP (@CountByPage * @ShowPage) p.*
  FROM [dbo].[Pay] p
  WHERE (p.CreateDate >= @StartDate OR @StartDate IS NULL)
        AND (p.CreateDate <= @EndDate OR @EndDate IS NULL)
        AND (p.PaySystemId = @PaySystemId OR @PaySystemId IS NULL)
        AND (p.PayStateId = @PayStateId OR @PayStateId IS NULL)
  ORDER BY p.PayId DESC) AS pa
  ORDER BY pa.PayId
END
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.03.2014, 19:22
Ответы с готовыми решениями:

Как оптимизировать запрос?
День добрый. Есть запрос на выборку из таблицы. Сам запрос проще некуда, но... SELECT id_file, as NameO, path as Path2, filename,...

Как оптимизировать sql-запрос?
Подскажите пожалуйста, как можно оптимизировать запрос SELECT t3._Fld19180 AS &quot;Время&quot;, t3._Fld19184 AS &quot;Пользователь&quot;,...

Как оптимизировать запрос на выборку? Очень тормозит
CREATE PROCEDURE . @ProductsID int, @StoresID tinyint AS BEGIN SET NOCOUNT ON; (SELECT pct.Name as 'Document',...

3
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
11.03.2014, 20:33
Цитата Сообщение от Kill100 Посмотреть сообщение
Возможно ли упростить и ускорить скрипт
Можно запихнуть число строк в возвращаемый набор:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ALTER PROCEDURE [dbo].[GetPayByFilter] 
@PaySystemId        NVARCHAR(16) = NULL,
@PayStateId         NVARCHAR(16) = NULL,
@StartDate          DATETIME = NULL,
@EndDate            DATETIME = NULL,
@ShowPage           INT,
@CountByPage        INT
AS
BEGIN
  IF @CountByPage < 1
    SET @CountByPage = 20;
  IF @ShowPage < 1
    SET @ShowPage = 1;
 
  SELECT TOP (@CountByPage) pa.*
  FROM (SELECT TOP (@CountByPage * @ShowPage) p.*, count(*) over () as countrow
  FROM [dbo].[Pay] p
  WHERE (p.CreateDate >= @StartDate OR @StartDate IS NULL)
        AND (p.CreateDate <= @EndDate OR @EndDate IS NULL)
        AND (p.PaySystemId = @PaySystemId OR @PaySystemId IS NULL)
        AND (p.PayStateId = @PayStateId OR @PayStateId IS NULL)
  ORDER BY p.PayId DESC) AS pa
  ORDER BY pa.PayId
END
Цитата Сообщение от Kill100 Посмотреть сообщение
но уже сей час выполняется достаточно медленно
При таком запросе будет еще хуже, даже избавление от повторных выборок не поможет. Лучше покажите DDL таблицы и индексов.
1
107 / 107 / 5
Регистрация: 28.12.2012
Сообщений: 207
11.03.2014, 20:50
Я бы попробывал обернуть всё во временную таблицу, чтобы дважды не тянуть данные из таблиц..
Также не совсем понял ваш "маневр" с NULL. Еще избавьтесь от * в запросе - надо перечислить все колонки

Для какой версии SQL Server написана процедура? Вот, как вариант, для SQL Server 2012(OFFSET, FETCH):
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ALTER PROCEDURE [dbo].[GetPayByFilter] 
@PaySystemId        NVARCHAR(16) = NULL,
@PayStateId         NVARCHAR(16) = NULL,
@StartDate          DATETIME = NULL,
@EndDate            DATETIME = NULL,
@ShowPage           INT,
@CountByPage        INT,
@COUNTROW           BIGINT OUTPUT
AS
BEGIN
  IF @CountByPage < 1
    SET @CountByPage = 20;
  IF @ShowPage < 1
    SET @ShowPage = 1;
 
  SELECT p.* -- убрать звездочку и перечислить все колонки
  INTO #result 
  FROM [dbo].[Pay] p
  WHERE p.CreateDate BETWEEN @StartDate AND @EndDate
        AND p.PaySystemId = @PaySystemId
        AND p.PayStateId = @PayStateId
 
  SELECT @COUNTROW = @@ROWCOUNT
  
  SELECT * -- убрать звездочку и перечислить все колонки
  FROM #result
  ORDER BY PayId DESC
  OFFSET @CountByPage * ShowPage ROWS FETCH NEXT @CountByPage ROWS ONLY
END
Также не мешало бы посмотреть План выполнения, может нужно просто добавить индекс
1
 Аватар для Kill100
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
11.03.2014, 20:59  [ТС]
Цитата Сообщение от asd24 Посмотреть сообщение
Также не совсем понял ваш "маневр" с NULL.
Пользователь может указать только 1 критерий поиска а может сразу все. От туда и такой манёвр. так как писать 8 с лишнем хранимок для каждого варианта это не вариант. Да и в asp код будет громоздкий и уродливый.

Еще избавьтесь от * в запросе - надо перечислить все колонки
А разве это влияет на производительность? Что он сам их перечислит все что я их сам перечислю.

Цитата Сообщение от asd24 Посмотреть сообщение
Для какой версии SQL Server написана процедура
Для 2008

Цитата Сообщение от asd24 Посмотреть сообщение
Я бы попробывал обернуть всё во временную таблицу
Была такая мысль возможно так и сделаю. Просто еще хостинг не самый быстрый. Может в обще просто переедем.

Всем спасибо за ответы. Завтра посмотрю план выполнения. И буду уже тогда думать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.03.2014, 20:59
Помогаю со студенческими работами здесь

Как оптимизировать запрос с большим количеством join к одной и той же таблице?
Здравствуйте. Есть таблица вида : id fk1 fk2 1 1 7 2 1 3 3 1 9 4 2 3 5 2 5

Оптимизировать запрос!
Всем хорошего дня! Написал запрос, который выбирает записи из более чем 500 тыс. записей select mo.OBJID, max(mp.LAT) as X,...

Оптимизировать запрос
Вопрос в том, что данный запрос выполняется относительно долго можно ли ускорить выполнение? по задаче, нужно заменить null-значения...

Оптимизировать большой запрос
Доброго времени суток, уважаемые форумчане! Подскажите как можно оптимизировать скорость выполнения запроса: SELECT num as , naim...

Помоги оптимизировать запрос
ПОмогите пожалуйста вот запрос SELECT Con_string, TablesName, Once, Days, Weeks FROM TablesChecker WHERE (Once = '1' and...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru