Я использую MS SQL, и мне нужно выполнить несколько запросов к одной и той же таблице по разным критериям. Сначала я выполнял каждый запрос в исходной таблице, хотя все они имеют некоторую фильтрацию (т. Е. Дата, статус). Это заняло много времени (около 2 минут).
В строках данных есть дубликаты, и все индексы НЕКЛАСТЕРИРОВАНЫ. Меня интересуют только 4 столбца для моих критериев, и результат должен выводить только количество для всех запросов.
колонны необходимо: TABLE
, FIELD
, AFTER
, DATE
, и есть индекс по каждому из DATE
и TABLE
.
После создания временной таблицы только с теми полями, которые мне нужны, она сократилась до 1:40 минут, что все еще очень плохо.
CREATE TABLE #TEMP
(
TABLE VARCHAR(30) NULL,
FIELD VARCHAR(30) NULL,
AFTER VARCHAR(1000) NULL,
DATE DATETIME,
SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)
INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
SELECT TABLE, FIELD, AFTER, DATE
FROM mytbl WITH (NOLOCK)
WHERE TABLE = 'OTB' AND
FIELD = 'STATUS'
Runnig this -> (216598 строка (и) затронута)
Поскольку не все запросы зависят от диапазона дат, я не включил его в запрос. Проблема в том, что для вставки требуется более 1 минуты . Вышеуказанная вставка заняла 1:19 мин.
Я хочу запустить что-то вроде этого для нескольких запросов:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
Это проблема с вставкой больше, чем с выделением, но у temp гораздо меньше строк, чем в исходной таблице, что может быть лучше, чем проходить через таблицу несколько раз.
Как я могу оптимизировать это?
РЕДАКТИРОВАТЬ
Я удалил идентификатор сортировки, я думал, что проблема была в основном с выбором, а не вставкой. Это было предположение.
Я не могу создать уникальный для любого индекса, так как нет уникального поля или строк.
Я использую SQL Server 2012.
Таблица Info : Это куча и использует следующее пространство:
name rows reserved data index_size unused
mytbl 24869658 9204568 KB 3017952 KB 5816232 KB 370384 KB
SELECT COUNT(*) AS COUNT FROM original_table WHERE AFTER = 'R' AND DATE >= '2014-01-01' AND DATE < '2015-01-01'
, почему бы вам не попробовать оптимизировать каждый (запрос) по отдельности? Вам не разрешено добавлять индексы в таблицу?
TABLE
и FIELD
столбцы из #temp
таблицы (все строки имеют TABLE = 'OTB' AND FIELD = 'STATUS'
для таблицы конкретного темпа после всех.)
CREATE TABLE
утверждение). Падение было вызвано тем, что вопрос не был ясным.