Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите разобраться с max() (уж очень тормозит) / 19 сообщений из 19, страница 1 из 1
27.09.2002, 03:38:42
    #32053497
Monarh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
Возможно я что то не так делаю но есть такая проблема.
Таблица состоит из десятка текстовых полей, +идентификатор, и плюс 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
27.09.2002, 09:21:08
    #32053521
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
SQL2000 ?
...
Рейтинг: 0 / 0
27.09.2002, 09:29:47
    #32053525
Bzzzzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
А там точно GROUP BY применить негде? Ведь если такой запрос разбить на кучу маленьких(по одному полю) - и десяти секунд не пройдет, как отработает!
...
Рейтинг: 0 / 0
27.09.2002, 10:12:00
    #32053548
akuz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
А можно ли использовать временную таблицу?
...
Рейтинг: 0 / 0
27.09.2002, 11:27:43
    #32053578
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
А если по этим 70 полям индексы добавить?
...
Рейтинг: 0 / 0
27.09.2002, 11:30:18
    #32053583
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
Наличие такого кол-ва полей наталкивает на мысль, что данные ненормализованы. Имеет смысл изменить структуру. Проблема производительности тогда может сняться сама собой
...
Рейтинг: 0 / 0
27.09.2002, 11:55:09
    #32053601
Bzzzzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
2Dankov

Судя по предполагаемой мощности таблы, вполне допускаю что это результаты съема параметров реалтаймового процесса. Т.е. кол-во полей зависит ислючительно от кол-ва датчиков. Так что с нормализацией... Единственно настораживает "десяток текстовых полей"!
...
Рейтинг: 0 / 0
27.09.2002, 15:26:16
    #32053723
Monarh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
Спасибо всем кто откликнулся. Отвечаю на заданные вопросы.
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
27.09.2002, 15:43:30
    #32053730
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
а вот так долго работает?
Код: 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
27.09.2002, 15:55:05
    #32053743
akuz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
В силу ряда причин использовать временную таблицу не представляется возможным. Я извиняюсь, но я не понял, как в данной ситуации она может помочь
Если вы можете использовать переменные, по каким-таким причинам нельзя использовать временные таблицы?
Таблица или переменные - разницы нет. Просто через таблицу можно вывести несколько строк.
А попробуйте без переменных, вот так.
Код: 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
27.09.2002, 16:08:56
    #32053754
Monarh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
2MiCe
Большое вам человеческое спасибо описанный вами вариант отработал мгновенно(не прошло и секунды),
я имею ввиду вариант с group by. Если не сложно укажите источник где можно прочитать по подробнее счем связана такая разница в производительности при добавлении group by.
Спасибо.
...
Рейтинг: 0 / 0
27.09.2002, 16:37:20
    #32053766
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
дык он по моему сканил всю таблицу и агрегировал.....
а с группировкой сначало выбрал а уж потом агрегировал...
вот так тоже должно быть быстро...
Код: plaintext
1.
2.
select max(n1), max(n2), max(n3), .... , max(n70)
from (select *  from Table1 where  IdT2 = ?? )
...
Рейтинг: 0 / 0
27.09.2002, 17:42:06
    #32053791
Monarh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
2MiCe
Я попробовал но сервер не хочет востпинимать такой синтаксис пишет "Incorrect syntax near ')'".
...
Рейтинг: 0 / 0
29.09.2002, 17:15:42
    #32053944
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
дык дай ему алиас...
Код: plaintext
1.
2.
select max(n1), max(n2), max(n3), .... , max(n70)
from (select *  from Table1 where  IdT2 = ?? ) t
...
Рейтинг: 0 / 0
30.09.2002, 17:08:31
    #32054146
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
>Добавлять индексы я пробовал, но результата это не дало, вернее, я его не заметил

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

2Garya
View у меня нету, а вот по поводу индексов хотел уточнить, имеется ввиду индекс один на все поля, или много индексов на каждое поле отдельно. Может я неправильно создавал индексы.
...
Рейтинг: 0 / 0
30.09.2002, 20:23:55
    #32054209
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
создать теже индексы что и в 7...
обновить статистику....
...
Рейтинг: 0 / 0
30.09.2002, 22:10:12
    #32054223
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
по одному индексу на поле.
А сервиспак поставил?
...
Рейтинг: 0 / 0
01.10.2002, 19:17:31
    #32054614
ars
ars
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с max() (уж очень тормозит)
Нужен индекс, в котором 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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите разобраться с max() (уж очень тормозит) / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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