Форум "DataBase и SQL"
Язык запросов баз даных
Помогите оптимизироватьSELECT distinct
|
|
ну.... мне кажется, что в этом случае - разве что созданием индексов по полям участвующим в подзапросах (если их еще нет)... |
|
#2 Mystic © 15.05.07 02:10:41
А если так? SELECT DISTINCT
|
|
>#2 Mystic © гм... а разве через подзапросы не будет быстрее? если через них - так ведь вроде как "шаг за шагом" отрезаются ненужные части данных, а в случае с FROMпо идее сначала идет полное объеденение, а потом уже фильтрация... Хотя без плана запросов тут наверное можно только гадать, как сервер сам будет оптимизировать их выполнение. Ну, или делать контрольные замеры на больших массивах. Которые кстати тоже на дадут нормальной гарантии оптиимизации. Тот же MS SQL настолько умен, что отслеживает статистику запросов и если видит, что время запроса значительно возросло (например, из-за того что значительно увеличилось количество в одной из таблиц) --- так он "умница" (практически на лету!) сам меняет план запросов. Попробуй такому навязать свою оптимизацию. Он лучше тебя знает. |
|
#4 Mystic © 15.05.07 22:28:02
Нет, через подзапросы всегда не быстрее. Обычно подзапрос преобразуется к нормальной форме без подзапроса, а затем выполняется. Если этого не делать, то SQL сервер имеет мало возможностей для оптимизации выполнения запроса, т. е. он выполняет действия "шаг за шагом", в то время как в общем случае он работает с большими массивами данных, в состоянии сам решать, какие ограничения наиболее отсекают результат и т. п. |
|
AFAIK, в случае использования IN индексы не так полезны, как в варианте мистика. Его план будет оптимальнее, а план с джойном - лучше всех. отправлено с мобилки |
|
#6 Mystic © 16.05.07 11:48:08
>#3 Deep © 15.05.07 19:15:22 Да, самый критичные ресурс при выполнении SQL --- дисковые операции. В моем случае при возможности сервер сразу закеширует мелкие таблицы, а в твоем может не справится и выполнять шаг за шагом, нервно дергая винт. >#5 Kortez © 16.05.07 01:03:57 Не совсем согласен насчет JOIN. Тем более в Oracle до 9-й версии такого ключелого слова вообще нет, да и в MS SQL я предпочитаю вместо LEFT JOIN использовать *=. Так что тут, имхо, многое зависит от реализации сервера БД.
|
|
> Так что тут, имхо, многое зависит от реализации сервера > БД. это - ДА! но, поскольку Влад не стал указывать СУБД, я тоже не уточнял, что говорю об интербейсоподобных в любом случае использование такого "сложносочиненного" запроса на "толстой" базе в любой СУБД ни к чему хорошему не приведет |
|
#8 Mystic © 16.05.07 12:39:12
Ну... если говорить об Oracle, то он вначале приведет исходный запрос к тому виду, что написал я, и только тогда начнет его выполнять. |
|
#9 Vlad © 21.05.07 12:50:29
спасибо. Что-то я и забыл что сюда писал :) Попробовал вариант Андрея - скорость не особо изменилась. Вернее, я не заметил PS у меня MSSQL |
|
#10 Mystic © 21.05.07 12:59:10
А размер таблиц какой? |
|
> Vlad © это точно -- заметить результаты оптимизации можно только при достаточно больших объемах таблиц. вернее при достаточно большом количестве операций над их данными (а их ведь можно "условно" подсчитать, зная размеры таблиц). |
|
#12 Vlad © 21.05.07 16:26:42
TP_SERVICELISTS очень большая другие гораздо меньше |
|
#13 Mystic © 21.05.07 16:35:40
А этот запрос сколько выполняется?
|
|
#14 Mystic © 21.05.07 16:36:21
AS_DateFrom и AS_DataTo из какой таблицы??? |
|
#15 Vlad © 21.05.07 16:47:08
AS_DateFrom и AS_DataTo из AIRSEASON > SELECT > TL_TSKEY > FROM > TP_SERVICELISTS > WHERE > TL_TIKEY in (SELECT > TP_TIKEY > FROM > TP_PRICES > WHERE > TP_KEY = 7359238) выполняется где-то 0.5 секунды |
|
#16 Mystic © 21.05.07 16:58:23
Хм.. а весь запрос сколько? |
|
#17 Mystic © 21.05.07 17:00:44
Вообще, раскрой тему больше... |
|
#18 Vlad © 21.05.07 17:06:09
весь запрос чуть дольше, практически не заметно. Просто он повторяется часто. Для каждого TP_KEY = , коих много. вот и получается что долго в сумме. Спасибо еще раз, но по моему, тут ничем не поможешь. все равно для каждого придется вычислять. Обидно, что значений на выходе всего 7 в комбинациях по 2 |
|
если результат запроса и есть результирующие переменные, то может стоит сделать выборку для всех нужных ID, а потом уже в локальном датасете работать с нужными значениями? |
Написать ответ |
|
