Приемането на добър SQL синтаксис и практики за писане на заявки ще подобри ефикасността на наблюдението на вашата база данни и като резултат ще подобри цялостната ви производителност на базата данни. Има няколко изпитани начина за подобряване на производителността на базата данни чрез корекции на синтаксиса и заявките. Избрахме 5, върху които да се съсредоточим.
1. CASE изрази
Ето няколко най-добри практики за постигане на най-добра производителност от CASE изразите:
- CASE изразите подобряват производителността, като преместват стария процедурен код в декларативен код, който след това може да бъде оптимизиран. За основни CASE изрази използвайте
, който е най-лесно оптимизиран. За разширени CASE изрази, хеширането и други техники ще бъдат най-полезни. - Тъй като КОГАТО клаузите се тестват отляво надясно, най-добре е да подредите клаузите си така, че най-вероятните да са изброени първи. Това ще намали времето, прекарано за ненужно сканиране.
- Повечето оптимизатори също отчитат излишните тестове, като вземат предвид реда на изпълнение. Веднага след като клауза WHEN се изпълни, няма нужда да се тества отново тази клауза. Въпреки това много оптимизатори не са добри в четенето на вложени CASE изрази, така че е най-добре да ги изравнявате до едно ниво.
2. Двойно потапяне и клауза за прозорец
В SQL „двойно потапяне“ означава посещение на една и съща таблица повече от веднъж, което забавя заявката ви. В идеалния случай се опитайте да свършите цялата си работа с едно посещение на масата. Но ако това не е възможно, има няколко начина за смекчаване на въздействието върху производителността.
Използването на временни таблици, изградени от една и съща основна маса, съединени заедно, наистина не е най-добрият начин да избегнете двойно потапяне. По-добро решение е да използвате оптимизатора на вашия SQL двигател за показване на VIEW и споделяне на резултатите като работна таблица.
Ако сте ограничени до по-малко от звезден оптимизатор, използвайте временни таблици и вършете работата ръчно.
Въпреки че горните методи са напълно приемливи, най-добрият начин да избегнете двойното потапяне е да използвате клаузата за прозорец, тъй като подклаузите работят подобно на функциите на подзаявката. Например:
- Клаузата PARTITION BY е като локална GROUP BY, която разделя таблицата на групи.
- Клаузата ORDER BY налага сортиран ред.
- Прозоречната рамка (ROW или RANGE) е като локална клауза WHERE.
Можете да оптимизирате функциите на прозореца, като следвате тези правила:
- В индекса сортирайте първо по колоните на клаузата PARTITION BY, след това по колоните, използвани в клаузата ORDER BY.
- Включете всяка друга колона, посочена в заявката като включени колони на индекса.
3. Използвайте съхранени процедури
Обектно-релационните картографи (ORM) причиняват множество проблеми с производителността, когато генерират свой собствен код. Ако трябва да използвате ORM, напишете свои собствени съхранени процедури, така че производителността да не страда.
Има много начини, по които използването на съхранени процедури подобрява производителността, включително:
- Те изпращат по-малко данни в мрежата, така че транзакциите са по-бързи
- Те позволяват по-кратки обаждания
- Съхранените процедури са по-лесни за проследяване в профилните инструменти
- Тъй като съхранената процедура е действителен обект във вашата база данни, е по-лесно да получите статистически данни за производителността, което улеснява намирането на проблеми с производителността
- Повторната употреба на план за изпълнение се увеличава
- Те улесняват справянето с крайни случаи и добавят поведение за одит или заключване на промени
- Съхранените процедури не са уязвими за атаки с SQL инжекции
4. ИЗТРИВАНЕ и АКТУАЛИЗИРАНЕ в пакети
Изтриването или актуализирането на много данни от сканиране на голяма таблица използва много ресурси, тъй като и двата израза се изпълняват като една транзакция. Това е убиец на производителността, защото ако възникне грешка, докато транзакцията се изпълнява и трябва да я спрете, системата трябва да върне обратно цялата транзакция. Отмяната на големи количества данни отнема много време и блокира други транзакции.
Можете да избегнете този проблем с производителността, като правите актуализации и изтривания на малки партиди. Когато изпълнявате тези транзакции на партиди, ако транзакцията бъде убита, връщането е много по-малко. Връщането на малко количество данни не отнема много време и други транзакции могат да свършат работа, докато партидата се ангажира на диск.
5. Не извличайте повече колони, отколкото ви трябва
Една от основните причини за лошо представяне на заявки е извличането на външни колони. Избягвайте практики, които обикновено водят до връщане на прекомерен брой колони. Имайте предвид следното:
- Ненужното използване на „SELECT *“ в заявка вероятно ще върне повече колони, отколкото са ви необходими. Това е загуба на ресурси и блокира ресурси от други потребители. Особено важно е да не използвате безразборно „SELECT *“ в колонни SQL бази данни.
- Извършването на изрязване и поставяне за повторно използване на код може да доведе до допълнителни колони.
- Когато извикате VIEW, може да се окажете с вложени колони. Премахнете гнездото на слабо работещите заявки, за да проверите кои колони има и да се отървете от колони с голям размер, от които не се нуждаете. Добър признак, че имате проблем, е, че имате клауза WHERE с допълнителни условия и клауза FROM с допълнителни външни съединения.
Това са само някои от начините, по които съвестният подход към SQL синтаксиса и писането на заявки може да подобри наблюдението на базата данни. Не се страхувайте да опитате някои други. Високопроизводителната база данни е ключът към постигането на бизнес целите във всяка организация.