Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Извикване на функция в клауза where

Както обикновено при SQL, заявката е до голяма степен без значение, без да се знае действителната схема, срещу която се използва.

Имате ли индекс на Members.Phone? Ако не, тогава няма значение как пишете заявката, всички те ще сканират цялата таблица и ще се представят по същия начин (т.е. ще се представят зле). Ако имате индекс тогава начинът, по който пишете заявката, прави цялата разлика:

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

Първата заявка е гарантирано оптимална, ще търси телефона в индекса.
Втората заявка зависи от характеристиките на dbo.FormatPhone. Може или не може да използва оптимално търсене.
Гарантирано е, че последната заявка е лоша. Ще сканира масата.

Освен това премахнах подсказката за NOLOCK, изглежда темата на деня... Вижте синтаксис за nolock в sql . NOLOCK е винаги грешен отговор. Използвайте изолация на моментни снимки.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Замяна на нулеви стойности в динамична обобщена sql заявка

  2. Уникалният ключ на Sql Server също ли е индекс?

  3. Разлика между дата и час в sqlserver?

  4. Entity Framework Database.SetInitializer просто не работи

  5. Как да получите стойността на автоматично нарастване на последния ред при вмъкване