Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Деректер базасы жүйелерінің түсінігі
Database systems concept
Компьютер ғылымында деректер базасының курсоры – деректер базасындағы жазбалар арқылы өтуге мүмкіндік беретін механизм. Курсорлар жазбаларды алу, қосу және жою сияқты, өтумен қатар жүретін келесі өңдеуді жеңілдетеді. Өту мүмкіндігінің арқасында деректер базасының курсоры итератордың бағдарламалау тіліндегі түсінігімен ұқсас. Курсорларды деректер базасының бағдарламашылары деректер базасы сұраныстарының нәтижесінде алынған жекелеген қатарларды өңдеу үшін пайдаланады. Курсорлар нәтижелердің толық жиынтығын бірден өңдеуге мүмкіндік береді. Осы сценарийде курсор нәтижелер жиынтығындағы қатарларды тізбектей өңдеуге мүмкіндік береді. SQL процедураларында курсор нәтиже жиынтығын (деректер қатарларының жиынтығын) анықтауға және қатар бойынша күрделі логиканы орындауға мүмкіндік береді. Осы механизмді пайдаланып, SQL процедурасы нәтиже жиынтығын анықтап, оны тікелей SQL процедурасын шақырушыға немесе клиенттік бағдарламаға қайтара алады. Курсорды қатардағы бір қатарға сілтеме ретінде қарастыруға болады. Курсор бір уақытта тек бір қатарға сілтеме жасай алады, бірақ қажет болған жағдайда нәтиже жиынтығының басқа қатарларына көше алады.
In computer science, a database cursor is a mechanism that enables traversal over the records in a database. Cursors facilitate subsequent processing in conjunction with the traversal, such as retrieval, addition and removal of database records. The database cursor characteristic of traversal makes cursors akin to the programming language concept of iterator. Cursors are used by database programmers to process individual rows returned by database system queries. Cursors enable manipulation of whole result sets at once. In this scenario, a cursor enables the sequential processing of rows in a result set. In SQL procedures, a cursor makes it possible to define a result set (a set of data rows) and perform complex logic on a row by row basis. By using the same mechanics, a SQL procedure can also define a result set and return it directly to the caller of the SQL procedure or to a client application. A cursor can be viewed as a pointer to one row in a set of rows. The cursor can only reference one row at a time, but can move to other rows of the result set as needed.
"Қоймаға"
Курсорлар әдетте транзакция аяқталған кезде автоматты түрде жабылады, яғни COMMIT немесе ROLLBACK (немесе транзакцияның автоматты түрде аяқталуы) орын алғанда. Бұл мінез-құлықты WITH HOLD сөйлемін пайдаланып курсорды жариялағанда өзгертуге болады (әдепкі параметр WITHOUT HOLD). Ұстап тұруға болатын курсор COMMIT кезінде ашық күйінде қалады және ROLLBACK кезінде жабылады. (Кейбір ДБСҰ осы стандартты мінез-құлықтан ауытқып, ROLLBACK кезінде де ашық күйінде қалатын курсорларды сақтайды.) DECLARE курсор_аты CURSOR WITH HOLD FOR SELECT FROM
Cursors are usually closed automatically at the end of a transaction, i. e. when a COMMIT or ROLLBACK (or an implicit termination of the transaction) occurs. That behavior can be changed if the cursor is declared using the WITH HOLD clause (the default is WITHOUT HOLD). A holdable cursor is kept open over COMMIT and closed upon ROLLBACK. (Some DBMS deviate from this standard behavior and also keep holdable cursors open over ROLLBACK.) DECLARE cursor name CURSOR WITH HOLD FOR SELECT FROM
COMMIT орын алғанда, ұстап тұруға болатын курсор келесі қатардың алдына орналасады. Осылайша, орналасқан UPDATE немесе орналасқан DELETE операторы транзакцияда FETCH операциясы орын алғаннан кейін ғана сәтті орындалады. JDBC курсорларды әдепкі бойынша ұстап тұруға болатын деп анықтайды. Бұл JDBC де автоматты тапсыруды әдепкі бойынша белсендіреді.
When a COMMIT occurs, a holdable cursor is positioned before the next row. Thus, a positioned UPDATE or positioned DELETE statement will only succeed after a FETCH operation occurred first in the transaction. Note that JDBC defines cursors as holdable per default. This is done because JDBC also activates auto commit per default.
Бөлінген операциялардағы курсорлар
Транзакция мониторы арқылы басқарылатын таратылған транзакцияларда (X/Open XA Environments) курсорларды пайдалану, таратылмаған транзакциялардағы курсорлардан ешқандай айырмашылығы жоқ. Дегенмен, сақталынатын курсорларды пайдаланғанда сақ болу керек. Қосылымдар әртүрлі қолданбалармен пайдаланылуы мүмкін. Сондықтан, транзакция аяқталған және бекітілгеннен кейін, кейінгі транзакция (басқа қолданбада іске қосылған) қолданыстағы сақталынатын курсорларды мұраға ала алады. Осыған байланысты, қолданба жасаушы осы жағдайды ескеруі тиіс.
Using cursors in distributed transactions (X/Open XA Environments), which are controlled using a transaction monitor, is no different from cursors in non distributed transactions. One has to pay attention when using holdable cursors, however. Connections can be used by different applications. Thus, once a transaction has been ended and committed, a subsequent transaction (running in a different application) could inherit existing holdable cursors. Herefore, an application developer has to be aware of that situation.
Курсорлардың кемшіліктері
Төмендегі ақпарат нақты деректер базасы жүйесіне байланысты өзгеруі мүмкін. Курсордан бір қатарды алу әр ретте желілік байланыс жасауды талап етеді. Бұл DELETE сияқты жалғыз SQL операторын орындау үшін қалыпты жағдайда қажет болатын желілік өткізу қабілетінен әлдеқайда көп. Желілік байланысты қайта-қайта жасау курсорды пайдалану жылдамдығын күрт төмендетуі мүмкін. Кейбір ДБСЖ (Деректерді басқару жүйелері) осы әсерді азайту үшін блокпен алу әдісін қолданады. Блокпен алу серверден клиентке бірнеше қатарды бірдей жіберуді білдіреді. Клиент қатарлардың толық блогын жергілікті буферде сақтайды және буфер таусылғанша сол буферден қатарларды алады. Курсорлар сервердегі ресурстарды, мысалы, құлыптарды, пакеттерді, процестерді және уақытша жадты бөліп алады. Мысалы, Microsoft SQL Server курсорларды уақытша кесте құрып, оны сұраныстың нәтижелер жиынтығымен толтыру арқылы іске асырады. Егер курсор дұрыс жабылмаса (деаллокацияланбаса), SQL сессиясы (қосылысы) жабылмағанша ресурстар босатылмайды. Сервердегі ресурстардың осылай ысырабы өнімділіктің төмендеуіне және қателерге әкелуі мүмкін.
The following information may vary depending on the specific database system. Fetching a row from the cursor may result in a network round trip each time. This uses much more network bandwidth than would ordinarily be needed for the execution of a single SQL statement like DELETE. Repeated network round trips can severely reduce the speed of the operation using the cursor. Some DBMSs try to reduce this effect by using block fetch. Block fetch implies that multiple rows are sent together from the server to the client. The client stores a whole block of rows in a local buffer and retrieves the rows from there until that buffer is exhausted. Cursors allocate resources on the server, such as locks, packages, processes, and temporary storage. For example, Microsoft SQL Server implements cursors by creating a temporary table and populating it with the query's result set. If a cursor is not properly closed (deallocated), the resources will not be freed until the SQL session (connection) itself is closed. This wasting of resources on the server can lead to performance degradations and failures.