sql >> Database >  >> RDS >> Sqlserver

Functieaanroep in waar clausule

Zoals gebruikelijk bij SQL, is de query grotendeels irrelevant zonder te weten dat het eigenlijke schema wordt gebruikt.

Heeft u een index op Members.Phone? Zo nee, dan maakt het niet uit hoe je de query schrijft, ze gaan allemaal de hele tabel scannen en hetzelfde uitvoeren (d.w.z. slecht presteren). Als je wel een index hebt dan maakt de manier waarop je de query schrijft het verschil:

SELECT * FROM Members WHERE Phone= @Phone;
SELECT * FROM Members WHERE Phone= dbo.FormatPhone(@Phone);
SELECT * FROM Members WHERE  dbo.FormatPhone(Phone)[email protected];

Eerste zoekopdracht is gegarandeerd optimaal, zoekt de telefoon op de index.
Tweede zoekopdracht hangt af van de kenmerken van de dbo.FormatPhone. Het kan al dan niet een optimale zoekactie gebruiken.
Laatste zoekopdracht is gegarandeerd slecht. Zal de tafel scannen.

Ook heb ik de NOLOCK-hint verwijderd, het lijkt het thema van de dag... Zie syntaxis voor nolock in sql . NOLOCK is altijd het verkeerde antwoord. Gebruik snapshot-isolatie.



  1. Records van de afgelopen 3 maanden alleen retourneren in MySQL

  2. Soorten SQL-opdrachten

  3. PostgreSQL UNIX-domeinsockets versus TCP-sockets

  4. Laravel:SQLSTATE [HY000] [2054] De door de server gevraagde authenticatiemethode onbekend bij de client