Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/120: Рейтинг темы: голосов - 120, средняя оценка - 4.98
3 / 3 / 2
Регистрация: 20.07.2010
Сообщений: 119

Очень долго выполняется запрос SQL

21.09.2017, 07:38. Показов 23926. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Товарищи, помогите разобраться почему SQL запрос выполняется жутко долго (2,5 минуты)
Как и где можно протестировать этот несчастный запрос.
SQL
1
SELECT TOP (100) PERCENT derivedtbl_3.Примечание , COUNT(*) AS Количество , avg(derivedtbl_2.Переработка) AS Переработка  FROM   (SELECT TOP (100) PERCENT ОтчетЗИФ_1.Дата  , CASE WHEN (datepart (HOUR, Дата) > '20' OR (datepart (HOUR, Дата) >= '0' AND datepart (HOUR, Дата) <= '8')) THEN 1 ELSE 2  END AS Смена  , dateadd(hh, Hour_Nr, CAST(ОтчетЗИФ_1.Time AS DATETIME)) AS DATA , dateadd(DAY, -1, (dateadd(hh, Hour_Nr, CAST(ОтчетЗИФ_1.Time AS DATETIME)))) AS DATA_1  , CAST(Lk14_summ - (SELECT TOP (1) Lk14_summ FROM  ASUTP.dbo.Report AS t2  WHERE dateadd(hh, Hour_Nr, CAST(TIME AS DATETIME)) < dateadd(hh, ОтчетЗИФ_1.Hour_Nr, CAST(ОтчетЗИФ_1.Time AS DATETIME))  ORDER BY  CASE WHEN datepart (HOUR, (dateadd(hh, Hour_Nr, CAST(TIME AS DATETIME)))) > '20' THEN  dateadd(DAY, -1, (dateadd(hh, Hour_Nr, CAST(TIME AS DATETIME)))) ELSE  dateadd(hh, Hour_Nr, CAST(TIME AS DATETIME))      END DESC) AS INT) AS Переработка  FROM (SELECT TOP (100) PERCENT CASE      WHEN Hour_Nr > 20 THEN  dateadd(HOUR, Hour_Nr, CAST(TIME AS DATETIME) + 1) ELSE  dateadd(HOUR, Hour_Nr, CAST(TIME AS DATETIME))      END AS DATE , TIME , Rashod_N4 , Rashod_N15 FROM ASUTP.dbo.Report AS ОтчетЗИФ_1) AS derivedtbl_1  RIGHT OUTER JOIN dbo.Report AS ОтчетЗИФ_1     ON derivedtbl_1.Date = ОтчетЗИФ_1.Дата   ORDER BY     DATA   , Смена) AS derivedtbl_2  LEFT OUTER JOIN (SELECT Код, Дата, Время , Позиция, Примечание       , dateadd(HOUR, datepart (HOUR, Время), Дата) AS dat FROM dbo.ПримечанияЗИФ  WHERE (Позиция = 'л/к 14 (Переработ-ка л/к №14, т/ч)')) AS derivedtbl_3    ON derivedtbl_2.Дата = derivedtbl_3.dat WHERE  derivedtbl_2.DATA >= '" + FormatDateTime("dd.mm.yyyy",cxDateEdit1->Date) + "'  AND derivedtbl_2.DATA <= '" + FormatDateTime("dd.mm.yyyy",cxDateEdit2->Date) + "'  AND (derivedtbl_2.Переработка <= '" + Edit1->Text + "')  AND (derivedtbl_2.Переработка <> 0) GROUP BY   derivedtbl_3.Примечание ORDER BY   derivedtbl_3.Примечание
dbo.Report - это представление...если эта информация конечно играет роль
Спасибо всем огромное
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2017, 07:38
Ответы с готовыми решениями:

MS SQL. Запрос долго выполняется
Доброго времени суток! Помогите разобраться почему запрос долго выполняется select max(Id) as id FROM gftec WHERE ID_TEC=6 GROUP BY...

Очень долго выполняется запрос
Запрос выполняется минут десять. Разве так должно быть? Обрисовываю ситуацию. Берутся две главные таблицы и одна связующая со связями...

Подключение к SQLServer Express 2014 длится очень долго
Здравствуйте. Я установил SQLServer Express 2014 (SQLEXPRADV_x64_ENU). Запустил свою программу по работе к БД и заметил что...

24
5647 / 4489 / 1089
Регистрация: 29.08.2013
Сообщений: 27,977
Записей в блоге: 3
21.09.2017, 10:41
разбить на подзапросы, найти самый длинный
скормить запрос профайлеру и посмотреть рекомендации
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,271
21.09.2017, 10:49
Во-первых, вы можете написать так, чтобы запрос был виден на экране?
Во-вторых, что там у вас с индексами?
В-третьих, накладывая ограничения на функцию DATEPART, вы думаете, что будут использоваться какие-нибудь индексы?
В-четвёртых, зачем там TOP(100) PERCENT?
В-пятых, чего там подзапрос на подзапросе? Попроще никак?
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,892
21.09.2017, 14:02
Цитата Сообщение от iap Посмотреть сообщение
В-четвёртых, зачем там TOP(100) PERCENT?
так может вьюха у него?

Добавлено через 15 секунд
Цитата Сообщение от iap Посмотреть сообщение
В-четвёртых, зачем там TOP(100) PERCENT?
так может вьюха у него?
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,271
21.09.2017, 14:53
Цитата Сообщение от pincet Посмотреть сообщение
так может вьюха у него?

Добавлено через 15 секунд

так может вьюха у него?
И зачем же во VIEW TOP(100) PERCENT?
Начиная с SQL2005 TOP(100) PERCENT ORDER BY игнорируется.

Я достал его "запрос", и что же оказалось?
TOP(100) PERCENT написано и в подзапросах. Зачем?
Кроме того, это не настоящий запрос, ибо там встречается такое:
C#
1
WHERE derivedtbl_2.DATA >= '" + FormatDateTime("dd.mm.yyyy",cxDateEdit1->Date) + "'
Добавлено через 7 минут
Я неправ. Это, конечно же, не C#. Опреция -> применяется к указателям в C и C++
0
3 / 3 / 2
Регистрация: 20.07.2010
Сообщений: 119
25.09.2017, 06:49  [ТС]
iap, TOP(100) PERCENT и Дата никак не влияют на быстродействие запроса. Запрос этот выполняется в C++ Builder, и как он может быть не настоящим если результат возвращает, но оооочень долго?
Запрос возвращает три столбца, поэтому и используется TOP(100) PERCENT
0
5647 / 4489 / 1089
Регистрация: 29.08.2013
Сообщений: 27,977
Записей в блоге: 3
25.09.2017, 12:46
Цитата Сообщение от Ночь Посмотреть сообщение
Запрос возвращает три столбца, поэтому и используется TOP(100) PERCENT
а при чем тут 3 столбца и top(100)?
а если нужно вывести 4 столбца?

Цитата Сообщение от Ночь Посмотреть сообщение
если результат возвращает, но оооочень долго?
ты сделал то что тебе говорили?
разбил на подзапросы? профайлеру скормил?

раз медленно выполняется - или железо, или сам запрос
проблемы с железом можно выявить в наблюдая за счетчиками
проблемы с запросом - тут нужно знать что и зачем ты тащишь (и структуру БД - таблицы, колонки, индексы)
0
3 / 3 / 2
Регистрация: 20.07.2010
Сообщений: 119
25.09.2017, 13:39  [ТС]
qwertehok, все, узнала откуда TOP(100) PERCENT взялось...я запрос создаю в Management Studio 2008, в конструкторе эта часть автоматом подставляется
На подзапросы разобрала. Они шустро выполняются. Немного дольше выполняется запрос где идет расчет разности между двумя строками
Про "скормить профайлеру" не понимаю..
0
1 / 2 / 3
Регистрация: 24.06.2016
Сообщений: 47
25.09.2017, 20:58
Цитата Сообщение от Ночь Посмотреть сообщение
в конструкторе эта часть автоматом подставляется
Жуть... выброси идею автоматически формировать запросы...
Временные таблицы и использование индексов тебе помогут ускорить процесс
вышеуказанный запрос в помойку
пиши заново и даже не заглядывай в этот ужас
про план запроса вообще все промолчали, там и будет видно что именно тормозит
0
5647 / 4489 / 1089
Регистрация: 29.08.2013
Сообщений: 27,977
Записей в блоге: 3
25.09.2017, 23:10
Цитата Сообщение от demin Посмотреть сообщение
про план запроса вообще все промолчали, там и будет видно что именно тормозит
если она не знает что такое профайлер, то будет план запроса читать?

Цитата Сообщение от Ночь Посмотреть сообщение
Про "скормить профайлеру" не понимаю..
ну спроси у гугла, он тебе все ответит, даже с картинками

Цитата Сообщение от Ночь Посмотреть сообщение
конструкторе эта часть автоматом подставляется
если задача учебная - не обращай внимания на скорость, добивай целиком проект, потом оптимизируешь
если же стоит цель - оптимизировать, тогда лучше описать свою БД и тебе подскажут запрос
0
3 / 3 / 2
Регистрация: 20.07.2010
Сообщений: 119
26.09.2017, 07:39  [ТС]
qwertehok, про профайлер обязательно почитаю.
Запрос нужен для работы, поэтому его нужно сейчас привести в божеский вид
БД:
таблица [Report]
Time |Hour|Lk14_summ
01.09.2017|12 |6452654
01.09.2017|13 |6452775
таблица [Примечание]
Дата | Время | Позиция | Примечание
01.09.2017 12:10:00 |12:00:00| л/к 14 |Примечание_текст

Необходимо:
Получить три столбца: Примечание, кол-во, переработка
логика такая: проверять разность Lk14_summ(переработка), если она меньше 121, тогда из таблицы Примечание, получать текст примечания, где дата и время = Time и Hour таблицы Report
0
5647 / 4489 / 1089
Регистрация: 29.08.2013
Сообщений: 27,977
Записей в блоге: 3
26.09.2017, 08:30
Цитата Сообщение от Ночь Посмотреть сообщение
где дата и время = Time и Hour таблицы Report
а почему вы данные о времени храните по разному?

индексы по колонкам Дата и Время созданы?

Цитата Сообщение от Ночь Посмотреть сообщение
Необходимо:
Получить три столбца: Примечание, кол-во, переработка
за какой-то период? или сразу по всей таблице?
общий размер таблицы какой?
что у вас за сервер? железо какое? винты какие?
0
1 / 2 / 3
Регистрация: 24.06.2016
Сообщений: 47
26.09.2017, 10:29
Схему таблиц скинь, а то как то исходных данных маловато
Ковыряться в наборе БУКОВОК твоего автогенерированного запроса очень не хоца

Цитата Сообщение от qwertehok Посмотреть сообщение
что у вас за сервер? железо какое? винты какие?
Я думаю это уже лишнее, а в остальном поддерживаю
0
3 / 3 / 2
Регистрация: 20.07.2010
Сообщений: 119
26.09.2017, 11:56  [ТС]
qwertehok, данные о времени и дате хранятся по разному, потому что эта БД досталась мне в "наследство" от предшественника. Он сам не может сейчас сказать почему так проектировал. Переделать не могу, т.к. база рабочая.
Период в запросе выбирается пользователем, но период не более 2 месяцев.
0
3 / 3 / 2
Регистрация: 20.07.2010
Сообщений: 119
26.09.2017, 11:58  [ТС]
demin, вот схема таблиц запроса
Миниатюры
Очень долго выполняется запрос SQL  
0
5647 / 4489 / 1089
Регистрация: 29.08.2013
Сообщений: 27,977
Записей в блоге: 3
26.09.2017, 12:11
Цитата Сообщение от Ночь Посмотреть сообщение
Период в запросе выбирается пользователем, но период не более 2 месяцев.
за эти 2 месяца какое количество строк?

Цитата Сообщение от qwertehok Посмотреть сообщение
индексы по колонкам Дата и Время созданы?
Цитата Сообщение от qwertehok Посмотреть сообщение
общий размер таблицы какой?
что у вас за сервер? железо какое? винты какие?
0
1 / 2 / 3
Регистрация: 24.06.2016
Сообщений: 47
26.09.2017, 12:36
Цитата Сообщение от Ночь Посмотреть сообщение
данные о времени и дате хранятся по разному, потому что эта БД досталась мне в "наследство" от предшественника. Он сам не может сейчас сказать почему так проектировал. Переделать не могу, т.к. база рабочая.
Сделай вычисляемое поле в котором будет хранится Дата/Время вместе
Это может упростить запрос + ускорит его
0
3 / 3 / 2
Регистрация: 20.07.2010
Сообщений: 119
26.09.2017, 12:45  [ТС]
qwertehok, сейчас написала кусочек запроса который высчитывает разность между двумя строчками
SQL
1
2
3
4
5
6
7
8
SELECT     TOP (100) PERCENT DATE, Lk14_summ, Lk14_summ -
                          (SELECT     TOP (1) Lk14_summ
                            FROM          dbo.Report AS T1
                            WHERE      (DATE < dbo.Report.Date)
                            ORDER BY DATE DESC) AS Expr1
FROM         dbo.Report
WHERE     (TIME BETWEEN '01.09.2017' AND '25.09.2017')
ORDER BY DATE DESC
за 1 месяц вернулось 600 строк, но это же еще дальше отфильтруется.
индексы по колонкам не созданы
про общий размер таблицы не знаю, большая. столбцов только 97
server 2003, ;железо и винты не знаю. У меня доступ только к разделу с бд
0
1 / 2 / 3
Регистрация: 24.06.2016
Сообщений: 47
26.09.2017, 12:48
Цитата Сообщение от Ночь Посмотреть сообщение
Lk14_summ - (SELECT TOP (1) Lk14_summ FROM dbo.Report AS T1 WHERE (DATE < dbo.Report.Date) ORDER BY DATE DESC) AS Expr1
Это будет тормозить

Добавлено через 1 минуту
600 строк это очень мало
у меня миллионы записей с индексами открываются мгновенно и сервачек дохлый
0
3 / 3 / 2
Регистрация: 20.07.2010
Сообщений: 119
26.09.2017, 13:05  [ТС]
demin, да, правы, тормозит..выполняется дольше чем более объемный запрос. Но я больше не знаю как сделать разницу между двумя строчками
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.09.2017, 13:05
Помогаю со студенческими работами здесь

Не выполняется запрос в SQLite3
Доброго времени суток, товарищи! Начинаю изучать СУБД в рамках универской программы. Создал базу данных, создал ряд таблиц, немного...

Запрос выполняется очень долго
Помагите оптимизировать запрос. Выполняется бесконечно долго (Запрос занял 95.9257 сек.) SELECT sklad.* FROM sklad LEFT JOIN prodal ON...

Запрос выполняется очень долго
Обращаюсь к специалистам за помощью. Задача, поставленная в данной базе решена. Но последний запрос (запрос2) зависает на 8-10...

Простой запрос выполняется очень долго
Здравствуйте. Пишу веб-приложение на asp.net. Выполняется запрос, который просто получает все данные из таблицы. То есть самый простой...

SQL-запрос долго выполняется (INSERT)
ПРочитал много, так и не нашел вразумительного ответа... Может кто чем поможет. В общем, при добавлении в таблицу очень долго, порядка 3-х...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
Настройка MTProxy
Loafer 11.06.2025
Дополнительная информация к инструкции по настройке MTProxy: Перед сборкой проекта необходимо добавить флаг -fcommon в конец переменной CFLAGS в Makefile. Через crontab -e добавить задачу: 0 3. . .
Изучаем Docker: что это, как использовать и как это работает
Mr. Docker 10.06.2025
Суть Docker проста - это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнер, если говорить образно, это запечатанная коробка, в которой находится ваше приложение вместе. . .
Тип Record в C#
stackOverflow 10.06.2025
Многие годы я разрабатывал приложения на C#, используя классы для всего подряд - и мне это казалось естественным. Но со временем, особенно в крупных проектах, я стал замечать, что простые классы. . .
Разработка плагина для Minecraft
Javaican 09.06.2025
За годы существования Minecraft сформировалась сложная экосистема серверов. Оригинальный (ванильный) сервер не поддерживает плагины, поэтому сообщество разработало множество альтернатив. CraftBukkit. . .
Dapper - лучший среди микроORM под C#
UnmanagedCoder 09.06.2025
Знаете, в мире ORM-инструментов для . NET существует негласная иерархия. На вершине массивных фреймворков возвышается Entity Framework - неповоротливый, но всемогущий. А в категории легковесных. . .
Сравнение GCC 14 и Clang 18 компиляторов C для HPC
bytestream 08.06.2025
В высокопроизводительных вычислениях (HPC) выбор компилятора - это ход, способный радикально изменить производительность всей системы. Работая последние 15 лет с критическими HPC-системами, я видел. . .
Всё о конфигурации ASP.NET Core
stackOverflow 08.06.2025
Старый добрый web. config, похоже, отправился на пенсию вместе с классическим ASP. NET. За годы работы с различными проектами я убедился, что хорошо организованная конфигурация – это половина успеха. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »