VYJR-COWI / jiraTest

0 stars 0 forks source link

[JAR-1693] Oprydning i Index Hints i JAR db #33

Closed VYJR-COWI closed 11 months ago

VYJR-COWI commented 1 year ago

Der er 9 objekter i JAR db som benytter Index Hints. Se vedhæftet sql.

Dette er skadeligt for SQL Server performance, da vi altid tvinger SQL Server til at bruge en bestemt Execution Plan, selvom SQL Server kunne komme op med en bedre plan for eksekvering af SQL Statement.

https://www.brentozar.com/blitz/query-hints-optimizer/, https://www.brentozar.com/archive/2010/03/2-features-of-sql-server-you-should-avoid/, https://www.brentozar.com/archive/2013/10/index-hints-helpful-or-harmful/.

Index Hints bør kun anvendes til at teste indexes og aldrig i produktionen.

Som eksempel, så anvender v_gisflader_hint Index Hint på IX_e_gis_spatial, selvom der ingen Spatial analyse sker i viewet. Dvs. vi har et View som performer ekstremt langsomt. Performance kan testes med:

WITH (INDEX(IX_e_gis_spatial),nolock) --Med Index Hint

WITH (nolock) --WITH (INDEX(IX_e_gis_spatial),nolock) --Uden Index Hint

Et andet eksempel er på jar_ngis_HentMatrikelInfo_sp hvor Index Hint anvendes på IX_e_gis_matrikel_spatial.

Her kan WITH(INDEX(IX_e_gis_matrikel_spatial)) udkomenteres og der testes om SQL Server selv vil bruge indekset. Det er præcis hvad der sker:

Cowi skal derfor fjerne Index Hints fra alle 9 objekter, samt teste at performance er mindst lige så god som tidligere. Hvis man forventer, at Spatial Index anvendes, så undersøges det om disse indexes så også bruges, uden Index Hints.
Da Syd har SQL Server 2014, så skal dette testes med Compatibility Mode 2014.

Cowi beskriver hvad de har gjort og hvordan, samt performance målinger før og efter.

Såfremt fjernelse af Index Hints ikke har en negativ Impact på performance, så implementeres disse ændringer i en release.


Originally reported by , imported from: Oprydning i Index Hints i JAR db
  • status: Closed
  • priority: D - Normal fejl
  • resolution: Fixed
  • resolved: 2023-12-20T12:53:17+01:00
  • imported: 2024-10-07
VYJR-COWI commented 1 year ago

557058:622a62a3-9bf2-41ae-8c7b-ca3a891081a8:

Det er svært at svare på hvor ofte de 8 SP er blevet brugt, samt det enkelte View. Det afhænger af planer i Cachen. Hvis Plan Cache er ustabil, så er information om brug af SP også mangelfuld.

I Region Sjælland tyder det på at jar_HentMatrikelEjere_sp og jar_ngis_HentMatrikelEjerInfo_sp ikke bliver brugt.

View v_gisflader_hint bruges i minimum wms tema Alle_godkendte og Alle_godkendte_filter, som anvendes ofte.

/* Hvor ofte køres SP så
https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-procedure-stats-transact-sql?view=sql-server-ver16
*/
SELECT TOP 10 d.object_id, d.database_id, OBJECT_NAME(object_id, database_id) 'SP',   
    d.cached_time, d.last_execution_time, d.total_elapsed_time,  
    d.total_elapsed_time/d.execution_count AS [avg_elapsed_time],  
    d.last_elapsed_time, d.execution_count  
FROM sys.dm_exec_procedure_stats AS d
WHERE OBJECT_NAME(object_id, database_id) IN
                                                                                (SELECT o.Name
                                                                                FROM        sys.sql_modules m INNER JOIN sys.objects o
                                                                                                    ON o.object_id = m.object_id
                                                                                WHERE   m.definition LIKE '%WITH%(Index%' )
ORDER BY SP ASC;
GO

Cached planer som anvender View v_gisflader_hint (tager lang tid at køre):

declare @search_string nvarchar(255)
set @search_string = 'v_gisflader_hint'

SELECT  DB_NAME(t.[dbid]) AS [Database Name], 
                t.text AS [Query Text],
                qs.total_worker_time AS [Total Worker Time], 
                qs.total_worker_time/qs.execution_count AS [Avg Worker Time], 
                qs.max_worker_time AS [Max Worker Time], 
                qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], 
                qs.max_elapsed_time AS [Max Elapsed Time],
                qs.total_logical_reads/qs.execution_count AS [Avg Logical Reads],
                qs.max_logical_reads AS [Max Logical Reads], 
                qs.execution_count AS [Execution Count], 
                qs.creation_time AS [Creation Time],
                qp.query_plan AS [Query Plan]
FROM        sys.dm_exec_query_stats AS qs WITH (NOLOCK)
                CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t 
                CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp 
WHERE CAST(query_plan AS NVARCHAR(MAX)) LIKE ('%' + @search_string + '%')
                AND t.[dbid] = DB_ID()
ORDER BY qs.total_worker_time DESC
OPTION (RECOMPILE);
GO
VYJR-COWI commented 1 year ago

557058:622a62a3-9bf2-41ae-8c7b-ca3a891081a8:

Bemærk, at hvis Index hints ikke længere anvendes, så bliver v_gisflader_hint overflødig, da det tilsvarende View v_gisflader blot kan anvendes.

VYJR-COWI commented 1 year ago

557058:d4aadeb7-abfa-4df0-8db0-03abecf92fe8:

Kim Jacobsen

Hej Kim,

Kan du godkende vores overslag på analysen af JAR-1693 Closed på følgende?
Seniorkonsulent: 40 timer
Projektleder: 4 timer
Pris: 38768 DKK

Analysen beskrives med følgende trin:

Mvh

Anders

VYJR-COWI commented 1 year ago

557058:622a62a3-9bf2-41ae-8c7b-ca3a891081a8:

Hvis dette er en analyse, så kan det ikke godkendes. Det er en opgave som skal udføres.

VYJR-COWI commented 1 year ago

557058:c389ac26-5aa4-43e2-bf4c-7b2c3cde322c:

Peter Riis

Der udarbejdes script til at kunne køres hos regionerne.

VYJR-COWI commented 1 year ago

557058:622a62a3-9bf2-41ae-8c7b-ca3a891081a8:

Så er det godkendt

VYJR-COWI commented 1 year ago

557058:55eec49a-f472-4fa2-8785-468150a6a64e:

Godkendt af region syd.

VYJR-COWI commented 1 year ago

5eb3a538e3c0900b9361c732:

Hej Anders Rosengreen

Hermed godkendes analyse & udviklingsarbejde (scripts) svarende til:

Seniorkonsulent: 40 timer
Projektleder: 4 timer
Pris: 38768 DKK

mvh

Kim

VYJR-COWI commented 1 year ago

6169441d2f6aed00684383e4:

Hej Peter Riis

Jeg finder nogle flere WITH INDEX hvis jeg modificere din query en smule:

WHERE m.definition LIKE '%WITH%Index%'

Fx finder jeg denne:

FROM e_gis gf WITH (nolock,INDEX(IX_e_gis_spatial))

Det betyder at der i stedet for 9, findes 15 objekter.

Opklarende spørgsmål:

  1. skal de 6 ekstra objekter inkluderes i dette issue?

Mvh Magnus

VYJR-COWI commented 1 year ago

557058:622a62a3-9bf2-41ae-8c7b-ca3a891081a8:

Hej Magnus-Matias Isbrand Høirup .

Tak for input. Ja, de skal inkluderes. Vi vil ikke have index hints i databasen.

VYJR-COWI commented 1 year ago

6169441d2f6aed00684383e4:

Hej Peter Riis

Jeg kommer til at skulle bruge længere tid på at teste de ekstra objekter. Noget af det som kan komme til at tage tid er at finde ud af hvordan de bruges, hvis de ikke er refereret direkte i koden, men kaldes via andre objekter i databasen.
I forhold til at teste performance kan det være der være variation og caching som gør det svært at få retvisende resultat.

Opklarende spørgsmål

  1. Jeg vil sammen med en af de andre udviklere finde ét realistisk eksempel at teste med, for hvert objekt. Dvs. en query som kunne være afviklet på baggrund af en bruger interaktion i GUI. Eksekveringstiden for hver query måles én gang, før og efter index hint er fjernet.
    Kan i godkende den fremgangsmåde at teste på?
  2. Hvis index hints fjernes fra “v_gisflader_hint”, giver navnet ikke længere mening. Der findes allerede et view kaldet “v_gisflader”, som har samme funktion.
    Skal vi undersøge om v_gisflader_hint, kan slettes?
VYJR-COWI commented 1 year ago

557058:622a62a3-9bf2-41ae-8c7b-ca3a891081a8:

Magnus-Matias Isbrand Høirup

  1. Det er ok, men performance kan også måles direkte i SSMS. Her er det vigtigt at se på hvilken plan der laves i forhold til den med Hints. Jeg går ud fra at det er optimalt at der anvendes et spatialt index.
  2. Hvis Index Hint fjernes fra “v_gisflader_hint“, så vil det være identisk med v_gisflader. Dermed bliver “v_gisflader_hint“ overflødigt og vil kunne slettes.

Jeg er med på at det kan komme til at tage længere tid, men måske ikke så meget. Lad os tage udgangspunkt i et eksempel og evt. tage et kort møde hvor vi ser på det sammen.

VYJR-COWI commented 1 year ago

6169441d2f6aed00684383e4:

Hej Peter Riis
Lad os gøre det. Er der et tidspunkt der passer dig?
Jeg har ingen møder i dag og du kan ringe til mig via Teams (mi@cowi.dk)

VYJR-COWI commented 1 year ago

6169441d2f6aed00684383e4:

aftalte med Peter Riis at teste performance for objekterne, med og uden index hints via:

set statistics io, time on;

og ved at tjekke execute planen for om de samme indexes bruges, når hints er fjernet.

VYJR-COWI commented 1 year ago

6169441d2f6aed00684383e4:

Hej Peter Riis
Jeg har ikke kunne se nogen klar forskel i performance.

Har inkluderet queries, hvor alle objekter med postfix “_test_mi“ har fået fjernet index hint:

hint_noHint.sql

resultater er i markdown. Sig til hvis jeg skal sende dem i et andet format.

performance.md

Skal jeg gå videre med opgaven og lave update scripts til at fjerne index hints?

VYJR-COWI commented 1 year ago

557058:622a62a3-9bf2-41ae-8c7b-ca3a891081a8:

Det ser fint ud. Statistikken viser det forventede resultat af testen.

VYJR-COWI commented 1 year ago

6169441d2f6aed00684383e4:

Hej Peter Riis
Filip spurgte om jeg kunne dele info om testen, men alle gemte resultater findes i filen performance.md, så jeg har ikke noget ud over det.
Er det noget specifikt som du tænkte på?

VYJR-COWI commented 1 year ago

557058:622a62a3-9bf2-41ae-8c7b-ca3a891081a8:

Hej Magnus-Matias Isbrand Høirup

Jeg vil gerne have at I lige laver en opsamling / resumé på det arbejde du har udført.

F.eks., at alle index hints er blevet fjernet, samt at testen viste at de forventede spatiale index blev benyttet, samt at performance ikke gik ned. Altså en pæn opsamling på issuet.

VYJR-COWI commented 1 year ago

6169441d2f6aed00684383e4:

Hej Peter Riis

Hermed en opsummering.

  1. Udfasning af Index Hints: Samtlige Index Hints er blevet fjernet fra de 15 objekter (både de oprindeligt identificerede 9 objekter samt de yderligere 6 objekter, som blev fundet i databasen).
  2. Performance test: Der er foretaget performance-målinger både før og efter fjernelse af Index Hints. Disse tests er udført i Kompatibilitetstilstand 2014, og viser ingen negativ indflydelse på performance.
  3. Spatialt Index: Som en del af processen har vi også undersøgt, om SQL Server automatisk ville benytte de forventede spatiale indeks. Dette var tilfældet.
  4. Dokumentation: Testresultater findes i Markdown filen performance.md.
  5. Redundant View: Efter fjernelse af Index Hints kunne vi konkludere, at v_gisflader_hint nu er blevet redundant og derfor bliver slettet, da det er identisk med v_gisflader.
VYJR-COWI commented 1 year ago

557058:622a62a3-9bf2-41ae-8c7b-ca3a891081a8:

Perfekt! Tak.

VYJR-COWI commented 11 months ago

557058:622a62a3-9bf2-41ae-8c7b-ca3a891081a8:

Jeg kan ikke selv teste denne, da jeg ikke hare adgang til databasen.
Tom Birch Hansen , har du mulighed for at tjekke om der er ryddet op i index hints? Se scripts på issuet.

VYJR-COWI commented 10 months ago

557058:ed1eff09-a56d-46ea-ac1a-1cc75f509e96:

Peter Riis Når jeg kører scriptet ‘index hints.sql’ på jar_test databasen, kan jeg se at den finder een post:
dbo.jar_HentMatrikelEjere_sp
Er der andet jeg kan gøre for at checke efter hints?

VYJR-COWI commented 10 months ago

557058:622a62a3-9bf2-41ae-8c7b-ca3a891081a8:

Tom Birch Hansen , vil du tjekke at “index hint” delen er udkommenteret? Og evt. vedhæftet definitionen på dbo.jar_HentMatrikelEjere_sp?

VYJR-COWI commented 10 months ago

557058:ed1eff09-a56d-46ea-ac1a-1cc75f509e96:

Peter Riis Jeg kan se at det er udkommenteret i dbo.jar_hentmatrikelejere_sp, dvs der er ingen hints

VYJR-COWI commented 10 months ago

557058:622a62a3-9bf2-41ae-8c7b-ca3a891081a8:

Tak, jeg lukker issue.

VYJR-COWI commented 1 month ago

[Originally blocks: RSJAELLAND-96]

VYJR-COWI commented 1 month ago

[Originally blocks: JAR-1609]