Выберите миллион + записей, пока идет огромная вставка - PullRequest
4 голосов
/ 22 мая 2009

Я пытаюсь извлечь файл журнала приложения из одной таблицы. Оператор select запроса довольно прост.

select top 200000 * 
from dbo.transactionlog 
where rowid>7 
and rowid <700000 and 
Project='AmWINS' 

Время запроса для выбора выше 5 минут. Это считается долго? Во время работы выбора также выполняется массовая вставка.

[EDIT]

На самом деле у меня возникла серьезная проблема с моей текущей базой данных журналов производства, По сути, у нас есть только одна таблица (транзакция). весь журнал приложения будет вставлен в эту таблицу. Для проекта, подобного AmWINS, основанного на результате выборочного подсчета, мы вставляем около 800 000 записей в день. Вставка записи выполняется 24 часа в сутки в производственной среде. Пользователь хотел бы извлечь данные из таблицы, если пользователь хочет проверить журналы транзакций. Поэтому нам нужно выбрать записи из таблицы, если необходимо.

Я пытался смоделировать в среде UAT, чтобы накачать объем в соответствии с производством, которое до сегодняшнего дня выросло до 10 миллионов записей. и в то время как я пытаюсь извлечь записи, в то же время я имитирую с массовой вставкой, чтобы она выглядела как для производственной среды. Потребовалось около 5 минут, чтобы извлечь 200 тыс. Записей.

Во время процесса извлечения я наблюдаю, что на физическом сервере SQL процессор достигает резкого скачка до 95%.

таблицы имеют 13 полей и включение идентификатора (rowid) с bigint. rowid это ПК. Индексы создаются на Date, Project, module и RefNumber. таблицы создаются при блокировке строк и включенной блокировке страниц. Я использую SQL Server 2005.

Надеюсь, вы, ребята, можете дать мне несколько профессиональных советов, чтобы просветить меня. Спасибо.

Ответы [ 7 ]

2 голосов
/ 22 мая 2009

Возможно, вы сможете использовать табличную подсказку Nolock, как описано здесь:

Таблица Советы MSDN

Ваш SQL станет примерно таким:

select top 200000 * from dbo.transactionlog with (no lock) ...

Это обеспечит лучшую производительность, если вас не волнует полная точность возвращаемых данных.

1 голос
/ 22 мая 2009

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

0 голосов
/ 11 июня 2013

Вы также можете экспортировать это как локальный файл данных или SQL-файл.

0 голосов
/ 22 мая 2009

Никакое индексирование здесь не поможет, потому что это запрос SELECT *, так что это, скорее всего, сканирование ПК или ужасный поиск по разметке

И ТОП не имеет смысла, потому что здесь нет ORDER BY.

Насколько я могу судить, одновременная вставка, вероятно, вводит в заблуждение, если только таблица не содержит только 2 столбца и массовая вставка блокирует всю таблицу. При использовании простого столбца int IDENTITY вставка и выбор могут не мешать друг другу.

Особенно, если объемная вставка составляет всего несколько тысяч строк (или даже 10000)

Edit. Значения TOP и rowid не подразумевают миллион плюс

0 голосов
/ 22 мая 2009

Как уже сказал ск. Индексация важна. Поэтому убедитесь, что у вас есть соответствующий индекс готов. Я бы не только установил индекс для rowId, но и для Project. Также я бы переписал предложение where:

WHERE Project = 'AmWINS' AND rowid BETWEEN 8 AND 699999

Причина: я предполагаю, что Project более строг, чем rowid и - исправьте меня, если я ошибаюсь - МЕЖДУ быстрее, чем сравнение .

0 голосов
/ 22 мая 2009

Я не уверен, но разве массовая вставка в MS SQL не блокирует всю таблицу?

0 голосов
/ 22 мая 2009

Это зависит от вашего оборудования. Для извлечения 200000 строк во время вставки данных требуется серьезный ввод-вывод, поэтому, если у вас не более 30 дисков, это будет медленным.

Кроме того, ваш столбец rowID проиндексирован? Это поможет с выбором, но может замедлить массовую вставку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...