Вопрос к спецам по базам данных

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
ura
Житель
Сообщения: 915
Зарегистрирован: 09 мар 2003, 22:46

Вопрос к спецам по базам данных

Сообщение ura »

Если я заливаю данные в таблицу в которой записи не должны повторяться. Уникальность записи определяется 8-ю колонками. Что будет эффективнее в смысле производительнсти - создать unique constraint по этим восьми колонкам или сделать дополнительное поле в котором хранить уникальный hash code построенный по этим колонкам? Hash колонка будет строка символов на 30.
Аватара пользователя
CdR
Графоман
Сообщения: 11245
Зарегистрирован: 11 окт 2004, 19:27
Откуда: Европа, центр, за углом направо.

Re: Вопрос к спецам по базам данных

Сообщение CdR »

думаю, что если не учитывать время на построение hash, то это буде быстрее.
Хотя... unique constraint, собственно, делает примерно то же самое. Выигрыш можно получить, в методе построения hash c учётом специфики данных.
Я бы просто попробовал сравнить на какой-то тестовой базе с конкретным движком DB.
Аватара пользователя
pastor
Завсегдатай
Сообщения: 418
Зарегистрирован: 21 июн 2006, 01:09
Откуда: UA (2:4623) > Vancouver

Re: Вопрос к спецам по базам данных

Сообщение pastor »

мне почему-то кажется, что движок базы шустрее будет обрабатывать constraint нежели считать/сверять хэш при insert/update
зачем изобретать велосипед?
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: Вопрос к спецам по базам данных

Сообщение папа Карло »

ura писал(а):Если я заливаю данные в таблицу в которой записи не должны повторяться. Уникальность записи определяется 8-ю колонками. Что будет эффективнее в смысле производительнсти - создать unique constraint по этим восьми колонкам или сделать дополнительное поле в котором хранить уникальный hash code построенный по этим колонкам? Hash колонка будет строка символов на 30.
зависит от многих факторов:

- тип базы
- сколько записей уже в таблице
- сколько заливаешь за раз
- как частно
- как именно заливаешь

?
ura
Житель
Сообщения: 915
Зарегистрирован: 09 мар 2003, 22:46

Re: Вопрос к спецам по базам данных

Сообщение ura »

Движок Oracle 10g (базируется на HP-UX сервере).
Количество записей в этой таблице
20тыс в день и история должна храниться год. Интенсивная работа проводится в основном с новыми записями - неделя - две. Полей в таблице 15.

Констрейн по 8 полям по идее повлечет индексирование этих полей, но поскольку они не яволяются ключевыми при поиске данных я и сомневаюсь в эффективности. Хеш - это просто конкатенация строк, 100тыс хеш кодов создается меньше чем за полсекунды.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: Вопрос к спецам по базам данных

Сообщение папа Карло »

20к записей в неделю-две... должно бьть пофиг... слишком маленький объям чтобы о чем то говорить... если надо совсем быстро вынимать, то заведи хеш как сам говоришь на основе чексама или типа того... будешь потом кверить быстро...
не местный
Пользователь
Сообщения: 110
Зарегистрирован: 20 фев 2003, 07:17
Откуда: оттуда

Re: Вопрос к спецам по базам данных

Сообщение не местный »

ura писал(а):
Констрейн по 8 полям по идее повлечет индексирование этих полей, но поскольку они не яволяются ключевыми при поиске данных я и сомневаюсь в эффективности.
Сомневаюсь я, что из 8 полей, составляющих уникальный ключ, ни одно не используется как условие выборки. Все равно будет индекс, построенный по искусственному "ключу" - по сути просто дублирование данных. Так что не выдумывай сложностей, пусть движок базы занимается своими прямыми обязанностями. Особенно учитывая мизерное количество новых записей.
ura
Житель
Сообщения: 915
Зарегистрирован: 09 мар 2003, 22:46

Re: Вопрос к спецам по базам данных

Сообщение ura »

Понятно, спасибо.
Т.е. если количество записей будет не мизерным а большим, или количество полей определяющих уникальность записи удвоится, то такая операция имела бы смысл?
Пока что борьба идет над минимизацией времени добавления записей. Опыт показывает, что самый быстрый способ это не добавление по одной записи, а сваливание всего нового хозяйства во временные таблицы и потом одним красивым инсертом в таблицы самой базы. Но поскольку времени на переделки особенно нет, надо по крайней мере обеспечить приемлемую производительность. А то когда смотришь в ТЗ а там написано - обеспечить 1000 записей за 2 секунды, смех да и только.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: Вопрос к спецам по базам данных

Сообщение папа Карло »

ura писал(а):Понятно, спасибо.
Т.е. если количество записей будет не мизерным а большим, или количество полей определяющих уникальность записи удвоится, то такая операция имела бы смысл?
Пока что борьба идет над минимизацией времени добавления записей. Опыт показывает, что самый быстрый способ это не добавление по одной записи, а сваливание всего нового хозяйства во временные таблицы и потом одним красивым инсертом в таблицы самой базы. Но поскольку времени на переделки особенно нет, надо по крайней мере обеспечить приемлемую производительность. А то когда смотришь в ТЗ а там написано - обеспечить 1000 записей за 2 секунды, смех да и только.
у оракла чего bcp нету, чтобы сразу лить в саму таблицу?
ura
Житель
Сообщения: 915
Зарегистрирован: 09 мар 2003, 22:46

Re: Вопрос к спецам по базам данных

Сообщение ura »

Данные приходят как XML, лить надо сразу в несколько таблиц. Пока что заливаем по одной записи в цикле.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: Вопрос к спецам по базам данных

Сообщение папа Карло »

ura писал(а):Данные приходят как XML, лить надо сразу в несколько таблиц. Пока что заливаем по одной записи в цикле.
препроцесьте на апликейшен боксе, а потом если позволят "целостность" (например грузате когда система в оффлайне) гразите сразу целеком.... а не по одной записи.
не местный
Пользователь
Сообщения: 110
Зарегистрирован: 20 фев 2003, 07:17
Откуда: оттуда

Re: Вопрос к спецам по базам данных

Сообщение не местный »

ura писал(а):Понятно, спасибо.
Т.е. если количество записей будет не мизерным а большим, или количество полей определяющих уникальность записи удвоится, то такая операция имела бы смысл?
Думаю, что все равно не имела бы.

На самом деле типичная задача: найти оптимальное соотношение производительности при добавлении записей и актуальности запросов. Если запросы терпят данные, к примеру, пятиминутной давности, то добавление следует производить в промежуточную таблицу без каких-либо индексов в режиме APPEND, и периодически выбирать из нее уникальные записи и массово добавлять в главную таблицу. Если же на выходе нужны самые свежие данные и задержка в 5 минут неприемлема, то, может, уникальность не так уж нужна? В таком случае надо добавлять данные в главную таблицу, но убить все индексы, за исключеним минимально необходимых.

Если же требуется и актуальность, и уникальность - тогда можно попробовать параллельную вставку несколькими процессами (увеличив freelists), опять же APPEND, выделить для таблицы отдельный буфер, положить ее на отдельный RAID10, NOLOGGING, и так далее.

Вообще при настройке производительности стоит придерживаться логического подхода:
- определить критерий достаточной производительности (напр. 1000 записей за 2 секунды) - вдруг ничего настраивать и не надо?
- найти узкое место, скажем, трассируя процесс
- "расширить" это узкое место
- повторять до тех пор, пока критерий не будет достигнут.
Ответить