|
Uttalande 1: Prefixet % förtecken % jokerkort kommer att få SQL-frågor att stoppa indexet och istället använda full tabellskanning. Detta påstående är populärt Slutsatsen är fel Faktum är att detta uttalande inte är särskilt exakt. Jokerprefixet % gör SQL-sökningar efter index extremt effektiva, men i de flesta fall går det ändå till indexet (inget fulltextindex krävs, bara bygg ett vanligt index) SKAPA ICKE-KLUSTRAT INDEX [Ix_index namn] PÅ [dbo]. [wkf_ Bordsnamn]
( [db_title] ASC
) Avrätta vid denna tidpunkt VÄLJ TOPP 10 [db_id],[db_Summary],[db_AddDate],[db_title] FRÅN [bibliotekets namn]. [dbo]. [wkf_database] där [db_title]som '%dba%' ordning efter 1 beskrivning
Frågeplanen visas tydligt
Innan jämförelsen indexeras:
Som ett undantag, komplexa frågor Frågeoptimeraren kan överge indexet till förmån för fullständig tabellskanning. Detta gäller inte bara för SOM '%nyckelord%', utan också relaterat till frågekomplexitet
Påstående 2: Procentandel av jokerprefix gör att SQL-frågor indexeras istället för att inte indexeras
Detta påstående är mycket ensidigt, och 99 % av indexet kommer att minska IO och förbättra effektiviteten jämfört med att inte indexera, men nyckelmatchningsåtgärden efter att indexet hittats är också delvis prestationskrävande. Som visas i de två figurerna ovan, om nyckelorden enkelt matchas, hittar hela tabellskanningen snabbt datan, och indexskanningen sparar inte tillräckligt med tid för att kompensera för den tid som krävs för nyckelmatchningsåtgärden (de flesta online-sökningar har inte detta problem). Behandling: 1. Om du inte bryr dig om det är den extra prestandaförbrukningen inte särskilt stor. Och olika nyckelord har olika konsumtion, men vissa nyckelord har detta problem och kan ignoreras 2. Ett bättre sätt är att bygga ett överstyrningsindex (även kallat INCLUDE-index) om förhållandena tillåter det. Premiss: a. Lagringsutrymmet är tillräckligt, b påverkar inte DML-operationerna nämnvärt, och c har inga stora fält i det överskrivna indexet SKAPA ICKE-KLUSTRAT INDEX [Ix_index namn] PÅ [dbo]. [wkf_ Bordsnamn]
( [db_title] ASC
) INKLUDERA ( [db_id],[db_Summary],[db_AddDate]) Just nu är exekveringsfrågeplanen följande, vilket är mycket mer uppfriskande
Ovanstående är vad jag kan komma på nu för SQLSERVER som bearbetar SELECT * FROM TABLENAME SOM '%Keyword %'
|