Вы не можете ускорить SELECT
с индексами, если вы планируете получить все записи.Индексы хороши для выбора определенных строк с определенными критериями или выборки строк в определенном порядке (у вашего SELECT
также нет ORDER BY
).
Стоит упомянуть одну вещь - как вы загружаете своиТаблица.Использование CREATE TABLE
+ INSERT INTO
заставляет журнал SQL Server вставлять каждую строку и занимает намного больше времени, чем SELECT INTO
(без создания таблицы), в которой ведется минимальное ведение журнала.Обязательно правильно приведите типы данных из SELECT
, если вы переключитесь на этот подход.
Поэтому вместо:
IF OBJECT_ID('tempdb..#FinalResultTable') IS NOT NULL
DROP TABLE #FinalResultTable
CREATE TABLE #FinalResultTable
(
/*Columns*/
)
INSERT INTO #FinalResultTable
(
/*Columns*/
)
SELECT
/*Columns*/
FROM
/*Tables*/
Вы переключаетесь на:
IF OBJECT_ID('tempdb..#FinalResultTable') IS NOT NULL
DROP TABLE #FinalResultTable
SELECT
/*
Columns with the proper data type cast (if needed), for example:
Column1 = CONVERT(VARCHAR(100), Column1 + 'SomeText'),
Column2 = CONVERT(INT, VarcharColumn)
*/
INTO
#FinalResultTable
FROM
/*Tables*/
Если вы не упорядочиваете свои данные и просто используете эту временную таблицу для выбора всех строк позже, вы можете избежать создания любого индекса для него, так как для этого потребуетсяв то время как генерировать один или переупорядочить все данные (если они кластеризованы).Поэтому не создавайте кластеризованный индекс IX_FinalResultTable
, а также не объявляйте PRIMARY KEY
для своего столбца IDENTITY
, используйте RowNum INT IDENTITY
.Это сделает вашу временную таблицу кучей, а не реальной таблицей, помните, что большая часть отфильтрованного выбора значительно снизит производительность, если вы использовали поиск по [Partner #]
.
Если вам нужен кластерный индекс по[Partner #], [Disclosure Category]
, загрузка таблицы, уже упорядоченной этими двумя, фактически уменьшит время создания индекса.Обязательно создайте индекс после таблицы, загруженной, а не раньше, так как она быстрее.
SELECT
/*
Columns with the proper data type cast (if needed), for example:
Column1 = CONVERT(VARCHAR(100), Column1 + 'SomeText'),
Column2 = CONVERT(INT, VarcharColumn)
*/
INTO
#FinalResultTable
FROM
/*Tables*/
ORDER BY
[Partner #], -- Or the expression that resolves as this column
[Disclosure Category] -- Or the expression that resolves as this column
Также стоит отметить, что чем меньше столбцов у вас SELECT
, тем быстрее SELECT
будет.Скорость передачи также будет зависеть от сети между вашим клиентом и вашим сервером, а также от типа используемого соединения.