J'utilise MS SQL et je dois exécuter plusieurs requêtes sur la même table selon différents critères. Au début, j'ai exécuté chaque requête sur la table d'origine, bien qu'elles partagent toutes un certain filtrage (c'est-à-dire la date, le statut). Cela a pris beaucoup de temps (environ 2 minutes).
Il y a des doublons dans les lignes de données et tous les index sont NON CLUSTERES. Je ne suis intéressé que par 4 colonnes pour mes critères et le résultat devrait afficher le nombre uniquement, pour toutes les requêtes.
colonnes nécessaires: TABLE
, FIELD
, AFTER
, DATE
et il y a un index sur chacun DATE
et TABLE
.
Après avoir créé une table temporaire avec uniquement les champs dont j'ai besoin, elle est descendue à 1:40 minutes, ce qui est toujours très mauvais.
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 ligne (s) affectée)
Étant donné que toutes les requêtes ne dépendent pas de la plage de dates, je ne l'ai pas incluse dans la requête. Le problème est qu'il faut plus de 1 minute pour insérer uniquement . L'insertion ci-dessus a pris 1:19 minutes
Je veux exécuter quelque chose comme ça pour plusieurs requêtes:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
C'est un problème avec l'insert plus que celui de la sélection, mais le temp a beaucoup moins de lignes que le tableau d'origine, ce qui pourrait être mieux que de parcourir le tableau plusieurs fois.
Comment puis-je optimiser cela?
ÉDITER
J'ai supprimé l'ID de tri, je pensais que le problème venait principalement de la sélection et non de l'insertion. C'était une supposition.
Je ne peux pas créer un unique sur n'importe quel index car il n'y a pas de champ ou de lignes uniques.
J'utilise SQL Server 2012.
Informations sur la table : il s'agit d'un segment de mémoire dont l'utilisation de l'espace est la suivante:
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'
, pourquoi n'essayez-vous pas d'optimiser chacune (requête) séparément? N'êtes-vous pas autorisé à ajouter des index à la table?
TABLE
et FIELD
de la #temp
table (toutes les lignes ont TABLE = 'OTB' AND FIELD = 'STATUS'
pour la table temporaire spécifique après tout.)
CREATE TABLE
instruction). Le vote négatif était dû au fait que la question n'était pas claire.