Я використовую 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'
Виконати це -> (216598 ряд (и) задіяно)
Оскільки не всі запити покладаються на діапазон дат, я не включав його до запиту. Проблема полягає в тому, що для вставки потрібно лише більше 1 хвилини . Наведена вставка зайняла 1:19 хв
Я хочу запустити щось подібне для кількох запитів:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
Проблема із вставкою більше, ніж з виділенням, але темп має набагато менше рядків, ніж оригінальна таблиця, що може бути краще, ніж кілька разів проходити через таблицю.
Як я можу оптимізувати це?
EDIT
Я видалив ідентифікатор сортування, я вважав, що проблема полягає в основному з виділенням, а не вставкою. Це була здогадка.
Я не можу створити унікальний в жодному індексі, оскільки немає унікального поля чи рядків.
Я використовую SQL Server 2012.
Інформація про таблицю : Це купа і має таке використання місця:
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
заява). Голосування "за" було "через", оскільки питання було не ясно.