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

Откуда: smolensk-spb
Сообщений: 122
Программно переношу данные с oracle на mssql.
Приложение пишется и тестится на моем рабочем ПК
(Core i3-2100 3.10GHz 4,00Gb)
с расчетом на последующее развертывание на одной из серверных машин
(AMD Opteron Processor 6238 2.60GHz (8 processors) 8,00Gb).

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

Подскажите, пожалуйста, куда глядеть?

Служба данные создает чистую БД "A" на mssql 2008 r2, читает из БД "Б" на oracle 11g, обрабатывает и пишет в "A".
Грешила на oracle, но тест показал, что, как и ожидалось, читка из БД происходит быстрее, чем на моем компьютере.
А вот запись наоборот тормозит.

Служба на delphi, компоненты доступа к MSSQL ODAC.
И там, и там разумеется исполняется один и тот же код.
8 апр 15, 14:36    [17488831]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Добрый день. Причин почему так происходит может быть миллион. Если это разовая операция попробуйте либо мигратор на SQL Server.

Либо воспользуйтесь альтернативным компонентом доступа к данным.
8 апр 15, 14:44    [17488905]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Скорее всего дело в вашем коде и / или в коде компонентов которые вы использыете.
Сходу что-то сказать невозможно.

Есть другие варинаты:
1.Слинковать 2 сервера и перелить данные обычными Insert`ами.
2.Если данных не ТБ
8 апр 15, 14:49    [17488951]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
anna.serg
Member

Откуда: smolensk-spb
Сообщений: 122
опечаталась. именно SDAC для доступа к MSSQL я использую. ODAC для oracle
8 апр 15, 14:49    [17488952]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
anna.serg
Member

Откуда: smolensk-spb
Сообщений: 122
я понимаю, что есть куча способов перелить данные и делать с ними, что угодно. но задача - не привязываться к виду БД (к линкам и т.п.). для этого и работа с базами производится посредством универсального драйвера. Блинский блин(( нужно разобраться именно с этим вариантом
8 апр 15, 14:58    [17489023]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
а нельзя ли через нативный драйвер для MS SQL Server-а работать в вашем delphi?
8 апр 15, 14:59    [17489041]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
anna.serg
Member

Откуда: smolensk-spb
Сообщений: 122
Konst_One, можно. можно все что угодно. Но банально нет времени все переписать.
Сейчас хочу провести нагрузочный тест mssql вне моего приложения.
8 апр 15, 15:07    [17489107]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
anna.serg
Программно переношу данные с oracle на mssql.
Приложение пишется и тестится на моем рабочем ПК с расчетом на последующее развертывание на одной из серверных машин

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

Подскажите, пожалуйста, куда глядеть?


anna.serg, вы наверняка забыли создать какой-то индекс, или наоборот создали слишком рано.

Обычно до окончания вставки данных НЕ СОЗДАЮТ все индексы и все констрейнты, а создают их только ПОСЛЕ заполнения
таблиц (ы). Так быстрее. (в MSSQL возможно нужно создавать тольк первичный ключ, если он кластерный)

Но с другой стороны, если вы вставляете записи в таблицу с Foreign key , и не создали индексы на родительских таблицах,
это будет тормозить вставку пропорционально объёму родительских таблиц.
8 апр 15, 15:43    [17489352]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
anna.serg
Member

Откуда: smolensk-spb
Сообщений: 122
MasterZiv, спасибо за рекомендации. Подправлю код. Но ведь исполняется в любом случае одно и то же, что у меня на компьютере, что на сервере.
Провела эксперимент. В среде SQL Server Management Studio выполняю ПОСТРОЧНЫЙ перенос, поэтому намеренно использую адский курсор и засекаю время.
declare @start datetime
set @start = getdate()

DECLARE @CurID BIGINT
DECLARE @CurPO INT
DECLARE cChild CURSOR LOCAL FAST_FORWARD
  FOR SELECT ID, PO
  FROM [DB].[dbo].[Table1]

  OPEN cChild 
  FETCH cChild INTO @CurID, @CurPO  
         
  WHILE @@Fetch_Status = 0 
   BEGIN
    INSERT INTO [DB].[dbo].[Table2]
	values(@CurID,@CurPO)

    FETCH cChild INTO @CurID, @CurPO 
                  
   END
  CLOSE cChild

select datediff(ms,@start,getdate()) 


На моем компьютере он уже выполнился. На сервере перенеслась только треть записей.
Нет никаких delphi, SDAC и других компонент. Сервер не нагружен вообще. Это тестовая машина.
8 апр 15, 15:59    [17489465]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
а скрипты табличек ваших не покажете? профайлер бы запустили заодно , посмотрели бы что у вас там происходит в базе.
8 апр 15, 16:04    [17489495]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
Crimean
Member

Откуда:
Сообщений: 13147
пачки вставок в транзакции оборачивайте. латентность дисковой системы локальных компов почти всегда ниже серверных систем. на этом все и влетают. в отсутствии возможностей распараллелить запрос
8 апр 15, 16:06    [17489505]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
anna.serg
На моем компьютере он уже выполнился. На сервере перенеслась только треть записей.
Последовательность одного потока мелких транзакций на сервере часто медленнее, чем на десктопе, из за кеширования записи на десктопе.

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

И ещё проверьте работу дискового контроллера на сервере - работает ли там батареечный кеш записи (и есть ли он вообще).
8 апр 15, 16:09    [17489528]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Вроде бы есть штатные средства миграции с Oracle.
8 апр 15, 16:23    [17489622]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
anna.serg
MasterZiv, спасибо за рекомендации. Подправлю код. Но ведь исполняется в любом случае одно и то же, что у меня на компьютере, что на сервере.
Провела эксперимент. В среде SQL Server Management Studio выполняю ПОСТРОЧНЫЙ перенос, поэтому намеренно использую адский курсор и засекаю время.
declare @start datetime
set @start = getdate()

DECLARE @CurID BIGINT
DECLARE @CurPO INT
DECLARE cChild CURSOR LOCAL FAST_FORWARD
  FOR SELECT ID, PO
  FROM [DB].[dbo].[Table1]

  OPEN cChild 
  FETCH cChild INTO @CurID, @CurPO  
         
  WHILE @@Fetch_Status = 0 
   BEGIN
    INSERT INTO [DB].[dbo].[Table2]
	values(@CurID,@CurPO)

    FETCH cChild INTO @CurID, @CurPO 
                  
   END
  CLOSE cChild

select datediff(ms,@start,getdate()) 


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


Первое правило при переходе с оракла на скуль, забыть что такое курсор и как его можно использовать:)
Ваш код априори не может быстро работать.
8 апр 15, 16:32    [17489717]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
anna.serg
я понимаю, что есть куча способов перелить данные и делать с ними, что угодно. но задача - не привязываться к виду БД (к линкам и т.п.). для этого и работа с базами производится посредством универсального драйвера. Блинский блин(( нужно разобраться именно с этим вариантом


Универсальные велосипеды, обычно всегда работают именно так как вы сейчас видите, и по другому не будет, привыкайте раз решили сделать подобие hybernate
8 апр 15, 16:35    [17489752]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
anna.serg
Member

Откуда: smolensk-spb
Сообщений: 122
WarAnt, вы не поняли. Это не рабочий запрос. Посмотрите на него! он абсурден.
insert into Table2(ID,PO)
select ID,PO
from Table1

Это имитация построчного выполнения.
Всем спасибо! дело действительно в транзакциях. нужно оборачивать в одну сразу множество вставок.
На декстопе разницы по скорости вообще нет, зато на сервере все летит.
Еще раз спасибо!
8 апр 15, 16:49    [17489840]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
Crimean
Member

Откуда:
Сообщений: 13147
да не в транзакциях а в латентности :) обернув в транзакции вы просто уменьшили число обращений к диску
8 апр 15, 17:06    [17489971]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с производительностью  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
anna.serg
Всем спасибо! дело действительно в транзакциях. нужно оборачивать в одну сразу множество вставок.
На декстопе разницы по скорости вообще нет, зато на сервере все летит.
Это может быть признаком неправильной конфигурации дискового контроллера на сервере, как я уже писал. Обратите на это внимание.
8 апр 15, 17:45    [17490229]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить