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

Как да подобря производителността на недетерминирана функция на колона в клауза where или join?

Освен недетерминираната функция, проблемът, който виждам, е, че правите изчисления върху поле. Това (обикновено) прави всеки индекс в полето неизползваем от заявката.

Вторият параграф на тази връзка (Десет често срещани грешки при програмиране на SQL (Функции върху индексирани колони в предикати) ) предоставя по-подробна информация за това кога се случва това, как да го избегнете и как понякога оптимизаторите могат да използват индекси въпреки използването на функции.

Накратко, вместо да разчитате на подобрени оптимизатори, често е възможно да промените заявката, като запазите полето непокътнато (без да правите каквито и да е изчисления върху него), но вместо това правите (обратни) изчисления към другите стойности. Във вашия случай до текущата дата, предоставена от GetDate() . След това заявката може да използва индекса на полето table1.Date .

Така че можете да използвате нещо като:

SELECT COUNT(*) 
FROM table1
WHERE table1.Date
      BETWEEN
             /* First Day of Current Month */
          AND 
             /* Last Day of Current Month */

И трябва само да намерите функции, които ви дават първия и последния ден от текущия месец.

Тази публикация в блога може да ви помогне:sql-server-query-to-find-first-and-last-day-of-current-month/

Още по-добре, този въпрос/отговор на StackOverflow:най-простият-начин-за-създаване-на-дата-която-е-първият-ден-от-месеца-даден -друга-дата

Ще трябва да тествам, но мисля, че тази малка вариация на горното ще свърши работа:

SELECT COUNT(*) 
FROM table1
WHERE table1.Date 
      >=      /* First Day of Current Month */
        DATEADD(mm, DATEDIFF(mm, 0, GetDate() ), 0) 
  AND table1.Date 
      <       /* First Day of Next Month */
        DATEADD(mm, 1 + DATEDIFF(mm, 0, GetDate() ), 0) 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Стартирайте Python Script от MSSQL

  2. Защо не Невалидно име на колона XYZ грешка в подзаявка; въпреки че името на колоната не е в таблицата на подзаявката?

  3. Как да намеря работещ порт на SQL Server?

  4. Codeigniter Вмъкване на данни MSSQL

  5. Известия за заявки на SQL Server в JAVA