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

SELECT TOP е бавен, независимо от ORDER BY

И така започва злополучната игра на „опит за надхитряне на оптимизатора (защото той не винаги знае най-добре)“.

Можете да опитате да поставите филтриращите части в подзаявка или CTE:

SELECT TOP 30 *
FROM
   (SELECT *
   FROM myview, foo, bar 
   WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;

Което може да е достатъчно, за да го принуди първо да филтрира (но оптимизаторът става „по-умен“ с всяко издание и понякога може да прозре подобни шенаниги). Или може да се наложи да поставите този код в UDF . Ако напишете UDF като функция с таблична стойност с множество изрази, с филтрирането вътре, и след това направите заявка за този UDF с вашия TOP x /ORDER BY , доста добре сте наложили реда на заявките (тъй като SQL Server в момента не може да оптимизира около UDFs с множество изрази).

Разбира се, мислейки за това, въвеждането на UDF е просто начин да скрием това, което наистина правим - създаване на временна таблица, използване на една заявка, за да я попълните (на базата на WHERE филтри), след това друга заявка, за да намерите TOP x от временната таблица.




  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 Server Profiler за SQL Server Express?

  2. Преброяване на редове за всички таблици наведнъж

  3. Параметризирана динамична sql заявка

  4. SQL Server тригери - ред на изпълнение

  5. Множество индекси срещу индекси с няколко колони