2013-10-09 4 views
2

Следующий запрос на ввод занимает 7 секунд для запуска, и поскольку он выполняется несколько раз в цикле, время складывается. Мне нужна помощь, чтобы ускорить это, 90% затрат идет на кластерную вставку индекса и 10% на сканирование таблицы FN_qryPSLA().Ускорить SQL Server 2008 Вставить в запрос

INSERT INTO tblTPS (fldPK, fldDTA, fldCI, fldMN, fldMDN, fldIQ, fldSD, fldNDS, fldNIN, fldNL, fldMin, fldMax, fldUNC, fldAVA, fldBA) 
SELECT fldPK, fldDTA, fldCI, fldMN, fldMDN, fldIQ, fldSD, fldNDS, fldNIN, fldNL, fldMin, fldMax, fldUNC, fldAVA, 1 AS fldBA 
FROM FN_qryPSLA() 
WHERE (((fldPK)= 37923) AND ((fldMN)<>-254)); 

Ниже FN_qryPSLA() ... Стоимость составляет 85% от Distinct Сортировать (если удалить стоимость 80% Hash Match (совокупный)) участвует

FUNCTION [dbo].[FN_qryPSLA](@PK INT) 
RETURNS @tmpTblPSLA TABLE (
fldPK  BIGINT  NOT NULL,   
fldDTA   DATETIME NULL, 
fldCI  FLOAT  NULL, 
fldMN  FLOAT  NULL, 
fldMDN  FLOAT  NULL, 
fldIQ  FLOAT  NULL,    
fldSD  FLOAT  NULL, 
fldNDS  BIGINT  NULL, 
fldNIN  BIGINT  NULL, 
fldNL  BIGINT  NULL, 
fldMin  FLOAT  NULL, 
fldMax  FLOAT  NULL, 
fldUNC  VARCHAR(5) NULL, 
fldAVA  TINYINT  NULL 
) 
AS 
BEGIN 
WITH gDPS AS 
(SELECT fldPK, Max(fldDTA) AS fldDTA 
FROM tblAPS 
GROUP BY fldPK) 

    SELECT fldPK, fldDTA, fldCI, fldMN, fldMDN, fldIQ, fldSD, fldNDS, fldNIN, fldNL, fldMin, fldMax, fldUNC, fldAVA 
FROM tblAPS INNER JOIN getDPS ON (tblAPS.fldDTA = gDPS.fldDTA) AND (tblAPS.fldPK = gDPS.fldPK) 
    GROUP BY fldPK, fldDTA, fldCI, fldMN, fldMDN, fldIQ, fldSD, fldNDS, fldNIN, fldNL, fldMin, fldMax, fldUNC, fldAVA 
    HAVING tblAPS.fldMN<>-254 
    ORDER BY tblAPS.fldPK, tblAPS.fldCI; 
    RETURN; 
END; 

Поля (2 миллиона записей в таблице выполняется запрос) кластерный индекс fldPSD ...

fldPK   BIGINT  NOT NULL,   
fldDTA DATETIME NULL, 
fldCI  FLOAT  NULL, 
fldMN   FLOAT  NULL, 
fldMDN   FLOAT  NULL, 
fldIQ    FLOAT  NULL,    
fldSD    FLOAT  NULL, 
fldNDS  BIGINT  NULL, 
fldNIN   BIGINT  NULL, 
fldNL   BIGINT  NULL, 
fldMin    FLOAT  NULL, 
fldMax    FLOAT  NULL, 
fldUNC  VARCHAR(5) NULL, 
fldAVA  TINYINT  NULL 
+0

Покажите нам * целое * определение 'FN_qryPSLA()'. Вы упустили заголовок определения, что очень важно для такого рода проблем с производительностью. – RBarryYoung

+0

@RBarryYoung Я отредактировал сообщение, чтобы включить остальные функции. – codingManiac

+0

В итоге я получил SQL, предлагающий этот индекс ... CREATE NONCLUSTERED INDEX [$ fldPKMdnInd] ON [dbo]. [TblAPS] ([fldPK], [fldMDN]) INCLUDE ([fldDTA], [fldCI], [fldMDN ], [fldIQ], [fldSD], [fldNDS], [fldNIN], [fldNL], [fldMin], [fldMax], [fldUNC], [fldAVA]) GO – codingManiac

ответ

5

Этот фрагмент выделялся мне:

90% от стоимости идет на кластерный индекс вставки

Имея это в виду, я могу думать о двух вещах, чтобы попробовать:

  1. Изменение таблицы Fill Factor для целевой таблицы, чтобы разрешить некоторое пустое пространство на каждой странице для входящих данных.
    or:
  2. Заказ данных перед вставкой, чтобы он соответствовал порядку первичного ключа.

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

В первом случае вы оставляете пустое место на каждой странице во время создания, так что при вставке записей вам не нужно разделить или создавать новые страницы так часто.

Во втором случае вы не можете использовать ORDER BY с помощью команды SELECT, которая является частью вставки ... но вы можете влиять на порядок через индексы в таблицах этой команды SELECT. Цель состоит в том, что путем подачи данных по порядку вы будете работать на одной странице за раз в последовательности при вставке данных, а не прыгать и, возможно, снова и снова перестраивать одну и ту же страницу.

+0

Целевая таблица фактически содержит только временные данные, а не много, поэтому я решил удалить индексы. Теперь стоимость составляет 75% вставки в tblTPS, так или иначе, чтобы снизить эту стоимость? – codingManiac

+0

Нет, и вы не захотите. Помните, что здесь вы видите проценты: число всегда должно составлять до 100. То, что вы видите, - это сырая производительность вставки: фактическая вставка данных. 75% там неплохо.Теперь вы можете получить больше памяти или более быстрых дисков или уменьшить другие 25%. –

+0

Остальные 25% идут в направлении сканирования подзапроса, а подзапрос имеет 85% к четкому порядку, но в этот момент я, вероятно, только собираюсь выжать мс. – codingManiac

Смежные вопросы