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

Откуда: Ekaterinburg
Сообщений: 230
При решении одной задачки заметил замедление при вставке данных.
В ходе поисков причины осталось две таблицы:
create table alarms_1 (id int default 1, descr nvarchar(255), insertion_time datetime default getdate() )
create table alarms_2 (id int default 1, descr nvarchar(255), insertion_time datetime default getdate() )


и скрипт, который вставляет 1000 (всего тысячу) записей
declare @cnt int, @msg varchar (100)
set @cnt=0
set nocount on
while @cnt<1000 begin
             set @cnt=@cnt+1
             set @msg = 'Alarm '+ CAST(@cnt as varchar(10))
             INSERT INTO [Alarms_1] ([descr])
             VALUES (@msg)
             set @cnt=@cnt+1
             set @msg = 'Alarm '+ CAST(@cnt as varchar(10))
             INSERT INTO [Alarms_2] ([descr])
             VALUES (@msg)
end
print 'end'
--dbcc dropcleanbuffers
--dbcc freeproccache

вставка длится 8секунд при запуске этого скрипта в SSMS. Это пиндык.

Русскоязычная версия
Microsoft SQL Server 2012 - 11.0.2218.0 (X64)
Jun 12 2012 13:05:25
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Операционная система
Windows Server 2008 R2 Standart x64

Никаких тяжелых приложений нет. На двух серверах проверил.
Один сервер вообще пока пустой, результат тот же.
Версия SQL несколько пораньше, автообновление еще не дошло.
Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Посмотрел списки исправлений, вроде такой ситуации не описано

Забыл сказать, что на моем рабочем компе, на SQL 2008, тот же скрипт вставляет по 5 тыс записей в секунду.
20 ноя 12, 10:10    [13498555]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
план выполнения в студию !!!
20 ноя 12, 10:14    [13498581]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
_djХомяГ
Guest
Триггеры, констрейнты , индексы имеют место быть?
20 ноя 12, 10:27    [13498651]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Kasper
Member

Откуда: Брянск
Сообщений: 124
Matroz,

Откажитетесь от default
20 ноя 12, 10:31    [13498674]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
stavgreengo, просто интересно или по делу?
Какой бы ни был план, запрос простейщий и ситуация ненормальная.
<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.2" Build="11.0.2218.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
  <BatchSequence>
    <Batch>
      <Statements>
        <StmtSimple StatementCompId="6" StatementEstRows="1" StatementId="1" StatementOptmLevel="TRIVIAL" StatementSubTreeCost="0.0100022" StatementText="INSERT INTO [Alarms_1] ([descr])&#xD;&#xA;    VALUES (@msg)&#xD;&#xA;   " StatementType="INSERT" QueryHash="0x24ABA399C9375A1C" QueryPlanHash="0x3BD9C52D8279108D" RetrievedFromCache="true">
          <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" />
          <QueryPlan DegreeOfParallelism="1" CachedPlanSize="16" CompileTime="0" CompileCPU="0" CompileMemory="152">
            <MemoryGrantInfo SerialRequiredMemory="0" SerialDesiredMemory="0" />
            <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="103981" EstimatedPagesCached="15970" EstimatedAvailableDegreeOfParallelism="2" />
            <RelOp AvgRowSize="9" EstimateCPU="1E-06" EstimateIO="0.01" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Insert" NodeId="0" Parallel="false" PhysicalOp="Table Insert" EstimatedTotalSubtreeCost="0.0100022">
              <OutputList />
              <RunTimeInformation>
                <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
              </RunTimeInformation>
              <ScalarInsert DMLRequestSort="false">
                <DefinedValues>
                  <DefinedValue>
                    <ColumnReference Column="Expr1004" />
                    <ScalarOperator ScalarString="CONVERT_IMPLICIT(nvarchar(255),[@msg],0)">
                      <Convert DataType="nvarchar" Length="510" Style="0" Implicit="true">
                        <ScalarOperator>
                          <Identifier>
                            <ColumnReference Column="@msg" />
                          </Identifier>
                        </ScalarOperator>
                      </Convert>
                    </ScalarOperator>
                  </DefinedValue>
                  <DefinedValue>
                    <ColumnReference Column="Expr1005" />
                    <ScalarOperator ScalarString="(1)">
                      <Const ConstValue="(1)" />
                    </ScalarOperator>
                  </DefinedValue>
                  <DefinedValue>
                    <ColumnReference Column="Expr1006" />
                    <ScalarOperator ScalarString="getdate()">
                      <Identifier>
                        <ColumnReference Column="ConstExpr1007">
                          <ScalarOperator>
                            <Intrinsic FunctionName="getdate" />
                          </ScalarOperator>
                        </ColumnReference>
                      </Identifier>
                    </ScalarOperator>
                  </DefinedValue>
                </DefinedValues>
                <Object Database="[test]" Schema="[dbo]" Table="[alarms_1]" IndexKind="Heap" />
                <SetPredicate>
                  <ScalarOperator ScalarString="[test].[dbo].[alarms_1].[descr] = [Expr1004],[test].[dbo].[alarms_1].[id] = [Expr1005],[test].[dbo].[alarms_1].[insertion_time] = [Expr1006]">
                    <ScalarExpressionList>
                      <ScalarOperator>
                        <MultipleAssign>
                          <Assign>
                            <ColumnReference Database="[test]" Schema="[dbo]" Table="[alarms_1]" Column="descr" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1004" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[test]" Schema="[dbo]" Table="[alarms_1]" Column="id" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1005" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[test]" Schema="[dbo]" Table="[alarms_1]" Column="insertion_time" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1006" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                        </MultipleAssign>
                      </ScalarOperator>
                    </ScalarExpressionList>
                  </ScalarOperator>
                </SetPredicate>
              </ScalarInsert>
            </RelOp>
            <ParameterList>
              <ColumnReference Column="@msg" ParameterRuntimeValue="'Alarm 1'" />
            </ParameterList>
          </QueryPlan>
        </StmtSimple>
      </Statements>
    </Batch>
    <Batch>
      <Statements>
        <StmtSimple StatementCompId="9" StatementEstRows="1" StatementId="2" StatementOptmLevel="TRIVIAL" StatementSubTreeCost="0.0100022" StatementText="INSERT INTO [Alarms_2] ([descr])&#xD;&#xA;    VALUES (@msg)&#xD;" StatementType="INSERT" QueryHash="0x470FA21FDA34E9A5" QueryPlanHash="0xDF670B42160BF6E4" RetrievedFromCache="true">
          <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" />
          <QueryPlan DegreeOfParallelism="1" CachedPlanSize="16" CompileTime="0" CompileCPU="0" CompileMemory="152">
            <MemoryGrantInfo SerialRequiredMemory="0" SerialDesiredMemory="0" />
            <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="103981" EstimatedPagesCached="15970" EstimatedAvailableDegreeOfParallelism="2" />
            <RelOp AvgRowSize="9" EstimateCPU="1E-06" EstimateIO="0.01" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Insert" NodeId="0" Parallel="false" PhysicalOp="Table Insert" EstimatedTotalSubtreeCost="0.0100022">
              <OutputList />
              <RunTimeInformation>
                <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
              </RunTimeInformation>
              <ScalarInsert DMLRequestSort="false">
                <DefinedValues>
                  <DefinedValue>
                    <ColumnReference Column="Expr1004" />
                    <ScalarOperator ScalarString="CONVERT_IMPLICIT(nvarchar(255),[@msg],0)">
                      <Convert DataType="nvarchar" Length="510" Style="0" Implicit="true">
                        <ScalarOperator>
                          <Identifier>
                            <ColumnReference Column="@msg" />
                          </Identifier>
                        </ScalarOperator>
                      </Convert>
                    </ScalarOperator>
                  </DefinedValue>
                  <DefinedValue>
                    <ColumnReference Column="Expr1005" />
                    <ScalarOperator ScalarString="(1)">
                      <Const ConstValue="(1)" />
                    </ScalarOperator>
                  </DefinedValue>
                  <DefinedValue>
                    <ColumnReference Column="Expr1006" />
                    <ScalarOperator ScalarString="getdate()">
                      <Identifier>
                        <ColumnReference Column="ConstExpr1007">
                          <ScalarOperator>
                            <Intrinsic FunctionName="getdate" />
                          </ScalarOperator>
                        </ColumnReference>
                      </Identifier>
                    </ScalarOperator>
                  </DefinedValue>
                </DefinedValues>
                <Object Database="[test]" Schema="[dbo]" Table="[alarms_2]" IndexKind="Heap" />
                <SetPredicate>
                  <ScalarOperator ScalarString="[test].[dbo].[alarms_2].[descr] = [Expr1004],[test].[dbo].[alarms_2].[id] = [Expr1005],[test].[dbo].[alarms_2].[insertion_time] = [Expr1006]">
                    <ScalarExpressionList>
                      <ScalarOperator>
                        <MultipleAssign>
                          <Assign>
                            <ColumnReference Database="[test]" Schema="[dbo]" Table="[alarms_2]" Column="descr" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1004" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[test]" Schema="[dbo]" Table="[alarms_2]" Column="id" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1005" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[test]" Schema="[dbo]" Table="[alarms_2]" Column="insertion_time" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1006" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                        </MultipleAssign>
                      </ScalarOperator>
                    </ScalarExpressionList>
                  </ScalarOperator>
                </SetPredicate>
              </ScalarInsert>
            </RelOp>
            <ParameterList>
              <ColumnReference Column="@msg" ParameterRuntimeValue="'Alarm 2'" />
            </ParameterList>
          </QueryPlan>
        </StmtSimple>
      </Statements>
    </Batch>
    ...


и т.д.
20 ноя 12, 10:35    [13498701]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
_djХомяГ
Триггеры, констрейнты , индексы имеют место быть?


Ситуация целиком изложена, скрипты на создание таблиц указаны. Это тест больше ничего нет

Kasper
Matroz,

Откажитетесь от default

с какой стати? Не должна быть такая низкая скорость вставки.
Я указал, что на рабочем компе (которому 4 года и даже новым он считался весьма рядовой рабочей станцией)
скорость в 40-50 раз выше, на SQL 2008.
20 ноя 12, 10:42    [13498740]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Glory
Member

Откуда:
Сообщений: 104760
Matroz
и т.д.

Вот можно это "и тд" выложить/приаттачить в виде полного плана ?

И какой именно из запросов "длится 8секунд" ?(только не говрите, что весь скрипт)
20 ноя 12, 10:43    [13498744]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
Glory,
план в архиве

К сообщению приложен файл (test.rar - 32Kb) cкачать
20 ноя 12, 10:56    [13498814]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Glory
Member

Откуда:
Сообщений: 104760
Вот нафиг нужен план всего цикла ?
20 ноя 12, 11:05    [13498870]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Matroz,

а почему в поле nvarchar(255) вставляется переменная varchar(100)?
Почему бы не объявить @msg nvarchar(255)?
И SET @msg=N'Alarm '+CAST(@cnt as nvarchar)?
20 ноя 12, 11:15    [13498904]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31488
Matroz
вставка длится 8секунд при запуске этого скрипта в SSMS
А сколько будет, если заключить в общую транзакцию? Если быстро, то возможно, проблемы с диском для лога. Можно ещё взглянуть на очередь и дисковые задержки при выполнении скрипта (для удобства можно увеличить цикл до 10 000 )
20 ноя 12, 11:25    [13498943]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Crimean
Member

Откуда:
Сообщений: 13148
зеркалирование? репликации?
20 ноя 12, 11:27    [13498949]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31488
alexeyvg
А сколько будет, если заключить в общую транзакцию?
У меня в 6 раз быстрее (900 и 16 мс соответственно), это значит, что дисковая система более менее в порядке. А у вас наверное разница раз в 100
20 ноя 12, 11:30    [13498970]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
Glory,
а какой план нужен?
Да, весь скрипт выполняется 8 секунд.
План выполнения состоит из 1000 однотипных блоков.
Это неправда, чтоли?
Без вставки данных он выполняется мгновенно на 1 тыс записей.

Пусть будет такой блок
SET STATISTICS TIME ON
GO
declare @cnt int, @msg varchar (100)
set @msg = 'Alarm '+ CAST(@cnt as varchar(10))

INSERT INTO [Alarms_1] ([descr])
VALUES (@msg)
SET STATISTICS TIME OFF

его результат

Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.


Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 18 мс.

реально от 7 до 18 мс.

план (при выполнении без set statistics)
<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.2" Build="11.0.2218.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
  <BatchSequence>
    <Batch>
      <Statements>
        <StmtSimple StatementCompId="2" StatementEstRows="1" StatementId="1" StatementOptmLevel="TRIVIAL" StatementSubTreeCost="0.0100022" StatementText="INSERT INTO [Alarms_1] ([descr])&#xD;&#xA;VALUES (@msg)" StatementType="INSERT" QueryHash="0x24ABA399C9375A1C" QueryPlanHash="0x3BD9C52D8279108D" RetrievedFromCache="true">
          <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" />
          <QueryPlan DegreeOfParallelism="1" CachedPlanSize="16" CompileTime="0" CompileCPU="0" CompileMemory="128">
            <MemoryGrantInfo SerialRequiredMemory="0" SerialDesiredMemory="0" />
            <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="103981" EstimatedPagesCached="14769" EstimatedAvailableDegreeOfParallelism="2" />
            <RelOp AvgRowSize="9" EstimateCPU="1E-06" EstimateIO="0.01" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Insert" NodeId="0" Parallel="false" PhysicalOp="Table Insert" EstimatedTotalSubtreeCost="0.0100022">
              <OutputList />
              <RunTimeInformation>
                <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
              </RunTimeInformation>
              <ScalarInsert DMLRequestSort="false">
                <DefinedValues>
                  <DefinedValue>
                    <ColumnReference Column="Expr1004" />
                    <ScalarOperator ScalarString="CONVERT_IMPLICIT(nvarchar(255),[@msg],0)">
                      <Convert DataType="nvarchar" Length="510" Style="0" Implicit="true">
                        <ScalarOperator>
                          <Identifier>
                            <ColumnReference Column="@msg" />
                          </Identifier>
                        </ScalarOperator>
                      </Convert>
                    </ScalarOperator>
                  </DefinedValue>
                  <DefinedValue>
                    <ColumnReference Column="Expr1005" />
                    <ScalarOperator ScalarString="(1)">
                      <Const ConstValue="(1)" />
                    </ScalarOperator>
                  </DefinedValue>
                  <DefinedValue>
                    <ColumnReference Column="Expr1006" />
                    <ScalarOperator ScalarString="getdate()">
                      <Identifier>
                        <ColumnReference Column="ConstExpr1007">
                          <ScalarOperator>
                            <Intrinsic FunctionName="getdate" />
                          </ScalarOperator>
                        </ColumnReference>
                      </Identifier>
                    </ScalarOperator>
                  </DefinedValue>
                </DefinedValues>
                <Object Database="[test]" Schema="[dbo]" Table="[alarms_1]" IndexKind="Heap" />
                <SetPredicate>
                  <ScalarOperator ScalarString="[test].[dbo].[alarms_1].[descr] = [Expr1004],[test].[dbo].[alarms_1].[id] = [Expr1005],[test].[dbo].[alarms_1].[insertion_time] = [Expr1006]">
                    <ScalarExpressionList>
                      <ScalarOperator>
                        <MultipleAssign>
                          <Assign>
                            <ColumnReference Database="[test]" Schema="[dbo]" Table="[alarms_1]" Column="descr" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1004" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[test]" Schema="[dbo]" Table="[alarms_1]" Column="id" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1005" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[test]" Schema="[dbo]" Table="[alarms_1]" Column="insertion_time" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1006" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                        </MultipleAssign>
                      </ScalarOperator>
                    </ScalarExpressionList>
                  </ScalarOperator>
                </SetPredicate>
              </ScalarInsert>
            </RelOp>
            <ParameterList>
              <ColumnReference Column="@msg" ParameterRuntimeValue="NULL" />
            </ParameterList>
          </QueryPlan>
        </StmtSimple>
      </Statements>
    </Batch>
  </BatchSequence>
</ShowPlanXML>
20 ноя 12, 11:33    [13498985]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Matroz
вставка длится 8секунд при запуске этого скрипта в SSMS. Это пиндык.


как уже предлагали - а если обернуть в транзакцию?
у меня на средненьком оборудовании 300 ms "для клиента"
20 ноя 12, 11:50    [13499109]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
invm
Member

Откуда: Москва
Сообщений: 9438
Matroz,

Антивирусное ПО установлено на сервере?
20 ноя 12, 12:00    [13499200]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
МуМу
Member

Откуда:
Сообщений: 1134
При оборачивании этого текста в транзакцию ускорение будет на порядок. Вопрос возникает почему на SQL 2008 это работало быстрее? Мне кажется вы там не заметили транзакцию:)
20 ноя 12, 12:08    [13499292]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
Crimean
как уже предлагали - а если обернуть в транзакцию?
у меня на средненьком оборудовании 300 ms "для клиента"


обернул, миллисекунды не мерял, но меньше секунды. Увеличил число записей в цикле до 100 000 - 4 секунды выполняется.
20 ноя 12, 12:14    [13499343]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
МуМу
При оборачивании этого текста в транзакцию ускорение будет на порядок. Вопрос возникает почему на SQL 2008 это работало быстрее? Мне кажется вы там не заметили транзакцию:)


Я один и тот же скрипт запускал. Копипастил
20 ноя 12, 12:15    [13499353]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34628
Matroz,

Поле insert time задавай явно, дефолт удали.
20 ноя 12, 12:16    [13499359]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
МуМу
При оборачивании этого текста в транзакцию ускорение будет на порядок. Вопрос возникает почему на SQL 2008 это работало быстрее? Мне кажется вы там не заметили транзакцию:)


А может быть, что в 2012 по умолчанию неявные транзакции включены?
20 ноя 12, 12:17    [13499360]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Crimean
Member

Откуда:
Сообщений: 13148
по-моему все же синхронное зеркалирование включено :) ну или как их там в 12 дразнят, группы высокой доступности?
ну очень похоже
20 ноя 12, 12:21    [13499379]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
МуМу
Member

Откуда:
Сообщений: 1134
То Crimean. Я тоже об этом подумал:)
Один в один такой код на always on в синхронном режиме не так давно запускал. Но в разы отличие по времени при обвертке транзакцией все равно присутствует независимо от зеркалирования.
20 ноя 12, 12:31    [13499445]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
Crimean
по-моему все же синхронное зеркалирование включено :) ну или как их там в 12 дразнят, группы высокой доступности?
ну очень похоже

нет ничего, все что касается SQL настраиваю я. Кроме того, один из тестируемых серверов вообще пустой был, кроме SQL ничего не крутилось. На другом запущено несколько наших приложений. Но результат первого приведенного скрипта у них был одинаковый.
20 ноя 12, 12:35    [13499467]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Crimean
Member

Откуда:
Сообщений: 13148
ну если никаких зеркалирований нет - все банально - просто кеш отключен
20 ноя 12, 12:37    [13499477]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31488
Matroz
Crimean
как уже предлагали - а если обернуть в транзакцию?
у меня на средненьком оборудовании 300 ms "для клиента"


обернул, миллисекунды не мерял, но меньше секунды. Увеличил число записей в цикле до 100 000 - 4 секунды выполняется.
Ну так дальше смотрите, что я вам советовал.

ИМХО всё очевидно - неправильная настройка/конфигурация дисковой подсистемы, хуже, чем было на старых серверах.
20 ноя 12, 12:50    [13499539]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
МуМу
Member

Откуда:
Сообщений: 1134
В одном случае вставка происходит с множеством маленьких транзакций, а в другом те же самые изменения но в одной транзакции. MSSQL после фиксации транзакции обязан данные отобразить в транзакшн логе. Но если включен апппаратный кеш(дисковой системы) в этом случае данные накапливаются и затем записываются одной порцией, за счет чего происходит ускорение.Правда в том случае если сервер неожиданно накроется - могут быть потерянны данные.Для избежания этого должно быть отдельное питание контроллера, например батарейка. Для систем с относмительно большим весом транзакций эта тема вообще не актуальна. Подобные выражденные случаи решаются оборачиванием в транзакции.
20 ноя 12, 12:52    [13499546]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Сейчас ради интереса попросил коллегу проверить данный тест на сервере с включенным кешем и без него.
20 ноя 12, 12:53    [13499556]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Проверили, что и требовалось доказать. На сервере с включенным кешем разницы нет.Ну и разумеется одинаково быстро. На персоналке обрамление в транзакцию дает эффект ускорения в 10-ть раз. Впрочем про это уже писали.
20 ноя 12, 14:22    [13500450]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
у нас кэш был отключен, в настройках контроллера от HP. Включили, стало быстро.
Но думаю, что тема все-таки приложения допилить маленько, они логгируют совершенно однотипными запросами,
пусть шлют "commit | begin tran" раз в сотню-.. записей. А кэш выключить.
20 ноя 12, 15:01    [13500832]     Ответить | Цитировать Сообщить модератору
 Re: низкая производительность SQL 2012 при вставке данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31488
Matroz
Но думаю, что тема все-таки приложения допилить маленько, они логгируют совершенно однотипными запросами,
пусть шлют "commit | begin tran" раз в сотню-.. записей
Правильное решение.

Ещё можно вставлять во временную таблицу, потом в постоянную.

Или можно вставлять стейтментами типа
INSERT INTO [Alarms_1] ([descr]) VALUES
('msg'),
('msg'),
...
('msg'),
('msg')

Или можно вызывать ХП и передавать её список, например, как табличный параметр.
Matroz
А кэш выключить.
Зачем? Пучть вы решили проблему с медленной записью в одном месте, но ведь остались другие места, и возможно, их так просто не поправить?

Разве что у вас нет батарейки в рейд-контроллере, тогда да, придётся смириться с просадкой в несколько раз на мелких записях...
20 ноя 12, 15:13    [13500942]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить