Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема со скоростью запроса [D7, MSSQL]


Страницы:   1 2

Barmutik ©   (2004-11-19 10:10:00) 

Появилась следющего рода проблема в MS SQL Server 2000:

Есть таблица с некоторым набором полей. В таблице есть IDxx (типа int)- Primary key. Встала необходимость делать запросы следующего вида:
SELECT IDxx, MyField FROM MyTAble WHERE IDxx IN (.....)

Проблема заключается во времени реации сервера на запрос.

Если количество значений в IN не большое то запрос работает мгновенно... Но если она ставновится больше 500 ... то время реакции увеличивается до 8-10 секунд.... что не приемлимо...

Проблема абсолютно непонятна учитывая что в данной таблице порядка 4000 (4 тысячи всего) записей...

По данному полю построен индекс.... во время использования данной таблице в других запросах проблем со скоростью не возникает.

Повторный запрос происходит мгновенно .. что в принципе и понятно он находится в кэше сервера.

Серверный компьютер: 2-х процессорный на Intel Pentium 4 2.8 Gh c 2 Gb оперативки

Подскажите в чём грабли ...


Barmutik   (2004-11-19 15:28:00) [1]

Нет .. значения сбсолютно не упорядочены .. разрывы могут быть большими... 1,2 и т.д... чисто для примера...

Список ИД может быть абсолютно любым...


sniknik   (2004-11-19 14:20:00) [2]

> ID = 1 OR ID = 2 OR ID = ... и т.д.
самое интересное как всегда в точках ... ;о))

если прогрессия по первым двум значениям аналогична следующим то почему самому не пересоставить запрос? даже десяток(на случай разрывов в значениях) BETWEEN будет быстрее чем in или даже временная таблица.


Barmutik   (2004-11-19 14:07:00) [3]

План выполнения запроса смотрел:

Состоит из двух состовляющих:
Селект (0%) <- Выбор по индексу (100%).

Посмотрел что приходит непосредственно на выполнение после оптимизатора:  ID = 1 OR ID = 2 OR ID = ... и т.д.

Я просто думал что такая операция по индексу должна быть мгновенной.. но тут поступила информация что при такой конструкции он делает столько пробегов по индексу сколько у меня значений в IN а не один сквозной проход по индексу.

Тут наверно и тормозит... да буду постораться пробовать с временной таблицей... главное что бы затраты на создание таблицы + вставка в неё ключей + потом объединение оказались меньшими по времени.


Anatoly Podgoretsky   (2004-11-19 14:00:00) [4]

Может пофиг, а может нет, но планы наверняка разные будут.
LEFT INNER JOIN где слева список, на мой взгляд самое то, не проводя анализа плана или измерения времени.


Fay   (2004-11-19 13:56:00) [5]

2 Anatoly Podgoretsky ©   (19.11.04 13:35) [19]

> только правильно выбери что справа, что слева поставить.

А в INNER JOIN не пофинг?


Sergey13   (2004-11-19 13:53:00) [6]

2[14] Barmutik   (19.11.04 12:29)
>Утилита сторонняя.. я обладаю информацией только о мехнизме её вызова и получения результатов. Никакой больше информации...
Я не имел в виду ничего такого противозаконного. 8-) Просто мониторчиком каким нить посмотреть какие запросы выполняются при работе утили, и если не шибко наворочено - повторить у себя.


Anatoly Podgoretsky   (2004-11-19 13:35:00) [7]

при IN индексы не используются, происходит перебор всех записей с проверкой на вхождение в список.
Ты план выполнения смотрел?.

Прислушайся к советам по объединению, реальный путь повышения скорости, только правильно выбери что справа, что слева поставить.


Barmutik   (2004-11-19 13:30:00) [8]

Да выделенный сервер... нет ..это уже проверялось...


sniknik   (2004-11-19 13:19:00) [9]

> иногда
?

комп действительно сервер? не выставил ли кто случаем sleep для дисков при простое?


Barmutik   (2004-11-19 12:58:00) [10]

Нет .. очень даже хорошо если всё будет работать как надо.

Вот ещё что меня смущает. На нашем сервере (дохлый комп) стоит SQL Server Developer Edition и время реакции никогда не бывает больше 3 секунд.

У заказчика на мощном 2-х процессором компе с 2 Гб оперативки и Enterprise Edition пауза иногда бывает и 20 секунд...

Как это можно объяснить ?


sniknik   (2004-11-19 12:49:00) [11]

решение уже сказали, посчитаем

получение параметров из внещней утилиты - 0.1 секунды
временная таблица, создание, заполнение - меньше сек. (предположительно)
запрос с обьеденением, получением значений из таблицы - для 500 записей меньше сек (предположительно)

итого 2.1 сек. (а скорее меньше) против 8-10 секунд, разве плохо?


Barmutik   (2004-11-19 12:29:00) [12]

Утилита сторонняя.. я обладаю информацией только о мехнизме её вызова и получения результатов. Никакой больше информации...


Sergey13   (2004-11-19 12:07:00) [13]

А "подсмотреть" что делает утилита нельзя? Ну и бросить ее потом. 8-)


Barmutik   (2004-11-19 12:03:00) [14]

Внешняя утилита работает быстро и время реакции на любые комбинации внешних параметров в запросе не превышает 0.1 секунды.


Barmutik   (2004-11-19 11:51:00) [15]

Так .. подробнее:

Пользователь осуществляет ввод спец параметров, которые затем передаются на оценку ВНЕШНЕЙ программе, которая по своим бизнес правилам оценивает их и возвращает список ИД записей которые требуется показать пользователю. По этом усписку потому и делается запрос через IN (список ИД).

Реально ткой запрос может быть и каждые 5 секунд. Пользователь что-то поменял в параметрах и произвёл новое обращение за результатами...


sniknik   (2004-11-19 11:51:00) [16]

еще интересно
время за которое утилита возвращает "не большое" количество и 500 значений.

повторный запрос он происходит тоже с вызовом этой утилиты? или просто перезапрос уже готового sql запроса?


ЮЮ   (2004-11-19 11:40:00) [17]

Утилита это что? отдает список - это как? Почему эта утилита отдает список каждые 5 секунд, когда пользователь успевает сформулировать новые требования к утилите?


Barmutik   (2004-11-19 11:37:00) [18]

Формируются следующим образом:

Внешняя НЕ МОЯ утилита по запросу к ней отдаёт список ID которые я должен показать польщователю. Список строится той утилитой и я никак не моуг повлиять на его построение. После получения данного списка мне надо отобразить пользователю записи которые входят в тот список ID которые вернула мне утилита.

Мне не важно приятность.. важна только скорость!!! Подойдёт любой способ.

Система многопользовательская .. т.е одновременнго может быть несколько запросов ...


sniknik   (2004-11-19 11:30:00) [19]

можно еще подобный запрос на обьеденении таблиц построить, не так быстро как с временной но быстрее чем с in (если индексы есть) будет.
(хотя это надо еще проверить что быстрее ;о))


ЮЮ   (2004-11-19 11:08:00) [20]

ты так и не ответил, "как формируются эти 2000-3000 значений", да еще кадые 5 секунд. Не в гриде же с мультиселектом :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо