|
|
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
Столкнулся на практике и не знаю как можно упростить такой запрос: если существует необходимость отобрать запись с максимальной датой, как это сделать не прибегая к вложенному подзапросу. Просто как не искал, что то нигде такогj не нашел, существуют ли варианты по оптимизации? вариант запроса. select * from table t1 where ..... and t1.Date = (select max(Date) from Table where .....) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 11:25 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
СУБД какая? Если 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, что гораздо дешевле, чем коррелированный подзапрос. Но все равно нужно сравнить планы запросов, для уверенности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 12:49 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
JimmyСУБД какая? Если SQL поддерживает derrived table, то так: СУБД MS SQL 2000, насчет поддержки не знаю, а ещё варианты есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 13:52 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
Если вложенный подзапрос не ссылается на поля внешнего запроса, то он будет выполнет только 1 раз, т.е. его результат будет залит во временную таблицу и уже она будет выступать как еще одна таблица внешнего запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 14:10 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
Дело в том, что возможны как вариант со ссылкой на внешний запрос, так и без. Т.е. возможен вариант, когда необходимо найти все записи с мкс. датой, для примера: select * from table1 t1 where t1.Date = (select max(t2.Date) from table2 t2 where t2.Type = t1.Type) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 14:47 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
Сначала скажите что вы разрабытываете. Решения могут быть совсем не такие как вы ожидаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 16:00 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
Хранимые процедуры, запросы для АБС Diasoft 5NT, в таблицах могут быть миллионы записей. Так что вопрос оптимизации стоит остро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 16:10 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
Уточним. Подобные вещи нужны в 2 случаях. 1) Когда вы вычисляете курс валюты на определенную дату - в этом случае нужно просто развернуть все курсы и проблема отпадет сама собой. 2) Когда вы вычисляете остаток/обороты на определенную дату два варианта - либо вы получаете остаток по конкретному счету, - тогда нет необходимости что-либо менять в запросе, либо по группе счетов - тогда нужно просто от текущих остатков отнять обороты за нужный период. И с min/max не заморачиваться. Чем занимаетесь вы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 16:31 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
на пример, мне необходимо в сводной таблице по договорам указать последние значение процентной ставки, на какую то дату, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 16:34 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
Ну, разве что действовать также как с курсами валют. Т.е. сначала развернуть их (сделать процентную ставку на каждый день для каждого договора) а потом просто сджойнить по дате. Должно получиться быстрее чем шоркать и искать MAX, тем более что таблица ставок не такая уж большая. Тем более, что это нужно сделать только один раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 16:55 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
gardenmanНу, разве что действовать также как с курсами валют. Т.е. сначала развернуть их (сделать процентную ставку на каждый день для каждого договора) а потом просто сджойнить по дате. Должно получиться быстрее чем шоркать и искать MAX, тем более что таблица ставок не такая уж большая. Тем более, что это нужно сделать только один раз. Можно поподробнее, у нас есть две таблицы: таблица договоров, таблица ставок. Таблица ставок содержит идентификатор договора, значение и тип ставки, и дату с которой она действует, что делать дальше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 17:14 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
Serj7 gardenmanНу, разве что действовать также как с курсами валют. Т.е. сначала развернуть их (сделать процентную ставку на каждый день для каждого договора) а потом просто сджойнить по дате. Должно получиться быстрее чем шоркать и искать MAX, тем более что таблица ставок не такая уж большая. Тем более, что это нужно сделать только один раз. Можно поподробнее, у нас есть две таблицы: таблица договоров, таблица ставок. Таблица ставок содержит идентификатор договора, значение и тип ставки, и дату с которой она действует, что делать дальше? Ну так сказали же: вбить в таблицу ставок дополнительные данные. Т.е. чтобы на каждый день там был свой процент ставки. Либо чуть изменить таблицу ставок: Добавить поле "Дата окончания действия ставки" (естественно, эту избыточность придется поддерживать:) ). В таком случае также будет достаточно одного прохода по сджойненным таблицам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 18:37 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
Serj7 пишет: > Столкнулся на практике и не знаю как можно упростить такой запрос: > если существует необходимость отобрать запись с максимальной датой, как > это сделать не прибегая к вложенному подзапросу. Так много слов в ответ написали. А такая конструкция: SELECT TOP 1 * FROM some_table ORDER BY Date DESC не поможет? Или я что-то недопонял? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 20:46 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
Александр Гoлдун. Это работает когда надо найти только одну запись, а автору надо составить список. Реально такая задача может выглядеть так. Есть таблица клиентов. Клиенты должны что-то платить по разным тарифами, Есть таблица изменяющихся во времени тарифов. Нужно составить список клиентов и тарифов, которые действуют в данный момент для каждого из них. Но идея правильная. Я так и делаю Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 21:25 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
Cat2Но идея правильная. Я так и делаю Код: plaintext 1. 2. 3. 4. 5. Только в данном запросе нет никакой разницы с max, другое дело надо было бы выбрать некоторое другое поле по максимальной дате. Кстати, странная имхо задача - по логике казалось бы, надо брать тариф не с максимальной датой, а с ближайшей к некоей заданной, например текущей, тогда все становится на свои места без вложенных запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 22:06 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
zlobus Первоначальный запрос, как я подозреваю, просто сильно упрощен автором, что бы не громоздит джоины. Ну так и получается, что ближайщей к текущей является максимальная. Но обычно, действительно надо брать не текущую, а максимальную, но меньшую требуемой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 22:19 |
|
||
|
Существует ли решение по оптимизации запроса?
|
|||
|---|---|---|---|
|
#18+
Serj7 gardenmanНу, разве что действовать также как с курсами валют. Т.е. сначала развернуть их (сделать процентную ставку на каждый день для каждого договора) а потом просто сджойнить по дате. Должно получиться быстрее чем шоркать и искать MAX, тем более что таблица ставок не такая уж большая. Тем более, что это нужно сделать только один раз. Можно поподробнее, у нас есть две таблицы: таблица договоров, таблица ставок. Таблица ставок содержит идентификатор договора, значение и тип ставки, и дату с которой она действует, что делать дальше? Я у себя на самом деле делал не две а три таблицы. Причем третья таблица заполнялась исключительно триггерами. Т.е. имеем три таблицы: договор (с указанием последней процентной ставки), собственно изменения процентной ставки, и процентные ставки на каждый день (развернутые). Вот эти самые развернутые процентные ставки и заполняются триггером. А дальше селект просто тривиальный - левым джойном связываете договора и развернутые ставки, таким образом можно будет даже "заглядывать в будущее". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2006, 11:02 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=143&tid=1545470]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
75ms |
get topic data: |
12ms |
get forum data: |
4ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 436ms |

| 0 / 0 |
