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

избор на оператор на оптимизатора на заявки - вложени цикли срещу хеш съвпадение (или сливане)

АБСОЛЮТНО. Хеш съвпадението би било огромно подобрение. Създаването на хеша на по-малката таблица с 19 223 реда и след това проучването му с по-голямата таблица с 65 991 реда е много по-малка операция от вложения цикъл, изискващ 1 268 544 993 сравнения на редове.

Единствената причина сървърът да избере вложените цикли е, че е подценил силно броя на включените редове. Вашите таблици имат ли статистика за тях и ако да, актуализират ли се редовно? Статистиката е това, което позволява на сървъра да избира добри планове за изпълнение.

Ако правилно сте адресирали статистиката и все още имате проблем, можете да го принудите да използва HASH присъединяване по следния начин:

SELECT *
FROM
   TableA A -- The smaller table
   LEFT HASH JOIN TableB B -- the larger table

Моля, обърнете внимание, че в момента, в който направите това, ще се задейства и редът за присъединяване. Това означава, че трябва да подредите всичките си таблици правилно, така че техният ред на свързване да има смисъл. Обикновено бихте проучили плана за изпълнение, който сървърът вече има, и промените реда на вашите таблици в заявката, за да съответства. Ако не сте запознати с това как да направите това, основното е, че всеки „ляв“ вход е първи, а в графичните планове за изпълнение левият вход е долният един. Сложно обединяване, включващо много таблици, може да трябва да групира обединенията заедно в скоби или да използва RIGHT JOIN за да получите оптимален план за изпълнение (разменете левия и десния вход, но въведете таблицата в правилната точка в реда на свързване).

Като цяло е най-добре да избягвате използването на съвети за присъединяване и принудителното присъединяване към реда, така че първо направете каквото можете! Можете да разгледате индексите на таблиците, фрагментацията, намаляването на размерите на колоните (като използване на varchar вместо nvarchar където Unicode не се изисква), или разделяне на заявката на части (първо вмъкнете във временна таблица, след което се присъединете към нея).



  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

  2. Свързване към база данни на SQL Server 2012 с C# (Visual Studio 2012)

  3. Вмъкване на повече от 1000 реда от Excel в SQLServer

  4. SQL Server - булев литерал?

  5. SQL заявка за връщане на последния запис за всеки ID