Optimisation du time de return SQL ADO

J'ai essayé les requêtes suivantes pour returnner un set de résultats à Excel en utilisant ADO.

MAX

SELECT DISTINCT Term FROM uSubjectivities WHERE account_no = '1172014' AND version_num = (SELECT max(Cast(version_num as Int)) from uSubjectivities WHERE account_no='1172014' AND SubjectivityID = '6472140') AND SubjectivityID = '6472140' AND TermType = 'Common' 

TOP 1)

 SELECT DISTINCT Term FROM uSubjectivities WHERE account_no = '1172014' AND version_num = (SELECT TOP (1) Cast(version_num as Int) FROM uSubjectivities WHERE account_no='1172014' AND SubjectivityID = '6472140' ORDER BY version_num DESC) AND SubjectivityID = '6472140' AND TermType = 'Common' 

MISE À JOUR JOINDRE

 SELECT DISTINCT Term FROM uSubjectivities S INNER JOIN ( SELECT TOP (1) Cast(version_num as Int) v FROM uSubjectivities WHERE account_no='1172014' And SubjectivityID = '6472140' ORDER BY version_num DESC ) mv ON mv.v = s.version_num WHERE SubjectivityID = '6472140' AND TermType = 'Common' 

Cependant, les deux prennent beaucoup plus de time que je voudrais (et mes users).

Max prend 14 secondes pour returnner 15 loggings (le type est varchar (max) car il peut s'agir de champs avec de longues strings de text). Le premier 1 prend 14 secondes. L'inscription prend 16 secondes

Tout paramètre à l'intérieur des guillemets simples est finalement passé dans la requête. Je cours la requête environ 6 fois (mais pourrait être plus ou less en fonction des parameters). Dans mon exemple, cette partie du code prend 42 secondes sur Max et 37 sur Top 1. 40 secondes pour Join.

Y a-t-il moyen d'optimiser cette vitesse? Pour l'instant, nous essayons d'éviter l'indexing puisque la database devra être réindexée à plusieurs resockets sur la route.

En outre, ces deux requêtes s'exécutent en nanosecondes dans SQLServer, donc je ne sais pas pourquoi elles sont si lentes dans ADO.

EDIT J'ai également chargé ceci dans une procédure stockée et appelé comme même de VBA. N'a pas aidé avec le time de return.

Vous pouvez essayer de vous débarrasser de la sous-requête et d'utiliser une command par en haut dans votre sélection principale:

 SELECT TOP 1 Term FROM uSubjectivities WHERE account_no = '1172014' AND SubjectivityID = '6472140' AND TermType = 'Common' ORDER BY version_num desc 

Voici une autre option pour n lignes:

 SELECT Term FROM (SELECT Term, RANK() over (ORDER BY version_num desc) AS RK FROM uSubjectivities WHERE account_no = '1172014' AND SubjectivityID = '6472140' AND TermType = 'Common') A WHERE RK = 1 

Vous rencontrez un problème appelé Sous-requête corrélée:

Dans une requête de database SQL, une sous-requête corrélée (également appelée sous-requête synchronisée) est une sous-requête (une requête nestede dans une autre requête) qui utilise des valeurs de la requête externe. Étant donné que la sous-requête peut être évaluée une fois pour chaque ligne traitée par la requête externe, elle peut être inefficace.

voir ici un autre exemple:

  SELECT employee_number, name FROM employees AS emp WHERE salary > ( SELECT AVG(salary) FROM employees WHERE department = emp.department); 

Pour résoudre cela, vous devez joindre le résultat au lieu de faire un autre choix dans votre premier choix, cochez cette réponse ici