sql >> Databáze >  >> RDS >> Sqlserver

SELECT TOP je pomalý, bez ohledu na ORDER BY

A tak začíná nešťastná hra „snažit se přelstít optimalizátora (protože ne vždy ví nejlépe)“.

Můžete zkusit vložit filtrované části do poddotazu nebo CTE:

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

Což může stačit k tomu, aby se nejprve přinutil filtrovat (ale optimalizátor je s každým vydáním „chytřejší“ a někdy dokáže prokouknout takovéto podvody). Nebo možná budete muset jít tak daleko, že vložíte tento kód do UDF . Pokud zapíšete UDF jako vícepříkazovou tabulkovou funkci s filtrováním uvnitř a poté se na UDF dotazujete pomocí TOP x /ORDER BY , docela dobře jste si vynutili pořadí dotazování (protože SQL Server aktuálně není schopen optimalizovat kolem vícepříkazových UDF).

Samozřejmě, když o tom přemýšlíme, zavedení UDF je jen způsob, jak skrýt to, co skutečně děláme - vytvořit dočasnou tabulku, použít jeden dotaz k jejímu naplnění (na základě filtrů WHERE), pak další dotaz k nalezení TOP x z tabulky temp.




  1. Jak vytvořit novou databázi v oracle 11g express edition?

  2. Existuje nějaký způsob/nástroj k identifikaci odhadované doby běhu dotazu v SQL sERVER

  3. pl/sql uložená procedura:název parametru stejný jako název sloupce

  4. AUTOMATICKÉ VYMAZÁNÍ ŘÁDKU 1 den po vložení (MySQL)