Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Нужен быстрый способ выполнения запроса
|
|||
|---|---|---|---|
|
#18+
Хочу первые 5 результатов: SELECT * FROM table WHERE x BETWEEN -1000,1000 ORDER BY y Всего результатов порядка 5 тысяч. Размер таблицы порядка 500+ тысяч. Т.е селективность условия - порядка 1/100 Два наиболее вероятных плана: 1) Создать индекс по (y,x), использовать его для выборки по ORDER BY и фильтровать BETWEEN 2) Создать индекс по (x,y), использовать его для выборки по BETWEEN, отсортировать по ORDER BY с хинтом FIRST_ROWS и получить первые 5 результатов В первом случае фильтрация отбрасывает ~99 рядов из 100, во втором - совершенно не улыбает сортировка 5 тысяч, если нужно только 5. Хотелось бы получить план, который выберет сразу то, что нужно. P.S В реальном приложении аргументы BETWEEN сильно меняются. Кэширование не особо применимо, а запрос выполняется достаточно часто, чтобы оптимизация стала необходимой. P.P.S Хотелось бы решение на уровне проектирования БД, а не "как настроить RDBMS". Может, GIST поможет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2005, 13:01 |
|
||
|
Нужен быстрый способ выполнения запроса
|
|||
|---|---|---|---|
|
#18+
1.А планы показать слабо? 2.LIMIT-а в запросе я тоже не увидел 3."В реальном приложении аргументы сильно меняются". Юзер может задать весь диапазон? Тогда о какой селективности может идти речь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2005, 13:11 |
|
||
|
Нужен быстрый способ выполнения запроса
|
|||
|---|---|---|---|
|
#18+
1) это ничего не изменит, я их расшифровки запостил специально. 2) что-то непонятно в формулировке? Хинт можно убрать ораклячий ;)) 3) да, может задать весь, а может BETWEEN -1001, 1002 и т п Я так в среднем указал селективность. Пожалуста, не надо придираться к условию, я постарался сделать его максимально понятным. Это именно та задача, которую нужно оптимизировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2005, 13:30 |
|
||
|
Нужен быстрый способ выполнения запроса
|
|||
|---|---|---|---|
|
#18+
Ilia KAntorХочу первые 5 результатов: SELECT * FROM table WHERE x BETWEEN -1000,1000 ORDER BY y Всего результатов порядка 5 тысяч. Размер таблицы порядка 500+ тысяч. Т.е селективность условия - порядка 1/100 Два наиболее вероятных плана: 1) Создать индекс по (y,x), использовать его для выборки по ORDER BY и фильтровать BETWEEN 2) Создать индекс по (x,y), использовать его для выборки по BETWEEN, отсортировать по ORDER BY с хинтом FIRST_ROWS и получить первые 5 результатов В первом случае фильтрация отбрасывает ~99 рядов из 100, во втором - совершенно не улыбает сортировка 5 тысяч, если нужно только 5. Хотелось бы получить план, который выберет сразу то, что нужно. P.S В реальном приложении аргументы BETWEEN сильно меняются. Кэширование не особо применимо, а запрос выполняется достаточно часто, чтобы оптимизация стала необходимой. P.P.S Хотелось бы решение на уровне проектирования БД, а не "как настроить RDBMS". Может, GIST поможет ? Как вариант: Код: plaintext 1. Код: plaintext 1. 2. 3. Мне кажется, что нужно создать индекс по x, и по (x,y) (для запросов с узким диапазоном по х) и/или по (y) (для случая бездиапазонного запроса). СУБД может считать иначе. На сколько я понял документацию, то GIST не поможет, если данные x и y - целые числа (integer). Для этих типов GIST создан для использования в многоколоночных индексах, а обычный btree быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2005, 14:00 |
|
||
|
Нужен быстрый способ выполнения запроса
|
|||
|---|---|---|---|
|
#18+
Да, запрос именно такой. SELECT * FROM table WHERE x BETWEEN -1000,1000 ORDER BY y LIMIT 5 LIMIT действительно учитывается оптимизатором для выбора между планами 1 и 2 (описанными выше). Таблица самая что ни на есть реальная существует. Все данные реальны. Спасибо за совет. Все-таки хотелось бы по сути вопроса.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2005, 14:17 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=33403381&tid=2006841]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
132ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 284ms |
| total: | 499ms |

| 0 / 0 |
