Estou usando o MS SQL e preciso executar várias consultas na mesma tabela com diferentes critérios. Inicialmente, executei cada consulta na tabela original, embora todas compartilhem alguma filtragem (por exemplo, data, status). Isso levou muito tempo (cerca de 2 minutos).
Existem duplicatas nas linhas de dados e todos os índices NÃO SÃO CLUSTERADOS. Estou interessado apenas em 4 colunas para meus critérios e o resultado deve gerar apenas a contagem, para todas as consultas.
colunas necessário: TABLE
, FIELD
, AFTER
, DATE
, e existe um índice em cada um dos DATE
e TABLE
.
Depois de criar uma tabela temporária com apenas os campos necessários, ela caiu para 1:40 minutos, o que ainda é muito ruim.
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'
Executar isto -> (216598 linhas afetadas)
Como nem todas as consultas dependem do período, não o incluí na consulta. O problema é que está demorando bem acima de 1 minuto para inserir apenas . A inserção acima levou 1:19 minutos
Eu quero executar algo parecido com isto para várias consultas:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
É um problema com a inserção mais do que a seleção, mas a temperatura tem muito menos linhas que a tabela original, o que poderia ser melhor do que passar pela tabela várias vezes.
Como posso otimizar isso?
EDITAR
Eu removi o ID de classificação, pensei que o problema estava principalmente no select e não no insert. Foi um palpite.
Não consigo criar um único em nenhum índice, pois não há campos ou linhas exclusivos.
Estou usando o SQL Server 2012.
Informações da tabela : É uma pilha e possui o seguinte uso de espaço:
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'
, por que você não tenta otimizar cada uma (consulta) separadamente? Você não tem permissão para adicionar índices à tabela?
TABLE
e FIELD
da #temp
tabela (afinal, todas as linhas têm TABLE = 'OTB' AND FIELD = 'STATUS'
para a tabela temporária específica).
CREATE TABLE
instrução). O voto negativo foi porque a questão não estava clara.