указатель строки / записи в базе данных - PullRequest
2 голосов
/ 12 апреля 2010

Я не знаю правильных слов для того, о чем я пытаюсь выяснить, и поэтому мне трудно гуглить.

Я хочу знать, возможно ли с базами данных (независимыми от технологий, но было бы интересно узнать, возможно ли с Oracle, MySQL и Postgres) указывать на конкретные строки вместо повторного выполнения моего запроса.

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

Я понимаю, что в базах данных есть кэширование, но я хочу сохранить эти «указатели» в другом месте, где и как таковое кэширование в конечном итоге не решит эту проблему. Это просто индекс, и я сохраняю индекс и смотрю по нему? большинство моих текущих таблиц не имеют индексов, и я не хочу, чтобы снижение скорости происходило с индексами.

Так какой магический термин я пытался ввести в Google?

Приветствия

Ответы [ 4 ]

3 голосов
/ 12 апреля 2010

большинство моих текущих таблиц не имеют индексы и я не хочу скорость уменьшение, которое иногда приходит с индексы.

И вам также не нужно увеличение скорости, которое обычно происходит с индексами, но вы хотите вместо этого вручную свернуть сделанный на заказ псевдокэш?

Я здесь не скуп, это серьезный вопрос. Дизайнеры баз данных потратили много сил и энергии на оптимизацию своих продуктов. Разве не было бы разумнее узнать, как воспользоваться их усилиями, а не реализовывать некоторые основные функции?

3 голосов
/ 12 апреля 2010

В Oracle это называется ROWID. Он идентифицирует файл, номер блока и номер строки в этом блоке. Я не могу сказать, что то, что вы описываете, является хорошей идеей, но это может, по крайней мере, заставить вас начать смотреть в правильном направлении.

Проверьте здесь для получения дополнительной информации: http://www.orafaq.com/wiki/ROWID.

Кстати, «снижение скорости, которое идет с индексами», которого вы боитесь, уместно только в том случае, если вы выполняете больше операций вставки и обновления, чем чтения. Индексы только ускоряют чтение, поэтому, если коэффициент чтения высок, у вас может не быть проблемы, и индекс может быть вашим лучшим решением.

2 голосов
/ 12 апреля 2010

В общем, лучший способ справиться с такого рода требованиями - это использовать первичный ключ (или фактически любой удобный, компактный уникальный идентификатор) в качестве «указателя» и полагаться на индексированный поиск, который будет быстрым - что он обычно будет.

Вы можете использовать ROWID в большем количестве СУБД, чем просто в Oracle, но обычно это не рекомендуется по ряду причин. Если вы уступаете школе разработки баз данных «каждая таблица имеет столбец автоинкремента», вы можете записать значения столбца автоинкремента в качестве идентификаторов.

У вас должен быть хотя бы один индекс (почти) для всех ваших таблиц - этот индекс будет для первичного ключа. Исключением может быть таблица, которая настолько мала, что легко помещается в память, не будет обновляться и будет использоваться достаточно, чтобы ее нельзя было извлечь из памяти. Тогда индекс может быть отвлечением; однако такие таблицы, как правило, редко обновляются, поэтому индекс ничего не повредит, и оптимизатор проигнорирует его, если индекс не поможет (а может и не поможет).

У вас также могут быть вспомогательные индексы. В системе, где большая часть активности читает данные, вы можете захотеть ошибиться, если у вас будет больше индексов, чем меньше, потому что время доступа является наиболее критичным. Если ваша система требовала интенсивного обновления, вы бы использовали меньшее количество индексов, потому что с обновлением индексов при добавлении, удалении или обновлении данных связана стоимость. Очевидно, что вам нужно спроектировать индексы, чтобы они хорошо работали с запросами, которые фактически выполняют ваши пользователи (или ваши приложения).

0 голосов
/ 13 апреля 2010

Вас также могут заинтересовать курсоры . (Обратите внимание, что обсуждение индекса по-прежнему актуально для курсоров.)

Определение Википедии здесь.

...