Кластерные индексы по столбцам, не являющимся идентификаторами, для ускорения массовой вставки?

Мои два вопроса:

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

Чтобы уточнить, у меня есть база данных с парой очень больших (от 100 до 1000 миллионов строк) таблиц, содержащих данные компании. Обычно в такой таблице содержатся данные о 20-40 компаниях, каждая из которых представляет собой отдельный «кусок», отмеченный «CompanyIdentifier» (INT). Кроме того, в каждой компании около 20 отделов, каждый со своим собственным «подразделом», отмеченным «DepartmentIdentifier» (INT).

Часто бывает, что целый «кусок» или «подчанк» добавляется или удаляется из таблицы. Моя первая мысль заключалась в том, чтобы использовать секционирование таблиц для этих кусков, но, поскольку я использую SQL Server 2008 Standard Edition, я не имею на это права. Тем не менее, большинство запросов, которые у меня есть, выполняются для «фрагмента» или «фрагмента», а не для таблицы в целом.

Я работал над оптимизацией этих таблиц для следующих функций:

  1. Запросы, которые выполняются на подгруппах
  2. Запросы "сравнения", которые выполняются для таблицы в целом.
  3. Вставка / удаление больших объемов данных.

По 1) и 2) проблем не возникало. Я создал несколько индексов по ключевым полям (также содержащие CompanyIdentifier и DepartmentIdentifier, где это полезно), и запросы выполняются нормально.

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

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

Я, кажется, заметил, что добавление кластерного индекса, определенного в CompanyIdentifier + DepartmentIdentifier, ускоряет загрузку новых «фрагментов» в таблицу. Раньше я отказался от этой стратегии в пользу добавления кластеризованного индекса в столбец IDENTITY, поскольку в нескольких статьях мне указывалось, что кластеризованный индекс содержится во всех других индексах, и поэтому кластерный индекс должен быть как можно меньше. Но теперь я думаю о возрождении этой старой стратегии для ускорения вставок. На мой вопрос, будет ли это разумным, или у меня будут проблемы с производительностью в других областях? И действительно ли это ускорит мои вставки или это всего лишь мое воображение?

Я также не уверен, действительно ли нужен столбец IDENTITY в моем случае. Я хотел бы иметь возможность устанавливать отношения внешнего ключа с другими таблицами, но могу ли я также использовать для этого что-то вроде схемы CompanyIdentifier + DepartmentIdentifier + [uniquifier]? Или это должен быть фрагментированный номер IDENTITY для всей таблицы?

Большое спасибо за любые предложения или объяснения.


person littlegreen    schedule 17.09.2010    source источник
comment
Вы изучали разделенные представления, чтобы решить проблему с фрагментами, или они не подходят?   -  person Martin Smith    schedule 17.09.2010
comment
Я не думаю, что смогу использовать их в SQL Server Standard Edition.   -  person littlegreen    schedule 17.09.2010
comment
Да, они доступны в стандартной версии.   -  person Martin Smith    schedule 17.09.2010
comment
@Martin Smith: использование секционированных представлений, вероятно, означало бы разделить мои данные на несколько таблиц, по одной на каждый фрагмент, и объединить их с UNION ALL в представлении, верно? Я пробовал это, работает хорошо. Что-то вроде разбивки стола для бедняков.   -  person littlegreen    schedule 03.12.2010


Ответы (6)


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

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

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


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

person littlegreen    schedule 29.09.2010
comment
Совершенно верно. Посмотрите на только модель данных в ссылках в конце этот ответ. CI были разработаны для реляционных баз данных; обратите внимание на ключи. Особенно хорош для любого запроса диапазона; распределение данных (то, что вы называете фрагментированием; вставка распределения нагрузки; самообрезка на уровне страницы и экстента. Единственное, что вам не следует делать, так это кластеризовать по монотонному ключу (противоположность его конструкции). Между CI есть нечто большее. и жесткий диск, но вы доберетесь до этого со временем. - person PerformanceDBA; 01.12.2010
comment
Спасибо. Тем не менее, CI на моих фрагментах не дает мне той производительности, которую я хочу, и после некоторого предварительного тестирования с SQL Server Enterprise Table Partitioning я склонен пойти на это - тем более, что это позволит мне удалять и вставлять фрагменты, не блокируя всю таблицу. длительное время. Вы бы последовали этому рассуждению или предложили бы что-нибудь другое? - person littlegreen; 02.12.2010

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

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

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

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

Разве ты не можешь попробовать это, поэкспериментировать? У меня аналогичная ситуация, когда у меня 4 миллиарда строк, постоянно вставляются новые (до 100 в секунду), таблица не имеет первичного ключа и кластерного индекса, поэтому предложения в этой теме мне тоже ОЧЕНЬ интересны.

person AlexanderMP    schedule 17.09.2010
comment
Кластерные индексы располагаются в физическом порядке только при нулевой фрагментации. Логический и физический порядок может отличаться. - person Martin Smith; 17.09.2010
comment
Спасибо за исправление. Обеспечиваю ли я отсутствие фрагментации с помощью этих методов? В любом случае, насколько плоха фрагментация? - person AlexanderMP; 17.09.2010
comment
Это бессмысленное исправление. Кластерные индексы по определению расположены в физическом порядке. То, что таблица может быть фрагментирована, - это другой уровень запроса, это не меняет определения. Сказать это так же глупо, как сказать, что если вы используете RAID5, тогда все фрагментировано, подразумевая: так что не беспокойтесь о каких-либо индексах. Если вы следите за PageChain, то все в порядке. Если вы читаете последовательно (что невозможно), он будет выглядеть фрагментированным. Если у вас нет CI, у вас есть куча. Прочтите об этом. Никогда не кластеризуйте IDENTITY, вы гарантируете точку доступа на последней (вставленной) странице. - person PerformanceDBA; 02.12.2010
comment
@PerformanceDBA - это вовсе не бессмысленное различие. Если люди считают, что кластеризованный индекс всегда находится в физическом порядке, они, вероятно, в конечном итоге получат совершенно неправильное представление о том, что происходит, когда данные вставляются в середину полного кластеризованного индекса. (На самом деле происходит разделение страницы и выделение новой страницы, которое может быть совершенно в другой степени.) Уровень фрагментации кластерного индекса очень важен для производительности (в частности, для сканирования диапазона). - person Martin Smith; 03.12.2010
comment
@ Мартин (оба). 1) Да, я в курсе. Так что используйте FILLFACTOR и RESERVEPAGEGAP, вот для чего они нужны, для вкраплений INSERTS. А для монотической колонки ваш комментарий не имеет значения 2) CI находится в физическом порядке по определению; необходимо учитывать фрагментацию, но это другой уровень, он не меняет определение (глупо предполагать, что определение ложное только потому, что вы узнали о фрагментации; так же глупо, как говорить, что если вы используете RAID5, тогда все фрагментировано (верно) и, следовательно, CI фрагментирован (ложно)). - person PerformanceDBA; 06.12.2010
comment
3) Фрагментация цепочки страниц - это только один из видов фрагментации. Существует разница между идеальным физическим порядком из-за свежего воссоздания и CI, которая является случайной, и различными формами фрагментации из-за использования. Определение не меняется, и у вас нет права попробовать. 4) Вы используете две ручки SO? - person PerformanceDBA; 06.12.2010

Могу ли я использовать кластерные индексы для ускорения массовой вставки в большие таблицы?

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

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

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

person Denis Valeev    schedule 17.09.2010
comment
Вы не согласны с этим утверждением? Вставить строки в таблицу с кластеризованным индексом в качестве первичного ключа быстрее, чем вставить те же данные в кучу, которая имеет некластеризованный индекс в качестве первичного ключа. Это верно независимо от того, монотонно увеличивается первичный ключ или нет. - person Martin Smith; 17.09.2010
comment
Почему не я хочу, чтобы они физически заказывались в компании / отделе? Я добавляю только куски на основе этой комбинации, я не буду добавлять смешанные наборы (когда-либо). Поэтому, чтобы добавить их, мне нужно было бы прикоснуться только к одной физической части жесткого диска. Кроме того, у меня есть много запросов, которые выполняются только для уникального подмножества на основе этих столбцов. - person littlegreen; 17.09.2010
comment
@Martin Smith, @littlegreen Я говорю о хранилищах данных, где вам приходится иметь дело с миллионами записей, которые должны быть вставлены среди существующих данных, если в этой таблице есть кластерный индекс. И когда вы удаляете этот кластерный индекс, эти данные добавляются в конец таблицы, что, очевидно, происходит быстрее. - person Denis Valeev; 17.09.2010
comment
Значит, вы бы вообще удалили кластерный индекс, даже не в столбце IDENTITY? - person littlegreen; 17.09.2010
comment
@littlegreen Я бы сделал это, и существующий кластерный индекс действительно лишает смысла эту операцию массовой вставки. - person Denis Valeev; 17.09.2010
comment
Дб вопрос. Это неверно. Если вы вставляете большие объемы данных (массовое копирование); сначала опустите CI !!! и добавьте его после массовой загрузки. Да, CI всегда быстрее, чем Heap + NCI. Эээ, законы физики: 2 записи медленнее, чем 1 запись. - person PerformanceDBA; 01.12.2010
comment
@PDBA: На удаление и воссоздание CI у меня уходит около 4 часов, на вставку у меня уходит 10 минут. Как это соотносится с вашим аргументом в пользу первого? - person littlegreen; 02.12.2010
comment
@LG. Я не спорю, я утверждаю, что все эти вещи необходимо принимать во внимание; не 1 предмет отдельно; не существует универсального правильного и неправильного; только право для вашего конкретного контекста. Позвольте мне дать ответ вместо комментариев. - person PerformanceDBA; 02.12.2010

Взгляните на System.Data.SqlClient.SqlBulkCopy API. Учитывая ваши требования к записи значительного количества строк в базу данных и из нее, это может быть то, что вам нужно?

При массовом копировании данные передаются в таблицу за одну операцию, а затем выполняется однократная проверка индекса. Я использую его для копирования 500 000 строк в таблицу базы данных и из нее, и ее производительность на порядок выше, чем у любого другого метода, который я пробовал, если предположить, что ваше приложение может быть структурировано для использования API?

person Spence    schedule 29.09.2010
comment
Насколько мне известно, и SSIS, и операция BULK INSERT используют ту же технику, что и этот API. Я использую SSIS сейчас при чтении из файлов, а при копировании между таблицами я просто использую обычный SQL. Может ли этот API копировать между таблицами? - person littlegreen; 30.09.2010

Я немного поигрался с некоторыми вещами etl. Я прошел через jsut, регулярно вставляя в таблицу, затем удаляя и читая индексы до и после вставки, пробовал операторы слияния, затем, наконец, попробовал ssis. Продался на ссис. Буквально вчера мне удалось сократить процесс etl (~ 24 миллиона записей, ~ 6 ГБ) с ~ 1-1 1/2 часа на прогон до ~ 24 минут, просто позволив ssis обрабатывать вставки.

Я считаю, что с расширенными услугами вы сможете использовать ssis.

person DForck42    schedule 17.09.2010
comment
Насколько мне известно, SSIS не быстрее, чем выполнение операции BULK INSERT. - person littlegreen; 30.09.2010

(Учитывая, что вы уже выбрали ответ и дали себе баллы, это предоставляется как бесплатная услуга, благотворительная акция!)

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

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

  • Примечание: я использую термин MicroSofties для описания тех людей, которые верят в идею Гейтса, что любой неквалифицированный человек может управлять базой данных; и что MS все исправит. Это не является оскорблением, а скорее проявлением нежности из-за веры в магию и нарушения законов физики.

Кластерные индексы

Были разработаны для реляционных баз данных настоящими инженерами (Sybase, до того, как MS приобрела код), у которых больше мозгов, чем у всей MS вместе взятой. Реляционные базы данных имеют реляционные ключи, а не ключи Idiot. Это многоколоночные ключи, которые автоматически распределяют данные и, следовательно, вставляют нагрузку, например. постоянная вставка счетов-фактур для различных компаний (хотя и не в нашем случае с «частями»).

  • если у вас есть хорошие реляционные ключи, CI предоставляют запросы диапазона (ваши (1) и (2)) и другие преимущества, которых у NCI просто нет.

  • Начиная с Id столбцов, до моделирования и нормализации данных, это серьезно затрудняет процессы моделирования и нормализации.

  • Если у вас есть база данных Idiot, то у вас будет больше индексов, чем нет. Содержимое многих баз данных MS не является «реляционным», это обычно просто ненормализованные файловые системы с гораздо большим количеством индексов, чем было бы в нормализованной базе данных. Поэтому есть большой толчок, много «улучшений» MS, чтобы попытаться придать этим абортам немного скорости. Устраните симптом, но не приближайтесь к проблеме, вызвавшей этот симптом.

  • В SQL 2005 и снова в 2008 MS облажалась с CI, и в результате они стали лучше в некоторых отношениях, но хуже в других; универсальность КИ была потеряна.

  • Неправильно, что NCI несут CI (CI - это базовая единая структура хранения; NCI являются вторичными и зависят от CI; вот почему, когда вы повторно создаете CI, все NCIs автоматически воссоздан). NCI несут ключ CI на конечном уровне.

  • У Microsoft есть свои проблемы, которые меняются в основных выпусках (но не устраняются):

    • а в MS это делается неэффективно, поэтому размер индекса NCI велик; в корпоративных СУБД, когда это делается эффективно, это не рассматривается.

    • Поэтому в мире MS утверждение, что ключ CI должен быть как можно короче, верно лишь наполовину. Если вы понимаете, что учитывается размер NCI, и если вы готовы понести эти расходы, они вернутся для таблицы, которая работает очень быстро благодаря тщательно построенной CI, тогда это лучший вариант.

    • Распространенный совет, что CI должен быть столбцомIdiot, полностью и полностью неверен. Наихудший вариант для ключа CI - это монотонно возрастающее значение (IDENTITY, DATETIME и т. Д.). Зачем ? потому что вы гарантировали, что все одновременные вставки будут бороться за текущее место вставки, последнюю страницу в индексе.

    • Настоящая цель разделения (которое MS предоставила через 10 лет после поставщиков Enterprise) - распределить эту нагрузку. Конечно, тогда они должны предоставить метод распределения разделов, если угадайте что, не что иное, как реляционный ключ; но для начала, теперь ключ Idiot распределен по 32 или 64 разделам, обеспечивая лучший параллелизм.

  • CI должен быть Уникальным. Реляционные базы данных требуют уникальных ключей, так что это не проблема.

    • Но для любителей, которые вливали нереляционное содержимое в базу данных, если они не знают этого правила, но знают, что CI распространяет данные (небольшое знание - опасная вещь), они хранят свой Idiot ключ в NCI. (хорошо), но они создают CI на почти, но не совсем уникальном ключе. Смертельно опасен. КИ должны быть уникальными, это требование дизайна. Повторяющиеся (помните, что мы говорим здесь о Ключе CI) строки находятся вне страницы, они находятся на страницах переполнения и на (тогда) последней странице; и представляют собой метод плохой фрагментации цепочки страниц.

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

      • Онлайн-руководство MS с их красивые картинки (не технические диаграммы) говорят нам о том, что в 2008 году они заменили (заменили одну на другую) страницы переполнения очаровательным «Уникализатором».

      • Это полностью удовлетворяет MicroSofties. Неуникальные КЭ - не проблема. Это обрабатывается магией. Дело закрыто.

      • Но в утверждениях нет логики и полноты, и квалифицированные специалисты зададут очевидные вопросы: где находится этот «Уникификатор»? В каждой строке или только в строках, нуждающихся в «Уникальности». DBBC PAGE показывает, что это есть в каждой строке. Таким образом, MS только что добавила 4-байтовый секретный столбец (включая служебные данные) в каждую строку вместо нескольких страниц переполнения только для неуникальных строк. Это инженерная идея MS.

      • Конец обновления

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

  • Следовательно, без изменений с самого начала (1984 г.), лучшим кандидатом на роль CI является уникальный многоколоночный реляционный ключ (я не могу сказать, что ваш ключ точно, но он определенно выглядит так).

  • И вставьте любые монотонно увеличивающиеся ключи (IDENTITY, DATETIME) в NCI.

  • Помните также, что CI - это единственная структура хранения, которая исключает (в противном случае) кучу; B-дерево CI связано со строками на уровне листа; запись уровня листа является строкой. Это гарантирует на одно чтение меньше при каждом доступе.

    • So it is not possible, that a NCI+Heap can be faster than a CI. Anther common myth in the MS world that defies the laws of physics: navigating a B-Tree and writing to the one place you are already in, has got to be faster than additionally writing the row to a separate storage structure. But MicroSofties do believe in magic, they've suspended the laws of physics.
      .
  • Есть много других функций, которые вам нужно изучить и использовать, я упомяну по крайней мере FILLFACTOR и RESERVEPAGEGAP, чтобы дать этому посту некоторую полноту. Не используйте эти функции, пока не разберетесь с ними. Все характеристики производительности имеют цену, которую вам необходимо понять и принять.

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

  • И прочтите сайт SO для кластерных индексов, но имейте в виду все вышеперечисленное, особенно. первые два пп.

Ваш конкретный случай

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

  • CompanyIdentifier + DepartmentIdentifier + [uniquiefier] - это именно то, о чем я говорю. Теперь обратите внимание, что они уже являются INT и очень быстры, поэтому очень глупо добавить NUMERIC (10,0) Idiot Key. Для обеспечения уникальности используйте 1- или 2-байтовый столбец.

  • Если вы сделаете это правильно, вам может не понадобиться лицензия на раздел.

  • CompanyIdentifier + DepartmentIdentifier + [uniquifier] - идеальный кандидат (ничего не зная о вашей базе данных, кроме той, которую вы опубликовали) для CI в контексте, когда вы периодически выполняете массовое удаление / вставку. Подробно выше.

    • Contrary to what others have stated, this is a good thing, and does not fragment the CI. Lets' say ou have 20 Companies, and you delete 1, which constitutes 5% of the data. That entire PageChain which was reasonably contiguous, is now relegated to the FreePageChain, contiguous and intact. To be precise, you have a single point of fragmentation, but not fragmentation in the sense of the normal use of the word. And guess what, if you turn around and perform a mass insert, where do you think that data will go ? That's right the exact same physical location as the Deleted rows. And the FreePageChain moves to the PageChain, extent and page at a time.
      .
  • но тревожит то, что вы не знали о том, что CI востребован, чтобы быть уникальным. Печально, что MicroSofties пишут чушь, но не почему / на чем основано каждое упрощенное правило; не основная информация. Точный признак неуникальных CI состоит в том, что таблица будет работать очень быстро сразу после DROP / CREATE CI, а затем со временем замедлится. Хороший Unique CI будет поддерживать свою скорость, и потребуется год, чтобы замедлиться (2 года для моих больших активных банковских БД).

  • 4 часа - это очень много времени для 1 миллиарда строк (я могу воссоздать CI для 16 миллиардов строк с ключом из 6 столбцов за 3 минуты на корпоративной платформе). Но в любом случае это означает, что вы должны запланировать это как регулярное еженедельное обслуживание или обслуживание по требованию.

  • почему вы не используете опцию WITH SORTED_DATA? Разве ваши данные не были отсортированы перед падением? Эта опция перезаписывает нелистовые страницы CI, но не листовые страницы (содержащие строки). Он может это сделать, только если уверен, что данные были отсортированы. Если не использовать эту опцию, каждая страница перезаписывается в физическом порядке.

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

person PerformanceDBA    schedule 02.12.2010
comment
+1 за вложенную энергию, +1 за предложение уникального CI, +1 за WITH_SORTED_DATA, -1 за слишком много оффтопической информации, -1 за неуважение к Спенсу, -1 за «MicroSofties» и -1 за раздражающее использование «Идиот» для столбцов Id. Вы действительно меня злите, потому что даете полезную информацию, но она сопровождается огромным пакетом оскорблений. Я не могу с хорошим сознанием проголосовать за, принять или даже использовать этот ответ, потому что в этом случае я буду поощрять ваше поведение. Я пометил это как оскорбление, так что пусть оперативники разберутся с этим. - person littlegreen; 02.12.2010
comment
в качестве примечания, монотонно увеличивающиеся значения - многие системы интенсивно используют запросы, а не вставки. В таких случаях наличие CI, отражающего наиболее часто используемый мне диапазон (который обычно представляет собой диапазон идентификаторов строк или временной диапазон) с оптимальной производительностью, является идеальным. - person Marc Gravell; 02.12.2010
comment
@Marc. Я работаю с обоими. Это неверно. Да, системам, интенсивно использующим запросы, нужны запросы диапазона, но с реальными реляционными ключами, а не с идентификаторами. Временные ряды всегда следует обрабатывать как дочерние по отношению к родительскому элементу (у которого есть реальные ключи). Id принудительно использует ненужные соединения, которые можно устранить. если вы обрабатываете временные ряды и идентификаторы как ведущий или единственный столбец таблицы, у вас есть куча данных, а не база данных; так что убедитесь, что он очень медленный, и вам нужны все улучшения, которые вы можете получить. Но если вы вернетесь и решите причинную проблему (ключи Idiot вместо реляционных ключей), вы получите гораздо большую производительность. - person PerformanceDBA; 02.12.2010
comment
@littlegreen: Я вставил обновление по вашему другому вопросу и добавил пару абзацев в конце. - person PerformanceDBA; 06.12.2010
comment
Вы не получите бонусные баллы, если примете свой собственный ответ, просто к вашему сведению. Люди также могут изменить принятый ответ, если вы предоставите лучший. - person Bill the Lizard; 10.01.2011