Может внешняя производительность запросов вреда ключей

Я предпочитаю использовать функциональное программирование для сохранения меня повторенная работа путем создания более абстрактной версии и затем использования этого вместо этого. Позвольте мне дать пример. В Java я часто создаю карты записывать структуры, и таким образом писать getOrCreate структуры.

SomeKindOfRecord<T> getOrCreate(T thing) { 
    if(localMap.contains(t)) { return localMap.get(t); }
    SomeKindOfRecord<T> record = new SomeKindOfRecord<T>(t);
    localMap = localMap.put(t,record);
    return record; 
}

Это происходит очень часто. Теперь, на функциональном языке я мог записать

RT<T> getOrCreate(T thing, 
                  Function<RT<T>> thingConstructor, 
                  Map<T,RT<T>> localMap) {
    if(localMap.contains(t)) { return localMap.get(t); }
    RT<T> record = thingConstructor(t);
    localMap = localMap.put(t,record);
    return record; 
}

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

getOrCreate = myLib.getOrCreate(*,
                                SomeKindOfRecord<T>.constructor(<T>), 
                                localMap);

(где * своего рода "отпуск этот параметр открытая" нотация, которая является своего рода приправлением карри)

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

18
задан Community 23 May 2017 в 12:09
поделиться

9 ответов

I ' m предполагая, что для запросов INSERT ограничения - включая ограничения внешнего ключа - несколько снизят производительность. База данных должна проверить, что все, что вы сказали ей вставить, это то, что позволяют ей вставлять ваши ограничения.

Для запросов SELECT ограничения внешнего ключа не должны вносить никаких изменений в производительность.

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

ограничения внешнего ключа не должны влиять на производительность.

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

ограничения внешнего ключа не должны влиять на производительность.

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

17
ответ дан 30 November 2019 в 06:05
поделиться

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

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

21
ответ дан 30 November 2019 в 06:05
поделиться

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

Вам нужно будет проиндексировать их, чтобы повысить производительность по избранным запросам.

4
ответ дан 30 November 2019 в 06:05
поделиться

Если внешние ключи оказали какое-либо влияние таким образом, это было бы на INSERTS. База данных выполняет ссылочную проверку внешних ключей при создании / изменении записей, а не при выборе.

2
ответ дан 30 November 2019 в 06:05
поделиться

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

Внешние ключи могут помочь оптимизатору запросов получить лучший запрос планы для данного запроса.

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

2
ответ дан 30 November 2019 в 06:05
поделиться

Я считаю, что в упомянутом сообщении указано, что добавление индекса в поля FK улучшенная производительность, а не просто то, что отношение FK улучшило производительность. Наличие FK в таблице не должно иметь никакого влияния на запрос SELECT, если не выполняются операции JOIN, после чего отношение FK И индекс для полей FK повысит производительность.

0
ответ дан 30 November 2019 в 06:05
поделиться

Если вы обеспечиваете ссылочную целостность, операции INSERT и UPDATE, влияющие на поле FK, будут выполняться медленнее. Однако обычно не о чем беспокоиться, тем более, что многие БД на 80% читают / 20% пишут. Это также цена, которую стоит заплатить.

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

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

0
ответ дан 30 November 2019 в 06:05
поделиться

Теоретически да: запись данных необходима для проверки ограничений.

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

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

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

Мой 2c: Никогда не жертвуйте ограничениями корректности ради некоторых неуловимых целей производительности. В очень редком случае, когда ограничения действительно являются проблемой, есть измерения, чтобы показать, что ' В этом случае, и как говорится: если вы спросите, сколько это стоит, вы не можете себе этого позволить. Если вам нужно спросить, могут ли ограничения быть проблемой, вы не можете их удалить (без обид).

5
ответ дан 30 November 2019 в 06:05
поделиться

Согласно Стивенсу Расширенное программирование в среде UNIX глава 13, это процедура для создания хорошо работающего демона Unix:

  1. Форк и родительский выход. Это заставляет оболочку или сценарий загрузки думать, что команда выполнена. Также гарантируется, что дочерний процесс не будет лидером группы процессов (предварительное условие для setsid next)
  2. Вызов setsid для создания нового сеанса.
    1. Процесс становится лидером сеанса нового сеанса
    2. Процесс становится лидером группы процессов для новой группы процессов
    3. У процесса нет управляющего терминала
  3. Необязательно снова выполнить ответвление и иметь родительский выход. Это гарантирует, что демон не является лидером сеанса и не может получить управляющий терминал (в SVR4)
  4. Измените текущий рабочий каталог на / , чтобы не мешать монтированию и размонтированию
  5. Установить режим файла маска создания на 000, чтобы в дальнейшем разрешить создание файлов с любыми необходимыми разрешениями.
  6. Закройте ненужные файловые дескрипторы, унаследованные от родителя (в любом случае управляющего терминала нет): stdout , stderr и stdin .

В настоящее время существует файл для отслеживания PID, который активно используется сценариями загрузки дистрибутива Linux. Внешние ключи имеют секретное дополнительное преимущество, показывая вам, где именно вы, скорее всего, будете выполнять сложные JOIN, и у них есть очень часто используемые поля. Это значительно упрощает работу по индексации, и вы можете практически гарантировать, что все ваши поля FK должны быть проиндексированы. Это делает SELECT намного быстрее.

У внешних ключей есть секретное дополнительное преимущество, заключающееся в том, что они показывают вам, где именно вы, скорее всего, будете выполнять сложные JOIN, и имеют очень часто используемые поля. Это значительно упрощает работу по индексации, и вы можете практически гарантировать, что все ваши поля FK должны быть проиндексированы. Это делает SELECT намного быстрее.

4
ответ дан 30 November 2019 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: