forvalgs_navn_udland = CASE b.oper_prefix_code WHEN a.forvalgs_kode_udland THEN b.oper_name ELSE '' End, forvalgs_navn_indland = CASE b.oper_prefix_code WHEN a.forvalgs_kode_indland THEN b.oper_name ELSE '' End
FROM dbo.BALI_AFS_UGE_0 A LEFT JOIN dbo.bali_r3502_ref_forvalg B ON (A.forvalgs_kode_indland = B.oper_prefix_code OR A.forvalgs_kode_udland = B.oper_prefix_code) AND b.start_date <= (convert(varchar,getdate(),101)) AND ( B.end_date > (convert(varchar,getdate(),101)) OR B.end_date is null ) LEFT JOIN dbo.bali_r3502_ref_serv_prod C ON A.service_provider_kode=C.source_system_code LEFT JOIN dbo.bali_r3502_ref_kategori D ON A.kat=D.kat WHERE (UPPER(A.ENHED) IN (SELECT UPPER(authValue) AS enhed FROM dbo.RowAccessControl WHERE userId = DBO.getSuser_Sname() AND systemId = 'BALI' AND startDate <= getDate() AND (endDate > getdate() OR endDate IS NULL)))
/Kristian :-)
p.s. Da der kan være mange gode tiltag vil jeg formodentlig splitte pointene til de forskellige.
B.end_date er vel af typen datetime, saa hvorfor laver du en convert ? plus du kan prove at smide et index paa den kolonne
Jeg vil tro at dette kode: (A.forvalgs_kode_indland = B.oper_prefix_code OR A.forvalgs_kode_udland = B.oper_prefix_code) er noget der traekker taender ud, du bor ihvertfald prove at indexere dem desuden kan jeg se at du konvertere til UPPER(), har du med vilje sat collation til case-sensitive, ellers er det ogsaa vaerdilost
Du bor kore en "Profiler" paa din query og saa hvad MSSQL foreslaar at du gør
from (select * from dbo.BALI_AFS_UGE_0 WHERE (UPPER(ENHED) IN (SELECT UPPER(authValue) AS enhed FROM dbo.RowAccessControl WHERE userId = DBO.getSuser_Sname() AND systemId = 'BALI' AND startDate <= getDate() AND (endDate > getdate() OR endDate IS NULL)))) A
Ideen er, at den tabel med flest poster skal du have hentet et begrænset antal poster først.
I profiler laver du lidt tracking over det load du vil analysere, saa korer du din query nogle gange, saa smider du det load ind i "Index Tuning Wizard" som kigger din DB igennem i henhold til din query og foreslaar nogle optimeringer
dbo.bali_afs_uge_0 indeholder ifølge dit udsagn 37.000 poster. Mit forslag er at lave en subquery, hvor du henter de poster, der skal bruges fra tabellen.
Med fare for at jeg har misforstået dig mener jeg ikke at det gav noget :-( Faktisk kørte det 2 sec længere.
Sådan ser det ud nu:
FROM ( select * from dbo.BALI_AFS_UGE_0 WHERE ENHED IN (SELECT authValue AS enhed FROM dbo.RowAccessControl WHERE userId = DBO.getSuser_Sname() AND systemId = 'BALI' AND startDate <= getDate() AND (endDate > getdate() OR endDate IS NULL)) ) A LEFT JOIN dbo.bali_r3502_ref_forvalg B ON (A.forvalgs_kode_indland = B.oper_prefix_code OR A.forvalgs_kode_udland = B.oper_prefix_code) AND b.start_date <= (convert(varchar,getdate(),101)) AND ( B.end_date > (convert(varchar,getdate(),101)) OR B.end_date is null ) LEFT JOIN dbo.bali_r3502_ref_serv_prod C ON A.service_provider_kode=C.source_system_code LEFT JOIN dbo.bali_r3502_ref_kategori D ON A.kat=D.kat
FROM ( select * from dbo.BALI_AFS_UGE_0 WHERE ENHED IN (SELECT authValue AS enhed FROM dbo.RowAccessControl WHERE userId = DBO.getSuser_Sname() AND systemId = 'BALI' AND GetDate() between StartDate and IsNull(EndDate, '99991231')) ) A LEFT JOIN dbo.bali_r3502_ref_forvalg B ON (A.forvalgs_kode_indland = B.oper_prefix_code OR A.forvalgs_kode_udland = B.oper_prefix_code) AND b.start_date <= (convert(varchar,getdate(),101)) AND ( B.end_date > (convert(varchar,getdate(),101)) OR B.end_date is null ) LEFT JOIN dbo.bali_r3502_ref_serv_prod C ON A.service_provider_kode=C.source_system_code LEFT JOIN dbo.bali_r3502_ref_kategori D ON A.kat=D.kat
FROM ( select * from dbo.BALI_AFS_UGE_0 WHERE ENHED IN (SELECT authValue AS enhed FROM dbo.RowAccessControl WHERE userId = DBO.getSuser_Sname() AND systemId = 'BALI' AND GetDate() between StartDate and IsNull(EndDate, '99991231')) ) A LEFT JOIN dbo.bali_r3502_ref_forvalg B ON (A.forvalgs_kode_indland = B.oper_prefix_code OR A.forvalgs_kode_udland = B.oper_prefix_code) AND GetDate() between b.start_date and IsNull(b.End_Date, '99991231')) LEFT JOIN dbo.bali_r3502_ref_serv_prod C ON A.service_provider_kode=C.source_system_code LEFT JOIN dbo.bali_r3502_ref_kategori D ON A.kat=D.kat
Jeg takker for hjælpen! Ikke helt hvad jeg havde håbet på, men jeg prøver at rode videre :-)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.