|
Вопрос знатокам SQL
|
|||
---|---|---|---|
#18+
Добрый день, уважаемые знатоки! Имеется таблица курсов валют с тремя полями: exch_id smallint, exch_time timestamp, exch_value decimal(12,4). Пользователь (бухгалтер и тп) вводит курс НЕ каждый день, и может вводить его вообще нерегулярно. Задача: максимально быстро найти, какой был курс валюты xExch_Id на дату-время xDateTime (например, на позавчера), исходя из предпосылки, что пользователь его вводил на какой-то более ранний день, а вот на позавчера - не ввел. Я решил упорядочить таблицу по двум полям, условно "ключ" можно записать так: exch_id + desc(exch_time) // время -- по убыванию, чтобы последние курсы были "наверху". Вопрос-1: как указать такой ключ в IBase; Вопрос-2: помнится, в Clipper'e и FoxPro есть возможность установить "мягкий поиск", при котором, если ключ в индексе НЕ будет найден, команда SEEK <Expr> "встанет" на запись с ближайшим бОльшим значением ключа. А это именно то, что мне надо в данном случае! Есть ли такая же возможность в SQL ? Извините за многословность! Буду премного благодарен за ответ! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2002, 21:04 |
|
Вопрос знатокам SQL
|
|||
---|---|---|---|
#18+
Привет. А что за проблема? Пиши себе: SELECT FIRST 1 * FROM YOUR_TABLE WHERE EXCH_TIME<=:NEED_TIME ORDER BY EXCH_TIME DESC ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2002, 21:28 |
|
Вопрос знатокам SQL
|
|||
---|---|---|---|
#18+
Хе! Дык ведь этот запрос: SELECT FIRST 1 * FROM YOUR_TABLE WHERE EXCH_TIME<=:NEED_TIME ORDER BY EXCH_TIME DESC НЕ БУДЕТ использовать индекс, там где-то в доках я читал, что знаки НЕРАВЕНСТВА (<, >, ...) не дают оптимизатору возможность использовать индекс! А мне-то надо МАКСИМАЛЬНО быстро выдернуть курс на произвольную дату! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2002, 21:48 |
|
Вопрос знатокам SQL
|
|||
---|---|---|---|
#18+
Привет. Гдето в Инете встречал: таблица ex_date_begin, ex_date_end, ex_course (для одной валюты, если несколько - добавляешь тип) ex_date_begin, ex_date_end - период, в котором действовал курс создаешь уникальный идекс по ex_date_begin, ex_date_end поиск - select ex_course from ex where ex_date_begin<d1 and ex_date_end>d1 сам этот способ не пробовал, насколько быстрый не знаю ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2002, 09:43 |
|
Вопрос знатокам SQL
|
|||
---|---|---|---|
#18+
Не, ну я поражаюсь. А самим помотреть слабо? Этот запрос выполняет ОДНО индексированное чтение. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2002, 11:35 |
|
Вопрос знатокам SQL
|
|||
---|---|---|---|
#18+
Забыл сказать. Для такого запроса нужен индекс по убыванию, т.к. двунаправленных индексоа в IB пока нет. По умолчанию индексы строятся по возрастанию, так что не удивляйся, если ORDER BY ... DESC всю таблицу перелопатит :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2002, 12:41 |
|
|
start [/forum/topic.php?fid=40&msg=32074869&tid=1581029]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 136ms |
0 / 0 |