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

Как мога да принудя подзаявка да работи толкова добре, колкото #temp таблица?

Има няколко възможни обяснения защо виждате това поведение. Някои често срещани са

  1. Подзаявката или CTE може да се преоценяват многократно.
  2. Материализиране на частични резултати в #temp таблицата може да наложи по-оптимален ред на свързване за тази част от плана, като премахне някои възможни опции от уравнението.
  3. Материализиране на частични резултати в #temp таблицата може да подобри останалата част от плана чрез коригиране на лошите оценки на кардиналността.

Най-надеждният метод е просто да използвате #temp маса и я материализирайте сами.

При липса на това по отношение на точка 1 вижте Предоставяне на намек за принудително междинно материализиране на CTEs или производни таблици . Използването на TOP(large_number) ... ORDER BY често може да насърчи резултатът да бъде буфериран, вместо да се преоценява многократно.

Дори и това да работи обаче, няма статистика за макарата.

За точки 2 и 3 ще трябва да анализирате защо не получавате желания план. Евентуално пренаписване на заявката, за да се използват предикати, които могат да се добавят, или актуализиране на статистика може да доведе до по-добър план. Ако не успеете, можете да опитате да използвате подсказки за заявка, за да получите желания план.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Сравнете колони, където една е подобна на част от друга

  2. Как да сравня SQL timestamp в .NET?

  3. Приоритет на заявка в MS SQL

  4. Опресняване на метаданни на потребителски функции t-SQL

  5. Елементите ORDER BY трябва да се появят в списъка за избор, ако изразът съдържа оператор UNION, INTERSECT или EXCEPT (SQL Server)