powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите разобраться с max() (уж очень тормозит)
19 сообщений из 19, страница 1 из 1
Помогите разобраться с max() (уж очень тормозит)
    #32053497
Monarh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно я что то не так делаю но есть такая проблема.
Таблица состоит из десятка текстовых полей, +идентификатор, и плюс 70 полей numeric(18,2) (n1, n1, n3, ...). В таблицу занесено около 2000 записей. Необходимо выбрать максимальные значениия из 70 последних колонок (n1, n2, n3, ...) причем выборку необходимо производить из тех у которых условно Колонка2 = ?? ( ... where Колонка2 = ??) Колонка2 - название условного столбца. Колличество строк удовлетворяющих условию около 200.
Я пишу следующим образом:
select max(n1), max(n2), max(n3), .... , max(n70) from Table1 where Column2 = 523
Так вот все это хозяйство работает неимоверно долго я ждал около 10 мин но так и не дождался.
Может чего посоветуете? Заранее спасибо.
Да и ещё таже задача но реально количестко строк может достигарь нескольких миллиардов.
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053521
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2000 ?
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053525
Bzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А там точно GROUP BY применить негде? Ведь если такой запрос разбить на кучу маленьких(по одному полю) - и десяти секунд не пройдет, как отработает!
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053548
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно ли использовать временную таблицу?
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053578
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если по этим 70 полям индексы добавить?
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053583
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наличие такого кол-ва полей наталкивает на мысль, что данные ненормализованы. Имеет смысл изменить структуру. Проблема производительности тогда может сняться сама собой
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053601
Bzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Dankov

Судя по предполагаемой мощности таблы, вполне допускаю что это результаты съема параметров реалтаймового процесса. Т.е. кол-во полей зависит ислючительно от кол-ва датчиков. Так что с нормализацией... Единственно настораживает "десяток текстовых полей"!
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053723
Monarh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем кто откликнулся. Отвечаю на заданные вопросы.
1.Используется для разработки SQL Server 2000, но возможно, что реальная база будет работать на SQL 7.
2.В силу ряда причин использовать временную таблицу не представляется возможным. Я извиняюсь, но я не понял, как в данной ситуации она может помочь.
3.Добавлять индексы я пробовал, но результата это не дало, вернее, я его не заметил.
4.По поводу нормализации здесь все нормально. Прошу прощения за неточность задачи, и дабы исключить такого рода вопросы приведу точную структуру таблицы:
IdT1 numeric, PK, Ident
IdT2 numeric, FK
C1 varchar(255),
C2 varchar(255),
C3 varchar(255),
C4 varchar(255),
C5 varchar(255),
N1 numeric(18,2),
N2 numeric(18,2),
.
.
.
N70 numeric(18,2)
Причем столбцы С1..С5, n1..n5 хранят ряд вариантов параметров(не повторющиеся варианты ) объекта имя которого храниться в T2 с которой T1 связана по IdT2.
5. Сообщение Bzzzzz to Dankov я понял не до конца.
6. Что касается group by, здесь я ничего сказать не могу. А вот идея с разбитием на много маленьких запросов хоть мне и не очень нравиться (как-то это криво), но оказалась она очень действенной.
И в итоге проблема решилась следующим образом.
Вместо select max(n1),…, max(n70) from T1 where IdT2 = ??
отработки которого я так и не дождался, я использовал:

declare @nn1 numeric(18,2), …, @nn70 numeric(18,2)
select @nn1 = max(n1) from T1 where IdT2 = ??

select @nn70 = max(n70) from T1 where IdT2 = ??

Время затраченное на работу указанной последовательности составило 2,5 сек, причем на реальном объеме данных.
И все таки хотелось бы узнать по какому алгоритму работают агрегирующие функции min(), max() и почему изначальный вариант так тормозил.
Еше раз спасибо.

Прошу прощения за отклонения от темы, но может кто знает что за файлы с расширением sdf, база старенькая времен досовского Паскаля, а получить доступ к инфе в ней очень нужно. Может подскажете где чего поискать об этом формате?
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053730
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот так долго работает?
Код: plaintext
1.
2.
3.
select IdT2,max(n1), max(n2), max(n3), .... , max(n70)
from Table1
where  IdT2 = ?? 
group by IdT2


если 1) модификация данных в таблице не оч частая
2) сервер будет sql2000
то можно создать индексированное представление
с запросом -
select IdT2,max(n1), max(n2), max(n3), .... , max(n70)
from Table1
group by IdT2
и повесить индекс на IdT2
твои запросы будут просто летать.....
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053743
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В силу ряда причин использовать временную таблицу не представляется возможным. Я извиняюсь, но я не понял, как в данной ситуации она может помочь
Если вы можете использовать переменные, по каким-таким причинам нельзя использовать временные таблицы?
Таблица или переменные - разницы нет. Просто через таблицу можно вывести несколько строк.
А попробуйте без переменных, вот так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select distinct
  idT2,
  n1 = (select max(n1) from T1 where IdT2 = a.IdT2),
...
  n70 = (select max(n70) from T1 where IdT2 = a.IdT2)
from T1 a
where IdT2 IN(??,??,??)

А почему первоначальный вариант тормозил, см. в екзекушн плане.
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053754
Monarh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2MiCe
Большое вам человеческое спасибо описанный вами вариант отработал мгновенно(не прошло и секунды),
я имею ввиду вариант с group by. Если не сложно укажите источник где можно прочитать по подробнее счем связана такая разница в производительности при добавлении group by.
Спасибо.
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053766
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дык он по моему сканил всю таблицу и агрегировал.....
а с группировкой сначало выбрал а уж потом агрегировал...
вот так тоже должно быть быстро...
Код: plaintext
1.
2.
select max(n1), max(n2), max(n3), .... , max(n70)
from (select *  from Table1 where  IdT2 = ?? )
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053791
Monarh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2MiCe
Я попробовал но сервер не хочет востпинимать такой синтаксис пишет "Incorrect syntax near ')'".
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32053944
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дык дай ему алиас...
Код: plaintext
1.
2.
select max(n1), max(n2), max(n3), .... , max(n70)
from (select *  from Table1 where  IdT2 = ?? ) t
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32054146
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Добавлять индексы я пробовал, но результата это не дало, вернее, я его не заметил

Чтобы заметить результат, нужно было перекомпилировать VIEW и SP, лежащие на сервере и обрпщающие к таблице (sp_recompile). Иначе их план выполнения не изменится в связи с изменившимися обстоятельствами, и они по-прежнему не будут использовать индексы.
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32054185
Monarh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегодня я обнаружил следующее. Вариант предложенный MiCe (с group by) великолепно отрабатывающий на SQL7 при опробывании на SQL2000 показал старую историю с тормозами. База с одного SQL на другой переносилась скриптом. Что бы это могло значить?

2Garya
View у меня нету, а вот по поводу индексов хотел уточнить, имеется ввиду индекс один на все поля, или много индексов на каждое поле отдельно. Может я неправильно создавал индексы.
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32054209
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создать теже индексы что и в 7...
обновить статистику....
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32054223
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по одному индексу на поле.
А сервиспак поставил?
...
Рейтинг: 0 / 0
Помогите разобраться с max() (уж очень тормозит)
    #32054614
ars
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ars
Гость
Нужен индекс, в котором 1-е поле idT2 (лучше всего, если оно и единственное). Пусть этот индекс называется i_idT2.
Тогда запрос
Код: plaintext
1.
2.
3.
4.
select IdT2,max(n1), max(n2), max(n3), .... , max(n70)
from Table1 (index = i_idT2)
where  IdT2 = ?? 
group by IdT2

должен работать быстро и не будет зависеть от частоты update statistics.

А вот индексов по всем остальным 70 полям как раз и не нужно.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите разобраться с max() (уж очень тормозит)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]