powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Существует ли решение по оптимизации запроса?
17 сообщений из 17, страница 1 из 1
Существует ли решение по оптимизации запроса?
    #33475940
Serj7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся на практике и не знаю как можно упростить такой запрос:
если существует необходимость отобрать запись с максимальной датой, как это сделать не прибегая к вложенному подзапросу. Просто как не искал, что то нигде такогj не нашел, существуют ли варианты по оптимизации?
вариант запроса.
select *
from table t1
where .....
and t1.Date = (select max(Date)
from Table
where .....)
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33476275
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СУБД какая? Если SQL поддерживает derrived table, то так:

SELECT *
FROM table t1, (SELECT max(Date) AS date, <ID fields list> FROM table GROUP BY <ID fields list> ) t2
WHERE t1.<ID fields list> = t2.<ID fields list> and t1.date = t2.date

Вероятно, что сначала оптимизатор сформирует временную таблицу (t2) с максимальными датами, а потом сделает обычный JOIN, что гораздо дешевле, чем коррелированный подзапрос. Но все равно нужно сравнить планы запросов, для уверенности.
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33476465
Serj7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JimmyСУБД какая? Если SQL поддерживает derrived table, то так:


СУБД MS SQL 2000, насчет поддержки не знаю, а ещё варианты есть?
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33476526
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вложенный подзапрос не ссылается на поля внешнего запроса, то он будет выполнет только 1 раз, т.е. его результат будет залит во временную таблицу и уже она будет выступать как еще одна таблица внешнего запроса.
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33476659
Serj7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том, что возможны как вариант со ссылкой на внешний запрос, так и без. Т.е. возможен вариант, когда необходимо найти все записи с мкс. датой, для примера:

select *
from table1 t1
where t1.Date = (select max(t2.Date)
from table2 t2
where t2.Type = t1.Type)
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33476897
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала скажите что вы разрабытываете. Решения могут быть совсем не такие как вы ожидаете.
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33476928
Serj7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хранимые процедуры, запросы для АБС Diasoft 5NT, в таблицах могут быть миллионы записей. Так что вопрос оптимизации стоит остро.
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33476998
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточним. Подобные вещи нужны в 2 случаях.
1) Когда вы вычисляете курс валюты на определенную дату
- в этом случае нужно просто развернуть все курсы и проблема отпадет сама собой.
2) Когда вы вычисляете остаток/обороты на определенную дату
два варианта - либо вы получаете остаток по конкретному счету, - тогда нет необходимости что-либо менять в запросе, либо по группе счетов - тогда нужно просто от текущих остатков отнять обороты за нужный период. И с min/max не заморачиваться.

Чем занимаетесь вы?
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33477014
Serj7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на пример, мне необходимо в сводной таблице по договорам указать последние значение процентной ставки, на какую то дату,
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33477109
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, разве что действовать также как с курсами валют. Т.е. сначала развернуть их (сделать процентную ставку на каждый день для каждого договора) а потом просто сджойнить по дате. Должно получиться быстрее чем шоркать и искать MAX, тем более что таблица ставок не такая уж большая. Тем более, что это нужно сделать только один раз.
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33477172
Serj7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanНу, разве что действовать также как с курсами валют. Т.е. сначала развернуть их (сделать процентную ставку на каждый день для каждого договора) а потом просто сджойнить по дате. Должно получиться быстрее чем шоркать и искать MAX, тем более что таблица ставок не такая уж большая. Тем более, что это нужно сделать только один раз.

Можно поподробнее, у нас есть две таблицы: таблица договоров, таблица ставок. Таблица ставок содержит идентификатор договора, значение и тип ставки, и дату с которой она действует, что делать дальше?
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33477409
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serj7 gardenmanНу, разве что действовать также как с курсами валют. Т.е. сначала развернуть их (сделать процентную ставку на каждый день для каждого договора) а потом просто сджойнить по дате. Должно получиться быстрее чем шоркать и искать MAX, тем более что таблица ставок не такая уж большая. Тем более, что это нужно сделать только один раз.

Можно поподробнее, у нас есть две таблицы: таблица договоров, таблица ставок. Таблица ставок содержит идентификатор договора, значение и тип ставки, и дату с которой она действует, что делать дальше?
Ну так сказали же: вбить в таблицу ставок дополнительные данные. Т.е. чтобы на каждый день там был свой процент ставки.

Либо чуть изменить таблицу ставок: Добавить поле "Дата окончания действия ставки" (естественно, эту избыточность придется поддерживать:) ). В таком случае также будет достаточно одного прохода по сджойненным таблицам
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33477625
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serj7 пишет:

> Столкнулся на практике и не знаю как можно упростить такой запрос:
> если существует необходимость отобрать запись с максимальной датой, как
> это сделать не прибегая к вложенному подзапросу.

Так много слов в ответ написали.

А такая конструкция:

SELECT TOP 1 * FROM some_table ORDER BY Date DESC

не поможет? Или я что-то недопонял?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33477640
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Александр Гoлдун.
Это работает когда надо найти только одну запись, а автору надо составить список.

Реально такая задача может выглядеть так.
Есть таблица клиентов. Клиенты должны что-то платить по разным тарифами, Есть таблица изменяющихся во времени тарифов. Нужно составить список клиентов и тарифов, которые действуют в данный момент для каждого из них.

Но идея правильная. Я так и делаю

Код: plaintext
1.
2.
3.
4.
5.
select * 
from table1 t1
where t1.Date = (select top  1  t2.Date
from table2 t2 
where t2.Type = t1.Type
order by t2.Date DESC)
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33477661
Фотография zlobus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Но идея правильная. Я так и делаю

Код: plaintext
1.
2.
3.
4.
5.
select * 
from table1 t1
where t1.Date = (select top  1  t2.Date
from table2 t2 
where t2.Type = t1.Type
order by t2.Date DESC)


Только в данном запросе нет никакой разницы с max, другое дело надо было бы выбрать некоторое другое поле по максимальной дате.

Кстати, странная имхо задача - по логике казалось бы, надо брать тариф не с максимальной датой, а с ближайшей к некоей заданной, например текущей, тогда все становится на свои места без вложенных запросов.
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33477672
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
zlobus
Первоначальный запрос, как я подозреваю, просто сильно упрощен автором, что бы не громоздит джоины.

Ну так и получается, что ближайщей к текущей является максимальная. Но обычно, действительно надо брать не текущую, а максимальную, но меньшую требуемой.
...
Рейтинг: 0 / 0
Существует ли решение по оптимизации запроса?
    #33478210
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serj7 gardenmanНу, разве что действовать также как с курсами валют. Т.е. сначала развернуть их (сделать процентную ставку на каждый день для каждого договора) а потом просто сджойнить по дате. Должно получиться быстрее чем шоркать и искать MAX, тем более что таблица ставок не такая уж большая. Тем более, что это нужно сделать только один раз.

Можно поподробнее, у нас есть две таблицы: таблица договоров, таблица ставок. Таблица ставок содержит идентификатор договора, значение и тип ставки, и дату с которой она действует, что делать дальше?

Я у себя на самом деле делал не две а три таблицы. Причем третья таблица заполнялась исключительно триггерами. Т.е. имеем три таблицы: договор (с указанием последней процентной ставки), собственно изменения процентной ставки, и процентные ставки на каждый день (развернутые). Вот эти самые развернутые процентные ставки и заполняются триггером. А дальше селект просто тривиальный - левым джойном связываете договора и развернутые ставки, таким образом можно будет даже "заглядывать в будущее".
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Существует ли решение по оптимизации запроса?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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