2016-09-27 3 views
-2

Ich habe die folgende Abfrage, die etwa 20-30 Sekunden dauert, um ein Ergebnis zu produzieren. Ich möchte die Ergebniszeit runterziehen, ich benutze Zugriff auf das Frontend, um Abfragen und SQL Server auf dem Backend zu erstellen. Nicht sicher, ob es einen einfacheren Weg und einen schnelleren Weg zum Ausführen dieser Abfrage gibt.Warum dauert meine Abfrage so lange, bis das Ergebnis

Hier ist meine Frage:

SELECT DISTINCT 
    [UB-04s].client_id, 
    DATEDIFF("yyyy", [UB-04s]![patient_dob], [UB-04s]![admit_date]) AS [AGE at Admission], 
    invalid_diag_codes_by_age.start_age_yrs, 
    invalid_diag_codes_by_age.end_age_yrs, 
    invalid_diag_codes_by_age.diag_code 
INTO 
    tmp10407 
FROM 
    [UB-04s], invalid_diag_codes_by_age 
WHERE 
    ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_Q)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_P)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_O)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_N)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_M)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_L)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_K)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_J)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_I)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_H)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_G)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_F)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_E)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_D)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_C)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_B)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_A)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].principal_dx)=[invalid_diag_codes_by_age].[diag_code])); 

THESE gerade aus den Tabellen sind SCHNIPSEL AS THESE große Tische ...

SIND

Felder der Tabelle UB04s:

client_id principal_dx dx_A dx_B dx_C dx_D dx_E dx_F dx_G dx_H dx_I dx_J dx_K dx_L dx_M dx_N dx_O dx_P dx_Q 
527                  
530  42843 4280 4148 41519 42741 4271 5849 5770 5739  99702 431 2760 44422 28981 28984 2384 78551 42611 
531  5715 44489 34839 0785 99682 4589 5723 2762 42518  99779 99811 5180 2689 2769 57142 5680 4471 2894 
533  5559 V145                 
116  2761 7802 4019 2724 V1582 2768             
117  55321  

Felder aus INVALID DIAG CODES TABLE:

diag_code start_age_yrs end_age_yrs age_range_desc 
04041   0    0.5   0-6 months of age  
27701   0    1   
3070   18    99   
99779   0    1   
5559   15    99   

Im Grunde durchsuche ich alle Diagnosecodes für einen Client, um festzustellen, ob es sich um einen ungültigen Diagnosecode basierend auf dem Alter des Clients handelt.

+2

Sie haben ein Kreuz in es kommen, weil Sie eine durch Kommata getrennte Liste von Tabellen verwendet, und umfassen nicht die Joinvergleichselemente in der where-Klausel. Dies ist eine schlechte Möglichkeit, Abfragen zu schreiben. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx Auch scheint es, dass Sie einige ernsthafte Normalisierungsprobleme haben hier. Sie scheinen sich wiederholende Gruppen zu haben, die gegen 1NF verstoßen und unzählige Schmerzen verursachen. Zu guter Letzt ist die DATEDIFF-Funktion keine gültige SQL-Server-Syntax. –

+1

Ohne zu wissen, wie die Tabellen aussehen und was Sie erreichen möchten, wäre es schwierig, dies für Sie neu zu schreiben. Aber ich muss sagen, dass es sehr schlecht geschrieben scheint. Ich stelle mir vor, dass Sie anstelle einer Kreuzverbindung eine innere Verbindung verwenden können und anstelle Ihrer riesigen Liste von Kontingenzen eine Klausel "WHERE x IN()". – Sturgus

+0

Ich kann keinen Join verwenden, da dies zu unerwünschten Ergebnissen führen würde. Kunden haben mehrere Diagnosecodes, die in separaten Feldern gespeichert werden müssen, die dann mit einer anderen Tabelle verglichen werden, die alle Diagnosecodes in einer Spalte auflistet. Das Problem, wenn ich einen Beitritt einfüge, gibt es mir unnötige diag Codes, die nicht an den Klienten gebunden sind. – SikRikDaRula

Antwort

1

ohne wirkliche Details mit zu arbeiten, und ich bin zu raten, ganz wie zu dem, was Sie wollen. Die Verwendung von Aliasen und das Entfernen aller zusätzlichen Klammern helfen jedoch erheblich. Ich habe auch IN anstelle der wiederholten Prädikate verwendet. Das wird nicht genau so funktionieren, ist aber ziemlich nah.

SELECT DISTINCT u.client_id 
    , DateDiff(year, [UB-04s]![patient_dob], [UB-04s]![admit_date]) AS [AGE at Admission] 
    , i.start_age_yrs 
    , i.end_age_yrs 
    , i.diag_code 
INTO tmp10407 
FROM [UB-04s] u 
cross join invalid_diag_codes_by_age i 
WHERE u.client_id = [Forms]![frmUB04s]![client_id] 
AND 
(
    u.dx_Q = i.diag_code 
) 
OR 
(
    u.principal_dx = i.diag_code 
    AND 
    i.diag_code in 
    (
     u.dx_P 
     , u.dx_O 
     , u.dx_N 
     , u.dx_M 
     , u.dx_L 
     , u.dx_K 
     , u.dx_J 
     , u.dx_I 
     , u.dx_H 
     , u.dx_G 
     , u.dx_F 
     , u.dx_E 
     , u.dx_D 
     , u.dx_C 
     , u.dx_B 
     , u.dx_A 
    ) 
) 
+0

Dank @Sean Lange, Ihre Antwort hat mir, was ich mit einigen Feinabstimmungen benötigt. Hier ist meine letzte Abfrage, die innerhalb von 3-5 Sekunden zurückgegeben wird. – SikRikDaRula

0
SELECT DISTINCT u.client_id, DateDiff("yyyy",u.patient_dob,u.admit_date) AS [AGE at Admission], i.start_age_yrs, i.end_age_yrs, i.diag_code INTO tmp10407 
FROM [UB-04s] AS u, invalid_diag_codes_by_age AS i 
WHERE (((u.client_id)=[Forms]![frmUB04s]![client_id]) 
AND ((i.diag_code) In ([u].[dx_P],[u].[dx_O],[u].[dx_N],[u].[dx_M],[u].[dx_L],[u].[dx_K],[u].[dx_J],[u].[dx_I],[u].[dx_H],[u].[dx_G],[u].[dx_F],[u].[dx_E],[u].[dx_D],[u].[dx_C],[u].[dx_B],[u].[dx_A]))) 
OR (((u.client_id)=[Forms]![frmUB04s]![client_id]) 
AND ((u.principal_dx) In ([i].[diag_code]))); 
Verwandte Themen