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

АКТУАЛИЗИРАНЕ или СЛИВАНЕ на много големи таблици в SQL Server

Всъщност открих общи препоръки за такива заявки:Идеята за използване на SQL Merge или Update е много умна, но се проваля, когато трябва да актуализираме много записи (т.е. 75M ) в голяма и широка маса (т.е. 240M ).

Разглеждайки плана на заявката на заявката по-долу можем да кажем, че TABLE SCAN на ТАБЛИЦА 1 и окончателно MERGE отнемат 90% от времето.

MERGE TABLE1 as Target  
USING UTABLE as source  
ON Target.record_id = source.record_id   
WHEN MATCHED AND (condition) THEN   
    UPDATE SET Target.columns=source.columns

Така че, за да използваме MERGE, трябва да:

  1. Намалете броя на редовете, които трябва да актуализираме, и правилно предайте тази информация на SQL Server. Това може да стане, като направите UTABLE по-малък или посочващ допълнително condition което стеснява частта за сливане.
  2. Уверете се, че частта, която ще се слее, се побира в паметта, в противен случай заявката ще се изпълнява много по-бавно. Създаване на TABLE1 два пъти по-малко намали реалното ми време за търсене от 11 часа на 40 минути.

Както Марк спомена, можете да използвате UPDATE синтаксис и използвайте WHERE клауза за стесняване на частта за обединяване - това ще даде същите резултати. Също така, моля, избягвайте индексирането на TABLE1 тъй като това ще причини допълнителна работа за възстановяване на индекса по време на MERGE



  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 2008 Reporting Services

  2. BCP не връща грешки, но също така не копира никакви редове

  3. Конкатениране на стойности въз основа на ID

  4. WHERE IN (масив от идентификационни номера)

  5. SQL конвертиране на дата и час и изваждане на часове