TSQL Merge Performance

Сценарий:

Имам таблица с приблизително 24 милиона записа. Таблицата има история на ценообразуването, свързана с отделни клиенти и се изчислява ежедневно. Има средно 6 милиона записа за всеки ден. Всяка сутрин се генерира ценовата листа и се изпълнява изявление за сливане, за да се отразят промените в техните цени.

Изявлението за сливане започва с вмъкване на предишни данни от предишния ден в таблица с променливи, след което тази таблица се обединява в действителната таблица. Основният проблем е, че изявлението за сливане отнема доста време.

Истинският ми въпрос е съсредоточен около ефективността на използването на таблица с променливи срещу физическа таблица срещу временна таблица. Каква е най-добрата практика за големи сливания като това?


person Tom S    schedule 21.01.2011    source източник
comment
В зависимост от това колко RAM имате, с 6M редове, има добър шанс SQL Server вече да преобразува променливата на вашата таблица във временна. маса зад кулисите.   -  person Joe Stefanelli    schedule 21.01.2011
comment
Оказва се, че TLOG се изгражда с много бърза скорост. Обработено с това чрез някои групови изтривания.   -  person Tom S    schedule 10.02.2011


Отговори (3)


Мисли

Бих помислил за временна таблица: те имат статистика, която ще помогне. Винаги се приема, че променливата на таблицата има един ред. Също така, IO може да бъде шунтиран на отделни устройства (ако приемем, че имате tempdb отделно)

Ако не е необходима единична транзакция, бих разделил MERGE също на последователност DELETE, UPDATE, INSERT, за да намаля количеството работа, необходимо за всяко действие (което намалява количеството необходима информация за връщане назад и количеството заключване и т.н.

person gbn    schedule 21.01.2011
comment
Здравейте gbn, можете ли да изясните това малко, моля, сър. Искате да кажете, че операцията T-SQL MERGE е по-скъпа от еквивалентните три отделни операции? - person John Sansom; 06.12.2012
comment
@JohnSansom: наистина не съм сигурен. Въпреки това прочетох някои неща (@AaronBertrand?), които предполагат, че MERGE може да е скъпо, може би ако правите jhe JFDI модел stackoverflow.com/search?q=user%3A27535+JFDI. Казвайки това, сега използвам MERGE много в SQL Server 2012 и не съм виждал никакви проблеми - person gbn; 07.12.2012

Временните таблици често се представят по-добре от променливите на таблицата за големи набори от данни. Освен това можете да поставите данните във временната таблица и след това да ги индексирате.

person HLGEM    schedule 21.01.2011

Проверете дали индексирате върху таблиците. Индексите ще се актуализират всеки път, когато добавите/изтриете записи в тази таблица.

Опитайте да премахнете индексите, преди да обедините записите и след това да го създадете отново след обединяването.

person acermate433s    schedule 21.01.2011
comment
Индексите наистина не са проблем, тъй като таблицата е много силно индексирана. Операторът за сливане не вмъква записите никъде, той се използва предимно за изхода, който се записва в csv файл за експортиране. - person Tom S; 21.01.2011
comment
@kaiopur: вашето изявление, изявлението за сливане не вмъква записите навсякъде, звучи коренно различно от вашия въпрос. Трябва да публикувате някакъв код. - person NotMe; 27.01.2011
comment

Гледайки какво се опитвате да направите, бих казал, че ajax е най-добрият подход. MVC вече съдържа Jquery, така че препоръчвам да го използвате.

По този начин можете първо да заредите падащия списък за студенти (минавайки от контролера) И след като потребителят е избрал студент, можете да заредите курсовете и предметите. По този начин можете да промените методите на вашите контролери, за да ограничите резултатите въз основа на това, което са избрали.

Ако искате да продължите с маршрута си, ще свърша работата по контролера и ще създам модел в движение. Бих казал, че можете да използвате динамичен обект, но това не преминава от контролера към изгледа. За да заобиколите това, можете да използвате речник.

var data = new Dictionary() data.Add("subjects", RepositoryHelper.GetStudentList()) data.Add("Courses", RepositoryHelper.GetCoursesList()) data.Add("subjects", RepositoryHelper.GetSubjectsList()) return Преглед (данни);

Лично аз бих избрал вариант 1.

- person Tom S; 04.02.2011