Каков Ваш подход для оптимизации больших таблиц (+1M строки) на SQL Server?

Нет, это нормально, и изменение в 0.9.0 и далее. Каратэ будет сканировать ВСЕ файлы.

Проверьте еще раз, он не будет выполнять то, что показано как <<skip>>, и они не появятся в отчете.

14
задан Edwin Jarvis 3 December 2008 в 16:25
поделиться

9 ответов

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

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

Индекс clusted удостоверяется, что кавычки от того же запаса остаются вместе, и вероятно заказанный по дате. Действительно ли эта вторая информация правдива?

Это логически верно - кластерный индекс определяет логическое упорядочивание записей на диске, который является всем, чем Вы должны быть обеспокоены. SQL Server может предшествовать издержкам сортировки в физическом блоке, но это будет все еще вести себя, как будто это сделало, таким образом, это не значительно. Запросы для одного запаса, вероятно, будут чтениями на 1 или 2 страницы в любом случае; и оптимизатор не извлекает выгоду очень из незаказанных данных в рамках чтения страницы.

Прямо сейчас с полумиллионом записей требуется приблизительно 200 мс для выбора 700 кавычек из определенного актива. Я полагаю, что это число станет выше, когда таблица растет.

Не обязательно значительно. Между скоростью размера и запроса таблицы нет линейного соотношения. Существует обычно намного больше соображений, которые более важны. Я не волновался бы об этом в диапазоне, который Вы описываете. Это - причина, которую Вы заинтересованы? 200 мс, казалось бы, мне были бы большими, достаточно получили бы Вас до такой степени, когда, Ваши таблицы загружаются, и можно начать делать реалистическое тестирование и получить намного лучшую идею реальной производительности.

Теперь для третьего подхода я думаю в, возможно, разделении таблицы в трех таблицах, каждом для определенного рынка (запасы, опции и вперед). Это, вероятно, сократит размер таблицы на 1/3. Теперь, это приблизится к справке, или она не имеет значения слишком много? Прямо сейчас таблица имеет 50 МБ размера, таким образом, это может подойти полностью к RAM без большой проблемы.

Нет! Этот вид оптимизации таким образом преждевременен, это является, вероятно, мертворожденным.

Другой подход использовал бы функцию раздела SQL Server.

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

Каков был бы другой хороший approachs для создания этого самым быстрым?

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

11
ответ дан 1 December 2019 в 09:13
поделиться

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

Как всегда первая остановка должна быть средством анализа профилировщика SQL и плана запросов. Спросите SQL Server, что это собирается сделать с запросами, которыми Вы интересуетесь. Я полагаю, что можно даже попросить, чтобы это предложило изменения, такие как дополнительные индексы.

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

10
ответ дан 1 December 2019 в 09:13
поделиться

Проверьте свой план выполнения по тому запросу сначала. Удостоверьтесь, что Ваши индексы используются. Я нашел это. Миллион записей не много. Для предоставления некоторой перспективы у нас была таблица материально-технических ресурсов с 30 миллионами строк в нем и нашим всем запросом, который присоединился к тоннам таблиц и сделал много вычислений, мог работать в под 200 мс. Мы нашли, что на четверке proc сервер на 64 бита, у нас мог быть signifcantly больше записей, таким образом, мы никогда не беспокоили partioning.

Можно использовать SQL Profier, чтобы видеть план выполнения или просто выполнить запрос от Studio управления SQL или Query Analyzer.

3
ответ дан 1 December 2019 в 09:13
поделиться

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

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

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

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

Но снова ключ этого является индексами, еще не смешивайте с разделением и материалом.. особенно с записями millon, это - ничто, у меня есть таблицы с 150 записями millon, и возвращающийся 40k определенные записи берет механизм приблизительно 1 500 мс...

3
ответ дан 1 December 2019 в 09:13
поделиться

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

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

1
ответ дан 1 December 2019 в 09:13
поделиться

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

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

1
ответ дан 1 December 2019 в 09:13
поделиться

другое решение состояло бы в том, чтобы составить историческую таблицу в течение каждого года, и поместить все это таблицы в историческую базу данных, заполнить все те который в и затем создать соответствующие индексы для них. После того как Вы сделаны с этим, Вы не должны будете касаться их никогда снова. Почему необходимо было бы продолжить вставлять данные? Запрашивать все те таблицы Вы просто "объединение все" их :p

Текущая таблица года должна очень отличаться от этого исторические таблицы. Поскольку, что я понял, Вы планируете вставить записи на движении?, я запланировал бы что-то другое как выполнение объемной вставки или чего-то подобного время от времени вдоль дня. Конечно, все это зависит от того, что Вы хотите сделать.

Проблемы здесь, кажется, находятся в дизайне. Я пошел бы для нового дизайна. Тот, который Вы имеете теперь, для какого я понимаю не подходящий.

0
ответ дан 1 December 2019 в 09:13
поделиться

План выполнения показывает, что использует довольно прекрасный кластерный индекс, но я забыл чрезвычайно важный факт, я все еще вставляю данные! Вставка, вероятно, блокирует таблицу слишком часто. Существует способ, которым мы видим это узкое место?

План выполнения не делает, кажется, показывает что-либо о проблемах блокировки.

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

0
ответ дан 1 December 2019 в 09:13
поделиться

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

Индекс clusted удостоверяется, что кавычки от того же запаса остаются вместе, и вероятно заказанный по дате. Действительно ли эта вторая информация правдива?

Индексы в SQL Server всегда сортируются по порядку столбцов в индексе. Так индекс на [запас, дата] сначала отсортирует на запасе, затем в запасе в дату. Индекс на [дата, запас] сначала отсортирует в дату, затем в рамках даты на запасе.

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

Для Вашей определенной проблемы: Если запросы диапазона дат для запасов являются наиболее распространенным использованием, то сделайте первичный ключ на [дата, запас], таким образом, данные будут храниться sequencially по дате на диске, и необходимо получить самый быстрый доступ. Создайте другие индексы по мере необходимости. Действительно индексируйте восстанавливают/статистика обновление после вставки большого количества новых данных.

0
ответ дан 1 December 2019 в 09:13
поделиться
Другие вопросы по тегам:

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