Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SELECT TOP działa wolno, niezależnie od ORDER BY

I tak zaczyna się niefortunna gra o „próbę przechytrzenia optymalizatora (ponieważ nie zawsze wie najlepiej)”.

Możesz spróbować umieścić fragmenty filtrujące w podzapytaniu lub CTE:

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

Co może wystarczyć, aby najpierw zmusić go do filtrowania (ale optymalizator staje się „mądrzejszy” z każdym wydaniem i czasami potrafi przejrzeć takie sztuczki). Być może będziesz musiał posunąć się nawet do umieszczenia tego kodu w UDF . Jeśli napiszesz UDF jako wielowyrazową funkcję z wartościami przechowywanymi w tabeli, z filtrowaniem w środku, a następnie zapytasz ten UDF za pomocą TOP x /ORDER BY , całkiem dobrze wymusiłeś kolejność zapytań (ponieważ SQL Server nie jest obecnie w stanie zoptymalizować wielostanowiskowych UDF).

Oczywiście, myśląc o tym, wprowadzenie UDF to tylko sposób na ukrycie tego, co tak naprawdę robimy - utworzenie tabeli tymczasowej, użycie jednego zapytania do jej wypełnienia (na podstawie filtrów WHERE), a następnie innego zapytania, aby znaleźć TOP x z tabeli tymczasowej.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sys.dm_exec_describe_first_result_set działa w SQL Server

  2. serwer sql jeden wiersz wiele kolumn w jednej kolumnie

  3. SQL grupujący podobne wartości

  4. SQL Server 2008 - Dodaj do ciągu w określonej pozycji w kolumnie nazwy

  5. Grupa SQL Server według liczby DateTime na godzinę?