Имеет ли разделение значений varchar на основе размера усиление производительности?

dba.stackexchange https://dba.stackexchange.com/questions/1126

Вопрос

Я работаю с командой, которая пытается внедрить систему EAV. Они решили разделить таблицы атрибутов по типу, и они обсуждают, используя разные таблицы для различных диапазонов Varchar.

БЫВШИЙ:

  • Table_1 - до Varchar (10)
  • Table_2 - varchar (11) to varchar (500)
  • Table_3 - varchar (501) до varchar (max)

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

Знаете ли вы, если бы это будет иметь какую -либо прибыль в производительности, и будет ли это стоить дополнительного кодирования / логики, которая понадобится?

Это было полезно?

Решение

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

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

Единственный способ быть уверенным, конечно, - это подготовить достаточно реалистичный большой набор данных и провести некоторые тесты на производительность по отношению к рассмотрению, которые вы рассматриваете. Но я очень сомневаюсь, что вы увидите какое -либо изменение, стоило бы дополнительной сложности. Если ваши данные могут быть разделены более логичными способами (то есть способами, подразумеваемыми вашей бизнес -логикой), я предлагаю вам изучить разделение данных, особенно если вы можете разделить разделы на разные диски. Всякий раз, когда вы обнаруживаете, что размышляете о потенциально сложной оптимизации (включая разделение), всегда возвращайтесь и пересмотрите вашу общую структуру данных и убедитесь, что она не работает против вашей бизнес -логики, и проверьте ваше оборудование, чтобы получить нагрузку, которую вы ожидаете - хотя она не работает. Гарантированно, что вы, вероятно, найдете гораздо более значительный успех, если изучать эти основные области.

Другие советы

У вас вообще нет успеха.

Быстрые мысли, совсем не является исчерпывающим анализом:

  • В какой -то момент вам нужно будет объединить их, чтобы получить одно представление, и тогда все становится варчар (максимум)
  • Как вы решаете длину заранее?
  • Индексация для поиска значений? Вы не можете индексировать> 900 байтов
  • Раскочить свои «уникальные» ограничения в EAV было бы достаточно плохим, без разделения на несколько таблиц

Ищу EAV Anti Pattern: Есть несколько статей о том, как избежать EAV

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

Напомните им, что первое правило оптимизации является профилирование, так что, как сказал Дэвид Спиллетт, до тех пор, пока у вас не будет пары сотен миллионов рядов в EAV (учитывая, что большинство сущностей, о которых я знаю, не менее 15 атрибутов en-toto, так что вы получите только как Несколько десятков миллионов сущностей), а затем профиль, вы не можете знать, что это окажет какое -либо влияние.

Я собираюсь пойти с «нет, это не принесет пользы, как они думают, и что лучшее разделение, вероятно, будет чем -то по порядку 50 Chars и 100 Chars, а не 10 и 500. Но это просто предположение.


Но обратите внимание, что он будет иметь эффект, который они хотят в том, что он позволит лучшую производительность индекса (все разделения данных должны обеспечить лучшую производительность индексации по сравнению с невозглашением как общее правило)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top