Кеширане в бази данни - оптимизация на SQL заявки
Кеширането е временно съхраняване на често използвани данни върху носители за съхранение (най-често това е RAM), които имат по-кратко време за достъп в сравнение с твърдия диск.
Съвременните бази данни използват технология за кеширане на данни, за да минимизират физическите I/O операции. Това разпределя относително голям сегмент от памет с фиксиран размер, който е достъпен едновременно за всички сесии на базата данни. Този сегмент от паметта се нарича кеш блоков буфер [8, стр. 30]. Блоковият буфер на кеша е свързан списък, чиито елементи са блокове данни със същия размер, прочетени от диска. Всяка операция за достъп до данни се нарича логически I/O. Обменът на данни в паметта е строго логически I/O, докато дисков I/O е както логически, така и физически.
Забележка - обща схема за кеширане е дадена в Приложение A.
За визуална илюстрация на тази схема, нека се обърнем към книгата на Dan Thaw, Настройка на SQL за професионалистите: „С незначителни модификации кешът се попълва и поддържа по доста прост начин. Всеки път, когато базата данни трябва да получи достъп до блок от данни, който все още не е копиран в кеша, тя изисква операция за четене на диска (физически I/O) и поставя току-що получения блок в началото на списъка с буфери. Тъй като дължината на списъка остава фиксирана по време на работа с база данни, добавяне на блок от страната на главата на списъка, списъкът се изтрива (т.е. вече не се кешира).
Забележка - всъщност операциите в кеша се извършват с помощта на указатели в свързан списък от определен вид. Новият блок на главата всъщност е същата област на паметта като стария.опашен блок, в който са записани нови данни и указателите са преместени, за да променят позицията на блока в списъка.
Когато базата данни открие, че желаният блок от данни вече е в списъка (което изисква строго логически I/O), тя премества този блок от текущата му позиция в началото на списъка. Тъй като блокът, участващ в логически I/O, се премества само и не се добавя към списъка, никакви блокове не се изтласкват от опашката на списъка. Отново, базата данни обработва движението на логически блокове, използвайки указатели; на физическо ниво данните в паметта не се копират.
Тъй като блоковете се преместват обратно в началото на списъка по време на логически I/O, кешът в крайна сметка се сортира: най-скоро използваните (MRU) блокове са по-близо до главата, а най-малко използваните (LRU) блокове са в края на списъка" [8, стр. 30].