2016-03-04 4 views
-1

У меня есть таблица отчетов, которая заполняется из разных таблиц фактов в моем хранилище данных. Проблема в том, что для одного клиента в этой таблице отчетов требуется 46 секунд, чтобы вытащить его данные. Один клиент имеет 4232424 записей. В общей сложности таблица содержит 5336393 записи и имеет 4 столбца. Я опубликую структуру таблицы и запрос, который я запускаю. Мне нужно, чтобы время результата на этом было как можно ниже. Я пробовал таблицы памяти, различные индексы и индексированные представления.Оптимизация больших таблиц В SQL Server 2014

ТАБЛИЦА СТРУКТУРА

CREATE TABLE cache.Tree 
(
CustomerID INT NOT NULL PRIMARY KEY NONCLUSTERED, 
RelationA_ID INT NOT NULL, 
RelationB_ID INT NOT NULL, 
NestedLevel INT NOT NULL, 
lft  INT NOT NULL, 
rgt  INT NOT NULL 
INDEX IX_LEGS CLUSTERED (lft, rgt), 
INDEX IX_LFT NONCLUSTERED (lft) 
) 

Отчет Запрос

SELECT 
tp.CustomerID AS DLine, 
t.CustomerID, 
t.RelationA_ID, 
Level = t.NestedLevel - tp.NestedLevel, 
IndentedSort = t.lft 
FROM cache.UnilevelTreeWithLC2 tp 
    INNER JOIN cache.UniLevelTreeWithLC2 t 
    ON t.lft between tp.lft AND tp.rgt 
    WHERE tp.CustomerID = 7664 

Любая помощь или руководство будет весьма признателен.

UPDATE 1: Запрос Выполнение плана Query Execution Plan

UPDATE 2: решаемые Я был в состоянии получить разрешение на отфильтровывать неактивных людей в дереве. Это сократило выполнение запроса почти наполовину, если я сохраню индексы, которые я помещаю в таблицу.

+0

Пожалуйста, разместите план запроса. Я подозреваю, что INDEX IX_LFT NONCLUSTERED (lft) не используется. Но с двумя другими индексами следует охватить объединение и где. И вы дефрагментировали индексы? – Paparazzi

+1

Вы еще смотрели план выполнения и статистику? Я рекомендую использовать эти статистические данные: 'SET STATISTICS IO ON' ' SET STATISTICS TIME ON', просто не забудьте выключить их. Используйте эти инструменты для сравнения ваших запросов и изменений индекса, а затем отправляйте свои вопросы вместе с результатами. – jkdba

+0

Я сомневаюсь, что любое индексирование поможет здесь быть честным. Вы возвращаете 4,2 миллиона из 5,3 миллиона строк. Это составляет 80% от общего количества строк в таблице. Большой вопрос: почему у вас есть отчет, показывающий 4,2 миллиона строк? –

ответ

1

Попробуйте forcescan - для запроса, который тянет 80% узкой таблицы, я ожидал бы, что SQL сканирует, но это может быть не из-за плохой статистики или одной из различных ошибок оценки мощности (которые исправлены, но требуют включения флагов для включения) ,

Я бы также выбрал celko-sets - один parent_id col сделает вашу таблицу еще более узкой, что должно ускорить эти случаи с пропускной способностью, избавит вас от обслуживания влево/вправо и будет очень быстрым с рекурсивными запросами.

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