Кіріспе

SQL тармағы

Құрылымдық сұраныс тіліндегі (SQL) қосылу тармағы бір немесе бірнеше кестелердің бағандарын жаңа кестеге біріктіреді. Бұл операция реляциялық алгебрадағы қосылу операциясына сәйкес келеді. Жай тілмен айтқанда, қосылу екі кестені біріктіріп, сәйкес келетін өрістері бар жазбаларды бір қатарға орналастырады: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER және CROSS.

Ішкі қосылу және NULL мәндері

Бағдарламашылар NULL мәндері бар бағандарға кестелерді қосу кезінде ерекше сақ болуы керек, себебі NULL ешқандай басқа мәнмен (тіпті NULL өзімен де) сәйкес келмейді, егер қосылу шарты алдымен қосылатын бағандардың NULL емес екенін тексеріп, содан кейін қалған шарттарды қолданбайтын комбинациялық предикатты пайдаланбаса. Ішкі қосылу тек референциялық тұтастықты сақтайтын немесе қосылу бағандары NULL емес екеніне кепілдік берілген деректер базасында ғана қауіпсіз қолданылуы мүмкін. Көптеген транзакциялық реляциялық деректер базалары деректердің тұтастығын қамтамасыз ету үшін атомдық, консистенттілік, оқшаулау, беріктік (ACID) деректерді жаңарту стандарттарына сүйенеді, бұл ішкі қосылуды орынды таңдау жасайды. Алайда, транзакциялық деректер базаларында көбінесе NULL мәндеріне рұқсат етілген қосылу бағандары болады. Көптеген есептік реляциялық деректер базалары мен деректер қоймалары жоғары көлемді деректерді алу, түрлендіру және жүктеу (ETL) пакеттік жаңартуларын қолданады, бұл референциялық тұтастықты сақтауды қиын немесе мүмкін емес етеді, нәтижесінде SQL сұранысының авторы өзгерте алмайтын NULL қосылу бағандары пайда болады және ішкі қосылулар қате туралы ешқандай хабарламасыз деректерді жіберіп алады. Ішкі қосылуды қолдану туралы шешім деректер базасының дизайны мен деректердің ерекшеліктеріне байланысты. Егер бір кестедегі қосылу бағандарында NULL мәндері болуы мүмкін болса, сол жақ сыртқы қосылуды ішкі қосылудың орнына қолдану әдетте мүмкін. NULL (бос) болуы мүмкін кез келген деректер бағаны, егер мақсат NULL мәні бар қатарларды жою болмаса, ішкі қосылымдағы сілтеме ретінде қолданылмауы керек. Егер NULL қосылу бағандарын нәтиже жиынтығынан әдейі алып тастау қажет болса, ішкі қосылу сыртқы қосылудан жылдам болуы мүмкін, себебі кесте қосылу және сүзгілеу бір қадамда орындалады. Керісінше, үлкен көлемді сұрауларда SQL Where шарттарындағы деректер базасы функцияларымен бірге қолданылған ішкі қосылу өте баяу жұмыс істеуге немесе тіпті сервердің құлауына әкелуі мүмкін. SQL Where шарттарындағы функция деректер базасының салыстырмалы түрде ықшам кесте индекстерін елемеуіне себеп болуы мүмкін. Деректер базасы екі кестеден таңдалған бағандарды оқып, ішкі қосылуды орындауы мүмкін, содан кейін есептелген мәнге байланысты сүзгіні қолданып қатарлар санын азайтады, нәтижесінде тиімсіз өңдеудің үлкен көлемі пайда болады. Нәтиже жиынтығы бірнеше кестелерді қосу арқылы жасалғанда, оның ішінде сандық идентификатор кодтарының толық мәтіндік сипаттамаларын іздеуге арналған бас кестелер (алу кестесі) болса, шеткі кілттердің кез келгеніндегі NULL мәні қате туралы ешқандай хабарламасыз нәтиже жиынтығынан бүкіл қатарды жоюға әкелуі мүмкін. Бір немесе бірнеше ішкі қосылулар мен бірнеше сыртқы қосылуларды қамтитын күрделі SQL сұранысы ішкі қосылулар сілтемелерінің бағандарындағы NULL мәндері үшін де сол тәуекелді қамтиды. Ішкі қосылуларды қамтитын SQL кодына берілген міндеттеме NULL қосылу бағандары болашақтағы өзгерістермен, оның ішінде жеткізуші жаңартулары, дизайн өзгертулері және қосымшаның деректерді тексеру ережелерінен тыс жаппай өңдеу, мысалы, деректерді түрлендіру, көшіру, жаппай импорттау және біріктіру арқылы енгізілмейді деп есептейді. Ішкі қосылуларды экви қосылулар, табиғи қосылулар немесе қиылыс қосылулар деп жіктеуге болады.

Сыртқы қосылу

Қосылған кестеде әрбір жол сақталады, тіпті егер басқа сәйкес келетін жол болмаса да. Сыртқы қосылыстар, қай кестедегі қатарлар сақталатынына байланысты, сол жақ сыртқы қосылыстарға, оң жақ сыртқы қосылыстарға және толық сыртқы қосылыстарға бөлінеді: сол, оң немесе екеуі де (бұл жағдайда «сол» және «оң» JOIN кілт сөзінің екі жағын білдіреді). Ішкі қосылыстар сияқты, сыртқы қосылыстардың барлық түрлерін экви-қосылыстар, табиғи қосылыстар, ON <шарт> (θ-қосылысы) және т.б. деп жіктеуге болады. Стандартты SQL-де сыртқы қосылыстар үшін ешқандай жасырын қосылу синтаксисі қарастырылмаған.

Өздігінен біріктірілетін

Өзін-өзі қосу – бір кестені өзімен-өзі біріктіру.

Алгоритмдерді қосу

Бинарлық қосылу операциясын орындау үшін үш негізгі алгоритм бар: ұялы циклдық қосылу, сұрыптау-біріктіру қосылу және хэш-қосылу. Ең нашар жағдайдағы оңтайлы біріктіру алгоритмдері, ең нашар жағдайда екіден көп қатынастарды біріктіргенде, бинарлық қосылу алгоритмдерінен асимптотикалық тұрғыдан жылдам болады.

Индекстерді қосу

Бірлесу индекстері – деректер қоймаларында біріктіру сұраныстарын өңдеуді жеңілдететін деректер базасының индекстері: олар қазіргі уақытта (2012) Oracle және Teradata жүйелерінде қолжетімді. Teradata жүйесінде бір немесе бірнеше кестелердегі белгілі бағандар, бағандардағы жиынтық функциялар немесе күндік бағандардың бөліктері деректер базасы көрінісін анықтау сияқты синтаксис арқылы көрсетіледі: бір бірлесу индексінде 64 бағанға/бағандық өрнекке дейін көрсетуге болады. Құрама деректің бірінші кілтін анықтайтын баған да көрсетілуі мүмкін: параллель жабдықталған жүйеде баған мәндері индекс мазмұнын бірнеше дискіге бөлу үшін пайдаланылады. Егер пайдаланушылар бастапқы кестелерді өзара әрекеттес түрде жаңартса, бірлесу индексінің мазмұны автоматты түрде жаңартылады. Егер сұраныстың WHERE шарттары бірлесу индексінде анықталған бағандардың немесе бағандық өрнектердің нақты кіші жиынын қамтыса (осылай аталатын «жабатын сұраныс»), сұранысты орындау кезінде бастапқы кестелер мен олардың индекстері емес, бірлесу индексі пайдаланылады. Oracle жүйесі биттік индекс пайдаланумен шектеледі. Биттік бірлесу индексі төмен кардиналдылыққа ие бағандар үшін қолданылады (яғни, Oracle құжаттамасына сәйкес, 300-ден аз ерекше мәні бар бағандар): ол бірнеше байланысты кестелерден төмен кардиналдылыққа ие бағандарды біріктіреді. Oracle мысалы ретінде инвентаризация жүйесін келтіреді, онда әртүрлі жеткізушілер әртүрлі бөлшектерді ұсынады. Схема үш байланысты кестеден тұрады: екі «негізгі кесте» – Бөлшек және Жеткізуші, және «қосымша кесте» – Инвентаризация. Соңғысы – Жеткізушіні Бөлшекке байланыстыратын көпке көп кесте, және ең көп қатарларды қамтиды. Әрбір бөлшектің Бөлшек түрі болады, ал әр жеткізуші АҚШ-та орналасқан және Штат бағанына ие. АҚШ-та 60 штаттан аспайтын және 300-ден аспайтын Бөлшек түрлері бар. Биттік бірлесу индексі жоғарыдағы үш кестедегі стандартты үш кестелік біріктіру арқылы анықталады, сондай-ақ индекс үшін Бөлшек түрі және Жеткізуші штаты бағандары көрсетіледі. Дегенмен, ол Инвентаризация кестесінде анықталады, тіпті Бөлшек түрі және Жеткізуші штаты бағандары сәйкесінше Жеткізуші және Бөлшек кестелерінен «қарызға алынған». Teradata-ға келетін болсақ, Oracle биттік бірлесу индексі тек сұранысқа жауап беру үшін қолданылады, егер сұраныстың WHERE шарты бірлесу индексіне енгізілген бағандармен шектелсе.

Тіке қосылу

Кейбір деректер базасы жүйелері пайдаланушыға қосылыста кестелерді нақты бір ретпен оқуға жүйені мәжбүрлеуге мүмкіндік береді. Бұл, егер қосылу оптимизаторы кестелерді тиімсіз ретпен оқуды таңдаса қолданылады. Мысалы, MySQL-де STRAIGHT JOIN командасы кестелерді сұранышта тізілгендей нақты ретпен оқиды.