Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите найти узкое место  [new]
originator
Member

Откуда: Москва
Сообщений: 28
Доброго дня!

В некоторых ситуациях не могу понять причины тормозов.

Вот модельный случай:

create table txt(title nvarchar(max));

---- модельный запрос (удваивает кол-во записей) -----
insert txt with(tablockx)
select NEWID() from txt with(nolock);


Когда в таблице txt много данных (10 млн строк и больше), то имеем следующие стабильные значения счетчиков в течение работы скрипта:

Запись данных на диск              10 МБайт/сек (суммарно, по всем файлам БД)
Длина очереди на запись диска 0.2
Интенсивность записи на диск 54 операций/сек (20+17+17 - по дискам)
Загрузка процессора 10%

Это при том, что на сервере

  • 32 ГБайт оперативки, из них 24 отдано MS SQL Server (ограничение в настройках MS SQL Server)
  • 12 дисков в RAID10 (3 блока по 4 диска)
  • RAID аппаратный, 8GB памяти
  • Установившаяся скорость записи блоков ~200 МБайт/сек (пока есть место в кэше - 1,2 ГБайт/сек)
  • БД разложена в 3 равных файла на каждый из этих блоков (каждый блок - это отдельный логический диск в Win), на оном из блоков еще лежит лог, но модель восстановления Simple, так что тут нет большого перекоса.

    ВОПРОС:
    Что является узким местом? Почему процессор и диск недогружены?
  • 8 янв 12, 19:26    [11870856]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти узкое место  [new]
    originator
    Member

    Откуда: Москва
    Сообщений: 28
    Видимо, проблема в том, что вставка идет однопоточно.

    Как можно вставлять записи многопоточно?
    на сервере 8 ядер, хотелось бы иметь 8 потоков вставки.
    8 янв 12, 19:35    [11870908]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти узкое место  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    А зачем в поле NVARCHAR(MAX) вставлять UNIQUEIDENTIFIER с неявным преобразованием типа?
    8 янв 12, 19:51    [11870965]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти узкое место  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    originator
    Вот модельный случай:

    create table txt(title nvarchar(max));
    
    ---- модельный запрос (удваивает кол-во записей) -----
    insert txt with(tablockx)
    select NEWID() from txt with(nolock);
    
    Кстати, именно приведённый запрос мгновенно оставит таблицу пустой.
    8 янв 12, 20:01    [11871003]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти узкое место  [new]
    originator
    Member

    Откуда: Москва
    Сообщений: 28
    iap
    А зачем в поле NVARCHAR(MAX) вставлять UNIQUEIDENTIFIER с неявным преобразованием типа?

    Запрос модельный, для иллюстрации. На самом деле строится суффиксное дерево, которое состоит из огромного кол-ва коротких строк.
    8 янв 12, 20:07    [11871034]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти узкое место  [new]
    Winnipuh
    Member [заблокирован]

    Откуда: Київ
    Сообщений: 10428
    iap
    originator
    Вот модельный случай:

    create table txt(title nvarchar(max));
    
    ---- модельный запрос (удваивает кол-во записей) -----
    insert txt with(tablockx)
    select NEWID() from txt with(nolock);
    
    Кстати, именно приведённый запрос мгновенно оставит таблицу пустой.


    ?
    8 янв 12, 20:10    [11871041]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти узкое место  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    Winnipuh
    iap
    пропущено...
    Кстати, именно приведённый запрос мгновенно оставит таблицу пустой.


    ?
    После CREATE TABLE таблица пустая?
    А если удвоить количество записей, сколько их будет?
    8 янв 12, 20:17    [11871066]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти узкое место  [new]
    Winnipuh
    Member [заблокирован]

    Откуда: Київ
    Сообщений: 10428
    iap
    Winnipuh
    пропущено...


    ?
    После CREATE TABLE таблица пустая?
    А если удвоить количество записей, сколько их будет?


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

    ---- модельный запрос (удваивает кол-во записей) -----
    insert txt with(tablockx)
    select NEWID() from txt with(nolock);
    
    8 янв 12, 20:28    [11871096]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти узкое место  [new]
    aleks2
    Guest
    originator
    Видимо, проблема в том, что вставка идет однопоточно.

    Как можно вставлять записи многопоточно?
    на сервере 8 ядер, хотелось бы иметь 8 потоков вставки.

    8 запросов INSERT из 8-и подключний... и будет вам щастье.
    9 янв 12, 08:36    [11872780]     Ответить | Цитировать Сообщить модератору
     Re: Помогите найти узкое место  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31964
    originator
    ВОПРОС:
    Что является узким местом? Почему процессор и диск недогружены?
    Начать нужно с тестирования дисков утилитой sqlio. Может, 10 МБайт/сек - это предел для ваших рейдов?

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

    Далее оптимизировать сервер и код для массовых вставок данных.

    Многопоточная вставка реализуется многопоточным приложением, но сиквел и сам может работать в несколько потоков - зависит от конкретного кода.
    9 янв 12, 11:59    [11873123]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить