2010-08-09 7 views
3

У меня есть большая база данных SQL Server с примерно 40 столбцами и сотнями миллионов строк.Оптимизация запросов - равенство VARCHAR vs Числовое равенство

Эта таблица должна быть свободной в схеме, поэтому у меня есть много столбцов как VARCHAR (MAX), даже если это может быть BIGINT, DATETIME, INT и т. Д. Это влияет на запросы времени/эффективности? например будет

SELECT TOP 100 * FROM CustomerId = 34343 

быстрее, чем

SELECT TOP 100 * FROM CustomerId = '34343' 

? Если да, то насколько быстрее?

А что, если я использую VARCHAR (MAX) вместо фиксированной длины VARCHAR .. А как насчет других БД, таких как mySQL и т. Д. В этом отношении?

+2

Я содрогаюсь от мысли, что таблица должна быть свободной в схеме. Это ошибка размеров мамонта. Гибкость - производительность - выберите один. Я гарантирую, что ваши пользователи хотят производительности больше, чем гибкая схема. Сохраняйте гибкость для редких случаев, не являющихся важной частью вашего дизайна системы. Недостаточно для использования varchar для чисел, что означает, что вам придется преобразовать их обратно в число, чтобы делать какие-либо расчеты отчетности (и у вас будет плохая целостность данных, как в значительной степени гарантия), но использование varchar для дат еще хуже. Если вам не нравится пытаться интерпретировать, как обращаться с 02/30/2010. – HLGEM

+1

Вы не говорите, что используете таблицу EAV, но в этой статье может указывать на то, почему свободные схемы - плохой дизайн - вы хотите получить данные назад и запросить этот беспорядок: http: //www.simple -talk.com/opinion/opinion-pieces/bad-carma/ – HLGEM

+0

На самом деле мы иногда получаем данные об мусоре, и нам нужно регистрировать это. Таким образом, мы могли бы получить customerID = 568d4, который не будет регистрироваться, если у меня есть clientId как числовой. мы пытаемся выяснить что-то, хотя –

ответ

3

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

+0

ok ... Я надеялся на некоторый количественный отчет о влиянии, если у кого-то есть источник для этого .. спасибо! ~ –

2

Да, для сравнения можно использовать INT и VARCHAR (MAX). Сколько действительно сложно сказать, не измеряя.

Также - нет причин не использовать VARCHAR(MAX) - но только тогда, когда это необходимо и когда это имеет смысл!

См:

для некоторых хороших причин, почему вы должны не просто сделать все VARCHAR (MAX) - просто потому, что вы могли бы .. ..

1

А что, если я использую VARC HAR (MAX) вместо фиксированной длины VARCHAR .. И что о других БД, таких как mySQL и т. Д. В в этом отношении?

  • PostgreSQL рассматривает VARCHAR(n), как если бы это было TEXT CHECK(LENGTH(Column) <= n). Нет никакого преимущества в производительности для указания максимальной длины.
  • SQLite полностью игнорирует ограничения длины на VARCHAR столбцы.
  • MS SQL Server, однако, не позволяет создавать индексы на столбцах VARCHAR(MAX), что снижает производительность.
Смежные вопросы