Как Вы оптимизируете таблицы для определенных запросов?

Для вашей проблемы со словарями легче работать, чем со списками кортежей. В этом случае вы можете комбинировать сопоставления с помощью словарного понимания.

from operator import itemgetter

# create dictionary with all keys set to 0
allkeys = dict.fromkeys(map(itemgetter(0), list1), 0)

# for each year, combine dictionary mappings
dict1 = {k: {**allkeys, **dict(v)} for k, v in dict1.items()}

Вы можете, если хотите, преобразовать обратно в списки кортежей:

res = {k: list(v.items()) for k, v in dict1.items()}

Результат для опции вложенного словаря:

{2011: {'Debt collection': 5572,
  'Mortgage': 4483,
  'Credit reporting': 0,
  'Checking or savings account': 0,
  'Student loan': 431,
  'Credit card or prepaid card': 0,
  'Bank account or service': 0,
  'Credit card': 0,
  'Consumer Loan': 0},
 2012: {'Debt collection': 0,
  'Mortgage': 0,
  'Credit reporting': 0,
  'Checking or savings account': 0,
  'Student loan': 1632,
  'Credit card or prepaid card': 0,
  'Bank account or service': 0,
  'Credit card': 0,
  'Consumer Loan': 480,
  'Medical loan': 1632,
  'Prepaid card': 83}}
8
задан therealhoff 27 September 2008 в 18:31
поделиться

9 ответов

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

Первый вопрос спросить: "есть ли проблема производительности?"
Если нет никакой проблемы, то Вы сделаны. Это часто имеет место.Мило.

С другой стороны...

Определите частые запросы

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

Выбрать факторы оптимизации?

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

Типы изменений можно сделать?

Вы конкретно спрашиваете об оптимизации таблиц.
Вот некоторые вещи, которые можно искать:

  • Денормализация. Это объединяет несколько таблиц в одну более широкую таблицу, таким образом, в земельном участке Вашего запроса, присоединяющегося к нескольким таблицам вместе, можно просто считать одну таблицу. Это - очень общая и мощная техника. NB. Я советую сохранять исходные нормализованные таблицы и создавать денормализованную таблицу, кроме того - этот путь, Вы ничего не выбрасываете. Как Вы в курсе, это - другой вопрос. Вы могли бы использовать, включает базовые таблицы или периодически выполняет процесс обновления.
  • Нормализация. Это не часто считается процессом оптимизации, но это находится в 2 случаях:
    • обновления. Нормализация делает обновления намного быстрее, потому что каждое обновление является самым маленьким, это может быть (Вы обновляете самое маленькое - с точки зрения столбцов и строк - возможная таблица. Это - почти самое определение нормализации.
    • При запросах денормализованной таблицы для получения информации, которая существует на намного меньшем (меньше строк) таблица может вызывать проблему. В этом случае сохраните нормализованную таблицу, а также денормализованную (см. выше).
  • Горизонтальное разделение. Это означает делать таблицы меньшими путем помещения некоторых строк в другого, идентичную таблицу. Случай общего использования должен иметь все строки этого месяца в таблице ThisMonthSales и все более старые строки в таблице OldSales, где обе таблицы имеют идентичную схему. Если большинство запросов для недавних данных, эта стратегия может означать, что 99% всех запросов только смотрят на 1% данных - огромная победа производительности.
  • Вертикальное разделение. Это Прерывает поля от таблицы и помещает их в новую таблицу, к которой присоединяется назад к основной таблице первичный ключ. Это может быть полезно для очень широких таблиц (например, с десятками полей) и может возможно помочь, если таблицы являются малонаселенными.
  • Indeces. Я не уверен, покрывает ли Ваш quesion их, но существует много других ответов на ТАК относительно использования индексов. Хороший способ найти случай для индекса: найдите медленный запрос. посмотрите на план запросов и найдите сканирование таблицы. Индексные поля на той таблице, чтобы удалить сканирование таблицы. Я могу записать больше на этом при необходимости - оставляют комментарий.

Вам могло бы также понравиться мое сообщение на этом.

12
ответ дан 5 December 2019 в 12:15
поделиться

На это трудно ответить, не зная, о какой системе Вы говорите.

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

1
ответ дан 5 December 2019 в 12:15
поделиться

Ваш вопрос немного неопределенен. Какая платформа DB?

Если мы говорим о SQL Server:

  1. Используйте Динамические Представления управления. Используйте SQL Profiler. Установите SP2 и отчеты панели инструментов производительности.
  2. После определения самых дорогостоящих запросов (т.е. количество раз выполненные x стоят одного одного запроса), исследуйте их планы выполнения и посмотрите на размеры таблиц, включенных, и являются ли они преимущественно Read или Записью или смесью обоих.
  3. Если система находится под Вашим полным контролем (приложения. и DB) можно часто переписывать запросы, которые плохо формируются (вполне общее возникновение), такие так же глубокие связанные подзапросы, которые могут часто переписываться как полученные соединения таблицы с небольшой мыслью. Иначе Вы опции состоят в том, чтобы создать закрывающие некластерные индексы и гарантировать, что статистические данные усовершенствованы.
1
ответ дан 5 December 2019 в 12:15
поделиться
  1. Для MySQL существует функция, названная медленными запросами журнала

Остальное на основе того, какие данные Вы имеете и как это - установка.

0
ответ дан 5 December 2019 в 12:15
поделиться

В SQL-сервере можно использовать трассировку, чтобы узнать, как запрос работает. Используйте ctrl + k или l

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

Более конкретный вопрос определенно выберет Вас лучшие ответы.

0
ответ дан 5 December 2019 в 12:15
поделиться

Если Ваша таблица преимущественно читается, поместите кластерный индекс в таблицу.

0
ответ дан 5 December 2019 в 12:15
поделиться

Мой опыт с главным образом DB2 и поверхностным знанием Oracle в первые годы.

Если Ваш DBMS будет хорошо работать, то он будет иметь способность собрать статистику на определенных запросах и объяснить план, который он использовал для извлечения данных.

Например, если Вы имеете таблицу (x) с двумя столбцами (дата и diskusage) и только имеете индекс в дату, запрос:

select diskusage from x where date = '2008-01-01'

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

select date from x where diskusage > 90

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

Действительно интеллектуальный DBMS может также объяснить, что необходимо сделать для улучшения производительности (добавьте индекс на diskusage в этом случае).

Относительно того, как видеть, какие запросы выполняются, можно или собрать это из DBMS (если он позволяет его), или вынудите всех сделать их запросы через хранимые процедуры так, чтобы управление DBA, что запросы - это - их задание, поддерживая DB в рабочем состоянии эффективно.

0
ответ дан 5 December 2019 в 12:15
поделиться

1. Каковы шаблоны, которые Вы используете для определения частых запросов?

Зависит, на каком уровне Вы имеете дело с базой данных. Если Вы - DBA, или имеют доступ к инструментам, дб как Oracle позволяют Вам выполнять задания и генерировать статистику/отчеты за установленный промежуток времени. Если Вы - разработчик, пишущий приложение против дб, можно просто сделать профилирование производительности в рамках приложения.

2. Как Вы выбираете факторы оптимизации?

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

Будет им, обновил тонну и на том, какие поля обновления происходят? Это имеет столбцы с низкой кардинальностью?

Действительно ли это стоит индексировать? (таблицы, которые являются очень маленькими, могут быть замедлены, если получено доступ индексом),

Сколько обслуживания/головной боли стоит, чтобы иметь его, работает быстрее?

Отношение обновляет/вставляет по сравнению с запросами?

и т.д.

3. Каковы типы изменений, которые можно внести?

- При использовании Oracle усовершенствуйте статистику!=)

- Normalization/De-Normalization любой может улучшить производительность в зависимости от использования таблицы. Я почти всегда нормализую и затем только если я не могу никаким другим практическим способом делать запрос, быстрее денормализует. Хороший способ денормализовать для запросов и когда Ваша ситуация позволяет его, состоит в том, чтобы сохранить реальные таблицы нормализованными и составить денормализованную "таблицу" с осуществленным представлением.

- Индексируйте рассудительно. Слишком многие могут быть плохими на многих уровнях. Индексы BitMap являются большими в Oracle, пока Вы не обновляете столбец часто, и тот столбец имеет низкую кардинальность.

- Используя Индекс организовал таблицы.

- Разделенные и подразделенные таблицы и индексы

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

- Таблицы контакта в памяти, если соответствующий (получил доступ ко много и довольно маленький),

- Разделение устройства между индексом и файлами базы данных таблицы.

..... список продолжается.=)

Надежда это полезно для Вас.

0
ответ дан 5 December 2019 в 12:15
поделиться

индексы на PKs и FKs и одной вещи, которая всегда помогает РАЗДЕЛЕНИЮ...

0
ответ дан 5 December 2019 в 12:15
поделиться
Другие вопросы по тегам:

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