Кіріспе
Деректерді басқару жүйелерінде сұраныштарды тиімді орындау мүмкіндігі. Сұрауды оңтайландыру – көптеген реляциялық деректер қорын басқару жүйелерінің, сондай-ақ NoSQL және графикалық деректер қоры сияқты басқа деректер қоры түрлерінің бір мүмкіндігі болып табылады. Сұрауды оңтайландырушы, мүмкін болатын сұрау жоспарларын қарастыра отырып, берілген сұрауды орындаудың ең тиімді жолын анықтауға тырысады. Әдетте, сұрауды оңтайландырушыға пайдаланушылар тікелей қол жеткізе алмайды: сұраныштар деректер қоры серверіне жіберілгеннен және талдаушымен талданғаннан кейін, олар оңтайландыру процесі жүзеге асырылатын сұрауды оңтайландырушыға жіберіледі. Олар әрбір сұрау жоспарына шамамен "құн" тағайындайды және ең төменгі құнға ие жоспарды таңдайды. Құн, деректер сөздігінен алынған мәліметтерге сүйене отырып, қажетті I/O операцияларының саны, процессордың жұмыс жолының ұзындығы, дискідегі буферлік кеңістіктің көлемі, дискідегі сақтау қызметінің уақыты, параллелизм бірліктері арасындағы байланыс және басқа факторлар тұрғысынан сұрауды бағалаудың орындалу уақытын бағалау үшін қолданылады. Қарастырылатын сұрау жоспарлары жиынтығы, мүмкін болатын қол жеткізу жолдары (мысалы, бастапқы индекс бойынша қол жеткізу, екіншілік индекс бойынша қол жеткізу, толық файлды сканерлеу) және түрлі реляциялық кестелерді біріктіру әдістері (мысалы, біріктіру, хэш қосылу, көбейту қосылу) арқылы құрылады. Іздеу кеңістігі SQL сұранысының күрделілігіне байланысты өте кең болуы мүмкін. Оптимизацияның екі түрі бар: логикалық оптимизация – сұрауды шешу үшін реляциялық алгебраның тізбесін құрады, ал физикалық оптимизация – әрбір операцияны орындау тәсілдерін анықтау үшін қолданылады.
Query optimization is a feature of many relational database management systems and other databases such as NoSQL and graph databases. The query optimizer attempts to determine the most efficient way to execute a given query by considering the possible query plans. Generally, the query optimizer cannot be accessed directly by users: once queries are submitted to the database server, and parsed by the parser, they are then passed to the query optimizer where optimization occurs. These assign an estimated "cost" to each possible query plan, and choose the plan with the smallest cost. Costs are used to estimate the runtime cost of evaluating the query, in terms of the number of I/O operations required, CPU path length, amount of disk buffer space, disk storage service time, and interconnect usage between units of parallelism, and other factors determined from the data dictionary. The set of query plans examined is formed by examining the possible access paths (e. g., primary index access, secondary index access, full file scan) and various relational table join techniques (e. g., merge join, hash join, product join). The search space can become quite large depending on the complexity of the SQL query. There are two types of optimization. These consist of logical optimization—which generates a sequence of relational algebra to solve the query—and physical optimization—which is used to determine the means of carrying out each operation.
Іске асыру
Сұрауды оңтайландырушылардың көпшілігі сұрау жоспарларын "жоспар түйіндерінің" ағашы ретінде бейнелейді. Жоспар түйіні – сұранысты орындау үшін қажетті бір операцияны қамтиды. Түйіндер ағаш тәрізді құрылыммен орналасады, онда аралық нәтижелер ағаштың төменгі бөлігінен жоғарғы бөлігіне қарай өтеді. Әрбір түйінде нөл немесе одан көп бағынышты түйіндер болады – бұл түйіндердің шығысы аталық түйінге кіріс ретінде беріледі. Мысалы, біріктіру түйінінде екі бағынышты түйін болады, олар біріктірілетін екі операндты көрсетеді, ал сұрыптау түйінінде бір бағынышты түйін болады (сұрыпталатын деректер). Ағаштың жапырақтары – дискіні сканерлеу арқылы, мысалы, индекс бойынша сканерлеу немесе тізбектей сканерлеу арқылы нәтиже шығаратын түйіндер.
Қатысу тәртібі
Сұрау жоспарының тиімділігі көбінесе кестелердің қосылу ретіне байланысты анықталады. Мысалы, егер 10 қатарлы, 10 000 қатарлы және 1 000 000 қатарлы A, B, C кестелерін қосу керек болса, B және C кестелерін бірінші қосатын жоспар, A және C кестелерін бірінші қосатын жоспарға қарағанда әлдеқайда көп уақыт алуы мүмкін. Көптеген сұрау оңтайландырушылар IBM-нің System R деректер базасы жобасымен бастамасы болған динамикалық бағдарламалау алгоритмі арқылы қосылу ретін анықтайды. Бұл алгоритм екі кезеңде жұмыс істейді:
Біріншіден, сұраудағы әрбір қатынасқа қол жеткізудің барлық мүмкіндіктері есептеледі. Сұраудағы әрбір қатынасқа тізбекті сканерлеу арқылы қол жеткізуге болады. Егер сұраудағы шартқа жауап беру үшін пайдаланылатын қатынаста индекс болса, индекспен сканерлеуді де қолдануға болады. Әрбір қатынас үшін оңтайландырушы қатынасты сканерлеудің ең тиімді жолын, сондай-ақ белгілі бір ретпен жазбаларды шығаратын қатынасты сканерлеудің ең тиімді жолын тіркейді. Оңтайландырушы содан кейін қосылу шарты бар қатынастардың әрбір жұбын біріктіруді қарастырады. Әрбір жұп үшін оңтайландырушы ДБЖЖ-да (Деректерді басқару жүйесінде) жүзеге асырылған қолданылатын қосылу алгоритмдерін қарастырады. Бұл әрбір қатынас жұбын қосудың ең тиімді жолын сақтайды, сонымен қатар оның нәтижесін белгілі бір сұрыптау ретімен шығаратын әрбір қатынас жұбын қосудың ең тиімді жолын да сақтайды. Содан кейін барлық үш қатынасқа арналған сұрау жоспарлары есептеледі, бұл үшін алдыңғы кезеңде алынған әрбір екі қатынас жоспары сұраудағы қалған қатынастармен біріктіріледі. Сұрыптау реті сұрауды өңдеу кезінде кейіннен қажетсіз сұрыптау операциясын болдырмауға көмектеседі. Екіншіден, белгілі бір сұрыптау реті келесі қосылуды жылдамдатуы мүмкін, өйткені ол деректерді белгілі бір тәртіппен топтастырады.
Ұялы SQL сұраныстарын жоспарлау
Қазіргі заманғы реляциялық ДҚБЖ-ға SQL сұранысы тек таңдау және қосылудан асып түседі. Атап айтқанда, SQL сұраныстары көбінесе топтастыру, бар және жоқ операторларын қолдану арқылы SPJ блоктарының (Select Project Join) бірнеше деңгейлерін ұялайды. Кейбір жағдайларда мұндай ұялы SQL сұраныстарын таңдау-жобалау-қосылу сұранысына келтіруге болады, бірақ бұл әрқашан мүмкін емес. Ұялы SQL сұраныстары үшін сұраныс жоспарларын қосылу ретін анықтау үшін қолданылатын динамикалық бағдарламалау алгоритмі арқылы да таңдауға болады, бірақ бұл сұранысты оңтайландыру уақытын күрт ұзартуы мүмкін. Сондықтан кейбір деректерді басқару жүйелері сұраныс графигі моделін пайдаланатын ережеге негізделген баламалы тәсілді қолданады.
Шығынды бағалау
Сұрауды оңтайландырудағы ең қиын мәселелердің бірі – сұраныстың баламалы жоспарларының құнын дәл бағалау. Оптимизаторлар сұрау жоспарларының құнын математикалық модельдеу арқылы есептейді, бұл модель сұраныс орындалу құнына және сұрау жоспарының әр жиегі арқылы өтетін кардиналдыққа (немесе туплдар санына) байланысты. Кардиналдықты бағалау, өз кезегінде, сұраныстағы предикаттардың таңдау коэффициенттерін бағалауға тікелей байланысты. Дәстүрлі жүйелерде дерекқоры таңдамалылықты бағалау үшін әр бағандағы мәндердің таралуы туралы егжей-тегжейлі статистиканы қолданады, мысалы, гистограммалар. Бұл әдіс жеке предикаттардың таңдамалылығын бағалау үшін жақсы жұмыс істейді. Дегенмен, көптеген сұрауларда «R-ден select count(*) where R.make='Honda' және R.model='Accord'» сияқты предикаттардың біріктірілуі кездеседі. Сұрау предикаттары көбінесе өте байланысты болады (мысалы, model='Accord' болса, make='Honda' болады), сондықтан конъюнкцияның таңдамалылығын бағалау өте қиын. Кардиналдықтың дұрыс емес бағалануы және корреляцияның анықталмауы – сұрау оптимизаторының нашар сұрау жоспарларын таңдауының басты себептерінің бірі. Сондықтан дерекқор әкімшісі дерекқор статистикасын, әсіресе үлкен көлемдегі деректерді жүктеген немесе алып тастағаннан кейін, үнемі жаңартуы керек.
Ұзартулар
Классикалық сұранысты оңтайландыру сұраныс жоспарлары бір ғана бағалау өлшемі бойынша салыстырылады деп есептейді, әдетте орындалу уақыты, және әр сұраныс жоспарының бағасы белгісіздіксіз есептелуі мүмкін. Бұл екі шарттың да кейде практикада бұзылуы мүмкін, сондықтан классикалық сұранысты оңтайландырудың осы шектеулерді жойлайтын бірнеше кеңейтілген нұсқалары зерттелді. Бұл кеңейтілген мәселелердің түрлері жеке сұраныс жоспарларының бағасын модельдеу әдісімен және олардың оңтайландыру мақсаты бойынша ерекшеленеді.
Параметрлік сұранысты оңтайландыру
Классикалық сұранысты оңтайландыру әрбір сұраныс жоспарын бір скалярлық құнмен байланыстырады. Параметрлік сұранысты оңтайландыру сұраныс жоспарының құны оңтайландыру уақытында мәндері белгісіз параметрлерге тәуелді деп есептейді. Мұндай параметрлер, мысалы, оңтайландыру уақытында толыққанды көрсетілмеген, бірақ орындалу уақытында берілетін сұраныс шарттарының таңдамалық деңгейін білдіре алады. Параметрлік сұранысты оңтайландыру әрбір сұраныс жоспарын көп өлшемді параметр кеңістігінен бір өлшемді құн кеңістігіне бейнелейтін құн функциясымен байланыстырады. Оңтайландырудың мақсаты, әдетте, параметрлердің мүмкін болатын барлық комбинациялары үшін оңтайлы болатын барлық сұраныс жоспарларын жасау болып табылады. Бұл тиісті сұраныс жоспарлары жиынтығын қамтамасыз етеді. Орындалу уақытында, нақты параметрлердің мәндері белгілі болғанда, осы жиынтықтан ең жақсы жоспар таңдалады. Параметрлік сұранысты оңтайландырудың артықшылығы – оңтайландыру (әдетте өте қымбат операция) орындалу уақытында орындалмайды.
Көп мақсатты сұранысты оңтайландыру
Сұрау салу жоспарларын салыстыру үшін орындалу уақытынан өзге де көптеген шығын өлшемдері маңызды болуы мүмкін. Мысалы, бұлттық есептеу сценарийінде сұрау жоспарларын орындалуға кеткен уақыт мөлшерімен ғана емес, сонымен қатар олардың орындалуына кететін қаржылық шығындарымен де салыстыру қажет. Немесе шамамен сұрауды оңтайландыру контекстінде кірістік деректердің кездейсоқ түрде таңдалған үлгілерінде сұрау жоспарларын орындауға болады, бұл орындалу шығындарын төмендету арқылы шамамен нәтижелер алу үшін жасалады. Мұндай жағдайларда, балама сұрау жоспарларын орындалу уақыты бойынша ғана емес, сонымен қатар олардың тудыратын деректердің дәлдігі немесе сенімділігі тұрғысынан да салыстыру керек. Көп мақсатты сұрауды оңтайландыру, сұрау жоспарының құнын шығын векторы ретінде моделеу арқылы жүзеге асырылады, мұнда әрбір вектор компоненті әртүрлі шығын өлшемдеріне сәйкес келеді. Классикалық сұрауды оңтайландыру көп мақсатты сұрауды оңтайландырудың ерекше жағдайы ретінде қарастырылуы мүмкін, онда шығын кеңістігінің өлшемдері (яғни, шығын векторының компоненттерінің саны) біреуге тең. Әртүрлі шығын өлшемдері бір-бірімен қақтығысуы мүмкін (мысалы, бұлттық есептеу сценарийінде ең аз орындалу уақыты бар жоспар мен ең аз ақшалай орындалу төлемдері бар басқа жоспар болуы мүмкін). Сондықтан, оңтайландырудың мақсаты барлық шығын өлшемдерін барынша азайтатын сұрау жоспарын табу емес, әртүрлі шығын өлшемдері арасындағы ең жақсы компромисті қамтамасыз ететін сұрау жоспарын табу болуы керек. Ең жақсы компромис пайдаланушының қалауына байланысты (мысалы, кейбір пайдаланушылар арзан жоспарды, ал басқалары бұлттық сценарийде жылдам жоспарды артық көреді). Оптимизацияның мақсаты, оптимизаторға берілген пайдаланушының қалауларының белгілі бір сипаттамасына негізделген ең жақсы сұрау жоспарын табу (мысалы, пайдаланушылар салыстырмалы маңыздылықты көрсету үшін әртүрлі шығын өлшемдері арасындағы салмақтарды анықтай алады немесе белгілі бір өлшемдер бойынша қатаң шығын шектерін белгілей алады) немесе Парето-оңтайлы сұрау жоспарлары жиынтығының жуықтауын жасау (яғни, басқа жоспардың барлық өлшемдер бойынша жақсы құны жоқ) болып табылады, сонда пайдаланушы осы жоспар жиынтығынан қалаулы құн компромисін таңдай алады.