MERGE Query работает очень медленно в Management Studio 2008 Express - PullRequest
1 голос
/ 18 января 2012

У меня довольно простой запрос MERGE, где исходная таблица составляет всего около 41 МБ, а целевая таблица - около 4 ГБ. Я просто добавляю записи строк в большую целевую таблицу (избегая дублирования записей первичного ключа). Этот запрос выполняется очень медленно при выполнении в Management studio. Это уже работает 15 минут и не завершено. Просто интересно, есть ли варианты ускорения исполнения или я что-то не так делаю. Спасибо.

Вот запрос:

MERGE [myschema].[targettable] target
USING [myschema].[sourcetable] source
ON target.STATION_ID = source.STATION_ID    
WHEN NOT MATCHED BY TARGET THEN    
  INSERT (STATION_ID, SENSORNAME, TIME_TAG, ORIG_VALUE, ED_VALUE, SOURCE)    
  VALUES (source.STATION_ID, source.SENSORNAME, source.TIME_TAG, source.ORIG_VALUE, source.ED_VALUE, source.SOURCE);

Начало примерного исполнения xml:

<?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.1" Build="10.50.1600.1" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
  <BatchSequence>
    <Batch>
      <Statements>
        <StmtSimple StatementCompId="1" StatementEstRows="92529300000" StatementId="1" StatementOptmLevel="FULL" StatementSubTreeCost="45530500" StatementText="--sp_configure 'show advanced options', 1;&#xD;&#xA;--RECONFIGURE;&#xD;&#xA;--GO&#xD;&#xA;--sp_configure 'Ad Hoc Distributed Queries', 1;&#xD;&#xA;--RECONFIGURE;&#xD;&#xA;--GO&#xD;&#xA;MERGE XCManager.XC_DATA1 target&#xD;&#xA;USING XCManager.FrkFalls_FORMATTED source&#xD;&#xA;ON target.STATION_ID = source.STATION_ID&#xD;&#xA;WHEN NOT MATCHED BY TARGET THEN&#xD;&#xA;  INSERT (STATION_ID, SENSORNAME, TIME_TAG, ORIG_VALUE, ED_VALUE, SOURCE)&#xD;&#xA;  VALUES (source.STATION_ID, source.SENSORNAME, source.TIME_TAG, source.ORIG_VALUE, source.ED_VALUE, source.SOURCE);" StatementType="MERGE" QueryHash="0x0A5DB292FF222BCD" QueryPlanHash="0x1FBBCC92AE041A3E">
          <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" />
          <QueryPlan CachedPlanSize="64" CompileTime="31" CompileCPU="15" CompileMemory="736">
            <RelOp AvgRowSize="9" EstimateCPU="92529.3" EstimateIO="7070610" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="92529300000" LogicalOp="Merge" NodeId="1" Parallel="false" PhysicalOp="Clustered Index Merge" EstimatedTotalSubtreeCost="45530500">
              <OutputList />
              <Update WithOrderedPrefetch="true" DMLRequestSort="true">
                <Object Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Index="[DAT1_PK]" Alias="[target]" IndexKind="Clustered" />
                <SetPredicate>
                  <ScalarOperator ScalarString="[XConnectDB_NHDES].[XCManager].[XC_DATA1].[SOURCE] as [target].[SOURCE] = RaiseIfNullUpdate([Expr1008]),[XConnectDB_NHDES].[XCManager].[XC_DATA1].[SENSORNAME] as [target].[SENSORNAME] = RaiseIfNullUpdate([Expr1009]),[XConnectDB_NHDES].[XCManager].[XC_DATA1].[ED_VALUE] as [target].[ED_VALUE] = [XConnectDB_NHDES].[XCManager].[FrkFalls_FORMATTED].[ED_VALUE] as [source].[ED_VALUE],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[ORIG_VALUE] as [target].[ORIG_VALUE] = RaiseIfNullUpdate([XConnectDB_NHDES].[XCManager].[FrkFalls_FORMATTED].[ORIG_VALUE] as [source].[ORIG_VALUE]),[XConnectDB_NHDES].[XCManager].[XC_DATA1].[TIME_TAG] as [target].[TIME_TAG] = RaiseIfNullUpdate([XConnectDB_NHDES].[XCManager].[FrkFalls_FORMATTED].[TIME_TAG] as [source].[TIME_TAG]),[XConnectDB_NHDES].[XCManager].[XC_DATA1].[STATION_ID] as [target].[STATION_ID] = RaiseIfNullUpdate([Expr1010]),[XConnectDB_NHDES].[XCManager].[XC_DATA1].[FLAG1] as [target].[FLAG1] = [Expr1011],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[FLAG2] as [target].[FLAG2] = [Expr1012],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[FLAG3] as [target].[FLAG3] = [Expr1013],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[FLAG4] as [target].[FLAG4] = [Expr1014],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[HIGH_HIGH_FLAG] as [target].[HIGH_HIGH_FLAG] = [Expr1015],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[HIGH_FLAG] as [target].[HIGH_FLAG] = [Expr1016],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[LOW_FLAG] as [target].[LOW_FLAG] = [Expr1017],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[LOW_LOW_FLAG] as [target].[LOW_LOW_FLAG] = [Expr1018],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[ROC_FLAG] as [target].[ROC_FLAG] = [Expr1019],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[NO_CHG_FLAG] as [target].[NO_CHG_FLAG] = [Expr1020],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[ALARM_FLAG] as [target].[ALARM_FLAG] = [Expr1021],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[STD_DEV_FLAG] as [target].[STD_DEV_FLAG] = [Expr1022],[XConnectDB_NHDES].[XCManager].[XC_DATA1].[AVG_FLAG] as [target].[AVG_FLAG] = [Expr1023]">
                    <ScalarExpressionList>
                      <ScalarOperator>
                        <MultipleAssign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="SOURCE" />
                            <ScalarOperator>
                              <Intrinsic FunctionName="RaiseIfNullUpdate">
                                <ScalarOperator>
                                  <Identifier>
                                    <ColumnReference Column="Expr1008" />
                                  </Identifier>
                                </ScalarOperator>
                              </Intrinsic>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="SENSORNAME" />
                            <ScalarOperator>
                              <Intrinsic FunctionName="RaiseIfNullUpdate">
                                <ScalarOperator>
                                  <Identifier>
                                    <ColumnReference Column="Expr1009" />
                                  </Identifier>
                                </ScalarOperator>
                              </Intrinsic>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="ED_VALUE" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[FrkFalls_FORMATTED]" Alias="[source]" Column="ED_VALUE" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="ORIG_VALUE" />
                            <ScalarOperator>
                              <Intrinsic FunctionName="RaiseIfNullUpdate">
                                <ScalarOperator>
                                  <Identifier>
                                    <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[FrkFalls_FORMATTED]" Alias="[source]" Column="ORIG_VALUE" />
                                  </Identifier>
                                </ScalarOperator>
                              </Intrinsic>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="TIME_TAG" />
                            <ScalarOperator>
                              <Intrinsic FunctionName="RaiseIfNullUpdate">
                                <ScalarOperator>
                                  <Identifier>
                                    <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[FrkFalls_FORMATTED]" Alias="[source]" Column="TIME_TAG" />
                                  </Identifier>
                                </ScalarOperator>
                              </Intrinsic>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="STATION_ID" />
                            <ScalarOperator>
                              <Intrinsic FunctionName="RaiseIfNullUpdate">
                                <ScalarOperator>
                                  <Identifier>
                                    <ColumnReference Column="Expr1010" />
                                  </Identifier>
                                </ScalarOperator>
                              </Intrinsic>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="FLAG1" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1011" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="FLAG2" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1012" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="FLAG3" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1013" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="FLAG4" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1014" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="HIGH_HIGH_FLAG" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1015" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="HIGH_FLAG" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1016" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="LOW_FLAG" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1017" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="LOW_LOW_FLAG" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1018" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="ROC_FLAG" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1019" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="NO_CHG_FLAG" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1020" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="ALARM_FLAG" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1021" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="STD_DEV_FLAG" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1022" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                          <Assign>
                            <ColumnReference Database="[XConnectDB_NHDES]" Schema="[XCManager]" Table="[XC_DATA1]" Alias="[target]" Column="AVG_FLAG" />
                            <ScalarOperator>
                              <Identifier>
                                <ColumnReference Column="Expr1023" />
                              </Identifier>
                            </ScalarOperator>
                          </Assign>
                        </MultipleAssign>
                      </ScalarOperator>
                    </ScalarExpressionList>
                  </ScalarOperator>
                </SetPredicate>
                <ActionColumn>
                  <ColumnReference Column="Action1007" />
                </ActionColumn>
                <RelOp AvgRowSize="130" EstimateCPU="9252.93" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="92529300000" LogicalOp="Compute Scalar" NodeId="3" Parallel="false" PhysicalOp="Compute Scalar" EstimatedTotalSubtreeCost="38367300">
                  <OutputList>

Ответы [ 3 ]

1 голос
/ 24 февраля 2012

На самом деле получается мое оригинальное решение по отключению Unique in index не очень хорошее.Устаревшие данные, которые я пытался импортировать, были заполнены множеством неуникальных строк.Это сделало невозможным повторное включение уникального после импорта.

В итоге мне пришлось выполнить более сложный запрос, используя временную таблицу 'q', чтобы учесть это.Этот запрос сначала выбирает все отдельные строки из исходной таблицы (на основе полей TIME_TAG, STATION_ID и SENSORNAME), а затем вставляет их в целевую таблицу, если она не является повторяющейся строкой (опять же на основе полей TIME_TAG, STATION_ID и SENSORNAME).

    ;WITH    q AS
            (
            SELECT  *, ROW_NUMBER() OVER (PARTITION BY TIME_TAG, STATION_ID, SENSORNAME ORDER BY TIME_TAG) rn
            FROM    XConnectDB_NHDES.XCManager.Lakeport_FORMATTED
            )


    INSERT INTO XConnectDB_NHDES.XCManager.XC_DATA1
    SELECT STATION_ID, SENSORNAME, TIME_TAG, SOURCE, ORIG_VALUE, ED_VALUE, FLAG1, FLAG2, FLAG3, FLAG4, HIGH_HIGH_FLAG, HIGH_FLAG, LOW_FLAG, LOW_LOW_FLAG, ROC_FLAG, NO_CHG_FLAG, ALARM_FLAG, STD_DEV_FLAG, AVG_FLAG 
    FROM q source 
    WHERE rn = 1 and
    NOT EXISTS (SELECT * 
                      FROM XConnectDB_NHDES.XCManager.XC_DATA1 target 
                      WHERE target.TIME_TAG = source.TIME_TAG and 
                      target.STATION_ID = source.STATION_ID and
                      target.SENSORNAME = source.SENSORNAME)
1 голос
/ 19 января 2012

Похоже, что новый индекс, который вы добавили, не так уж полезен, так как STATION_ID имеет разные типы данных между двумя таблицами, и ему необходимо выполнить неявное приведение к nvarchar(20).

Если возможно, приведите их в соответствие.

Версия MERGE по сути делает что-то вроде

INSERT INTO FrkFalls_FORMATTED
SELECT *
FROM XC_DATA1 source
LEFT JOIN FrkFalls_FORMATTED target
ON target.STATION_ID = source.STATION_ID
WHERE target.STATION_ID IS NULL

Поскольку STATION_ID не уникален, это может означать, что он в конечном итоге присоединится, а затем отбросит целую загрузку промежуточных записей, которые не влияют на конечный результат. Предполагаемый загруженный вами план показывает 92 миллиарда строк из числа «многие ко многим» MERGE LEFT JOIN. Эти цифры, вероятно, очень ошибочны, но вы не предоставили более информативный план выполнения.

Plan

Вы можете попробовать отказаться от слияния и переписать как

INSERT INTO FrkFalls_FORMATTED
SELECT *
FROM XC_DATA1 source
WHERE NOT EXISTS (SELECT * 
                  FROM FrkFalls_FORMATTED target 
                  WHERE target.STATION_ID = source.STATION_ID)

Что может быть более эффективным.

0 голосов
/ 19 января 2012

Я думаю, что вы, вероятно, закончили вставку данных, но в будущем, я думаю, этот запрос будет быстрее:

INSERT INTO Test.CoveredIndexTestMaster
SELECT * FROM Test.CoveredIndexTestSubset
EXCEPT
SELECT * FROM Test.CoveredIndexTestMaster;

Оператор EXCEPT возвращает все строки из левой таблицы (Test.CoveredIndexTestSubset), которые не находятся в нужной таблице (Test.CoveredIndexTestMaster), и в этом случае они затем вставляются в Test.CoveredIndexTestMaster.(Таблицы, конечно, имеют одинаковую структуру.)

Хотя у меня не было времени настроить тест, точно повторяющий вашу ситуацию, я могу вам сказать это.Test.CoveredIndexTestMaster имел около 900 тыс. Строк, а Test.CoveredIndexTestSubset - около 206 тыс. Строк.В подмножестве было чуть более 3K строк, которых не было в Master.

Выполнение указанного запроса заняло 14 секунд.

Ни одна таблица не проиндексирована.Таблица имеет 2 столбца.Int и varchar.В обеих таблицах есть повторяющиеся строки.

Итак, ваш пробег будет различным, но мне было бы интересно услышать ваши результаты.

Это обновленный запрос, основанный на вводе Мартина:

INSERT INTO Test.CoveredIndexTestMaster 
SELECT * 
FROM Test.CoveredIndexTestSubset 
WHERE Col1 IN ( SELECT col1 FROM Test.CoveredIndexTestSubset 
                   EXCEPT 
                   SELECT col1 FROM Test.CoveredIndexTestMaster ) 

Это заняло 20 секунд, чтобы бежать.

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