одна таблица против нескольких таблиц для миллионов записей

Вот сценарий, старая база данных имеет такой дизайн

dbo.Table1998
dbo.Table1999
dbo.Table2000
dbo.table2001
...
dbo.table2011

и я объединил все данные с 1998 по 2011 год в эту таблицу dbo.TableAllYears

теперь они оба проиндексированы по «номеру приложения» и имеют одинаковое количество столбцов (на самом деле 56 столбцов).

теперь, когда я попытался

select * from Table1998

а также

select * from TableAllYears where Year=1998 

первый запрос имеет 139669 строк @ 13 секунд, а второй запрос имеет такое же количество строк, но @ 30 секунд

так что для вас, ребята, я просто что-то упустил или несколько таблиц лучше, чем одна таблица?


person Leary    schedule 15.04.2011    source источник
comment
не могли бы вы сказать нам, какой сервер базы данных вы используете? и версия может дать вам хороший ответ. Для начала вы можете разбить таблицу по годам или месяцам и, возможно, добавить некластеризованный индекс для типов запросов, которые вы хотите выполнить. Для SQL Server начните здесь   -  person Sanjeevakumar Hiremath    schedule 15.04.2011
comment
@ Sanjeevakumar - извините за поздний ответ, я не заметил вашего комментария...   -  person Leary    schedule 15.04.2011
comment
вы смотрели на разбиение и индексацию?   -  person Sanjeevakumar Hiremath    schedule 15.04.2011
comment
@Sanjeevakumar - я уже создал индексы ... но сегодня я собираюсь заняться разбиением ... хе-хе-хе ... я вернусь к этому после того, как закончу с этим, и посмотрю, как производительность   -  person Leary    schedule 18.04.2011


Ответы (4)


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

person Achinth Gurkhi    schedule 15.04.2011

Попробуйте удалить индекс для каждого из столбцов, в которых вы ищете (предложение where). Это должно значительно ускорить запросы.

Итак, в этом случае добавьте новый индекс для поля Year.

person Lynn Crumbling    schedule 15.04.2011
comment
Можете ли вы привести пример, для которого это быстрее? - person Lynn Crumbling; 15.04.2011
comment
выберите * из Table1998 = 7 секунд @ 139669 строк и выберите * из TableAllYears, где Year = 1998 = 13 секунд @ 139669 строк - person Leary; 15.04.2011

Я считаю, что вы должны использовать одну таблицу. Неизбежно вам потребуется запрашивать данные за несколько лет, и разделение их на несколько таблиц является проблемой. Вполне возможно оптимизировать ваш запрос и структуру таблицы так, чтобы вы могли иметь много миллионов строк в таблице и при этом иметь отличную производительность. Убедитесь, что ваш столбец года проиндексирован и включен в ваши запросы. Если вы действительно столкнулись с ограничениями по размеру данных, вы можете использовать функцию секционирования в MySQL 5, которая позволяет хранить данные таблицы в нескольких файлах, как если бы это было несколько таблиц, при этом создавая видимость одной таблицы.

Независимо от этого, 140 000 строк — это ничто, и, скорее всего, преждевременная оптимизация для разделения их на несколько таблиц и даже серьезное снижение производительности, если вам нужно запрашивать данные за несколько лет.

person squawknull    schedule 15.04.2011

Если вы ищете данные за 1998 год, то лучше иметь в одной таблице только данные за 1998 год. Это связано с тем, что базе данных не нужно «искать» записи, но она знает, что все записи в этой таблице относятся к 1998 году. Попробуйте добавить предложение «ГДЕ Год=1998» в таблицу Table1998, и вы должны получить чуть лучше сравнение.

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

person srkiNZ84    schedule 15.04.2011
comment
Ух ты! это было быстро... Я ожидал получить свои ответы, Том. - person Leary; 15.04.2011
comment
ВОТ ЭТО ДА! ты прав! когда я добавил условие, TableAllYears извлекается быстрее... - person Leary; 15.04.2011
comment
о, подождите, вы предпочли несколько столов... хммм... хорошо, 1 для нескольких и 0 для одиночных... - person Leary; 15.04.2011
comment
Да, без предложения WHERE базе данных не нужно фильтровать какие-либо записи, и она может просто возвращать их так быстро, как только может. В то время как с предложением WHERE он должен выяснить, где находятся возвращаемые записи, а затем приступить к их возврату. - person srkiNZ84; 15.04.2011
comment
Я поддерживал системы, в которых таблицы были разбиты по годам. Это делает невероятно болезненным выполнение запросов и отчетов в течение нескольких лет. Вы также должны синхронизировать схемы во всех таблицах. Наконец, становится сложнее реализовать новые годы без внесения изменений в код, чтобы условно определить, к какой таблице или таблицам следует обращаться. - person squawknull; 15.04.2011
comment
@squawknull - На самом деле, на это мне также указал один из моих коллег. я проверил это, и когда дело доходит до моих тестов (запросы на мои вопросы.) первый всегда был быстрее,... но, как вы упомянули, что, если пользователь запрашивает только номер документа без года... - person Leary; 15.04.2011
comment
Ни в одном из ваших запросов нет указанного выше номера документа. Но вам нужен индекс для года в TableAllYears, иначе производительность будет ужасной. У меня есть таблицы с сотнями миллионов строк в системах, которые я обслуживаю, и очень немногие из моих запросов занимают более 1 секунды. 140 000 строк — это ничто, фактически, 1 миллион строк — это ничто в современных базах данных. Должна быть какая-то другая настройка, которую вам нужно выполнить, например работа с индексами, или у вас невероятно низкая производительность дискового ввода-вывода. - person squawknull; 15.04.2011
comment
@squawknull - я тестирую это на своей локальной машине, возможно, как только я реализую это на сервере, я получу лучший результат. но базовый уровень должен быть в более низких спецификациях. но несколько таблиц имеют более быстрый результат..., может быть, я попробую разбить на разделы... - person Leary; 15.04.2011
comment
Вам действительно не нужно разбивать это количество строк. Какой сервер базы данных вы используете? Майскл? SQL-сервер? - person squawknull; 15.04.2011
comment
Вы создали индекс для столбца Year в TableAllYears? - person squawknull; 15.04.2011