|
|
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
Возможно я что то не так делаю но есть такая проблема. Таблица состоит из десятка текстовых полей, +идентификатор, и плюс 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 мин но так и не дождался. Может чего посоветуете? Заранее спасибо. Да и ещё таже задача но реально количестко строк может достигарь нескольких миллиардов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 03:38:42 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
SQL2000 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 09:21:08 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
А там точно GROUP BY применить негде? Ведь если такой запрос разбить на кучу маленьких(по одному полю) - и десяти секунд не пройдет, как отработает! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 09:29:47 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
А можно ли использовать временную таблицу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 10:12:00 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
А если по этим 70 полям индексы добавить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 11:27:43 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
Наличие такого кол-ва полей наталкивает на мысль, что данные ненормализованы. Имеет смысл изменить структуру. Проблема производительности тогда может сняться сама собой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 11:30:18 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
2Dankov Судя по предполагаемой мощности таблы, вполне допускаю что это результаты съема параметров реалтаймового процесса. Т.е. кол-во полей зависит ислючительно от кол-ва датчиков. Так что с нормализацией... Единственно настораживает "десяток текстовых полей"! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 11:55:09 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
Спасибо всем кто откликнулся. Отвечаю на заданные вопросы. 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, база старенькая времен досовского Паскаля, а получить доступ к инфе в ней очень нужно. Может подскажете где чего поискать об этом формате? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 15:26:16 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
а вот так долго работает? Код: plaintext 1. 2. 3. если 1) модификация данных в таблице не оч частая 2) сервер будет sql2000 то можно создать индексированное представление с запросом - select IdT2,max(n1), max(n2), max(n3), .... , max(n70) from Table1 group by IdT2 и повесить индекс на IdT2 твои запросы будут просто летать..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 15:43:30 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
В силу ряда причин использовать временную таблицу не представляется возможным. Я извиняюсь, но я не понял, как в данной ситуации она может помочь Если вы можете использовать переменные, по каким-таким причинам нельзя использовать временные таблицы? Таблица или переменные - разницы нет. Просто через таблицу можно вывести несколько строк. А попробуйте без переменных, вот так. Код: plaintext 1. 2. 3. 4. 5. 6. 7. А почему первоначальный вариант тормозил, см. в екзекушн плане. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 15:55:05 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
2MiCe Большое вам человеческое спасибо описанный вами вариант отработал мгновенно(не прошло и секунды), я имею ввиду вариант с group by. Если не сложно укажите источник где можно прочитать по подробнее счем связана такая разница в производительности при добавлении group by. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 16:08:56 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
дык он по моему сканил всю таблицу и агрегировал..... а с группировкой сначало выбрал а уж потом агрегировал... вот так тоже должно быть быстро... Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 16:37:20 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
2MiCe Я попробовал но сервер не хочет востпинимать такой синтаксис пишет "Incorrect syntax near ')'". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 17:42:06 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
дык дай ему алиас... Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2002, 17:15:42 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
>Добавлять индексы я пробовал, но результата это не дало, вернее, я его не заметил Чтобы заметить результат, нужно было перекомпилировать VIEW и SP, лежащие на сервере и обрпщающие к таблице (sp_recompile). Иначе их план выполнения не изменится в связи с изменившимися обстоятельствами, и они по-прежнему не будут использовать индексы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2002, 17:08:31 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
Сегодня я обнаружил следующее. Вариант предложенный MiCe (с group by) великолепно отрабатывающий на SQL7 при опробывании на SQL2000 показал старую историю с тормозами. База с одного SQL на другой переносилась скриптом. Что бы это могло значить? 2Garya View у меня нету, а вот по поводу индексов хотел уточнить, имеется ввиду индекс один на все поля, или много индексов на каждое поле отдельно. Может я неправильно создавал индексы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2002, 18:44:18 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
создать теже индексы что и в 7... обновить статистику.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2002, 20:23:55 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
по одному индексу на поле. А сервиспак поставил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2002, 22:10:12 |
|
||
|
Помогите разобраться с max() (уж очень тормозит)
|
|||
|---|---|---|---|
|
#18+
Нужен индекс, в котором 1-е поле idT2 (лучше всего, если оно и единственное). Пусть этот индекс называется i_idT2. Тогда запрос Код: plaintext 1. 2. 3. 4. должен работать быстро и не будет зависеть от частоты update statistics. А вот индексов по всем остальным 70 полям как раз и не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2002, 19:17:31 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32054185&tid=1819929]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
38ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 342ms |

| 0 / 0 |
