Скорость обработки запросов на SQL серверахДодатково програмісту додається повний контроль над виявденням і обробкою помилок, пов”язаних з транзакціями. 2.1 ТЕХНОЛОГІЯ DAO ( Data Access Object – об”єкти доступу до данних ) приззначена для викоритання об”єктів, методів, властивотей, значно полегшшують роботу програмного додатку з базою даних. Для обміну інформацією з SQL сервером в об”єктах DAO викоритову-ються рівні дотупу Jet і ODBC , одна вони утворюють ще один рівень абстракції між додатками і викликами функцій ODBC , які використовуються при обробці запитів. Технологія DAO для роботи з базами даних, таблицями, видами передбачає викоритання коллекцій об”єктів. Наприклад для створення нової таблиці легше викликати метод Add відповідного об”єкта, між використовувати стандартний підхід технології ODBC . При роботі з базою даних можна використати стандартний підхід для доступу до майже будь-якого сховища даних, що підтриимується засобоми ODBC . Але треба відмітити, що технологія DAO поступово витісняється більш прогресивною технологією ADO(ActiveX Data Object – об”єкти данх ActiveX ) . 2.2 ТЕХНОЛОГІЯ ODBC З метою можливого встановлення зв”язку з різними СУБД фірмою Microsoft була розроблена технологія ODBC . Вона забезпечує створення додаткового рівня абстракції між програмним додатком і СУБД. Даний рівень дозволяє створити одну команду Select і використовувати її для виборки даних з будь-яких підтримуємих типів баз даних, враховуючи ті випадки, коли СУБД взагалі не підтримує мову SQL . Служби ODBC являють собою окремий рівень доступу до файлів баз даних. ODBC бере на себе відповідальністьза отримання від до-датків запитів на вибірку інформації і переведення їх на мову, що використовує ядро база даних, для обробки запиту. Гарним прикладом використання ODBC технології є СУБД Access фірми Microsoft . Головна різниця між ODBC і BD - Lib полягає у тому, що ODBC вимагає побудови і передачі йому лише стандартних SQL команд, а BD - Lib вимагає особливого синтаксису при побудові у буфері команд, що напрравляються безпосередньо у серверне середовище. Головним недоліком ODBC є необхідність в трансляції запитів. Проведення цієї додаткової роботи відповідно відображається на швидкості доступу до даних. При роботі з ODBC можна отримати суттєвий виграш у швидкості обробки даних, якщо в системі клі-єнт/ сервер саме на сервері системи SQL Server буде оброблятись запит, а не на клієнтському комп”ютері. Також приріст у швидкості роботи ODBC дає використання встроєнних процедур. 2.3 JSCRIPT Тепер перейдемо до процесів, що пов”язані з вимірюванням швидкості системи SQL Server 7.0 . У данній роботі прпонується написання програмного додатку на встроєнному shell OS Windows NT - Java Script . Сам програмний додаток це програма написана для інтерпритуюча мова. Файл з розширенням . js буде виконавчим для OS Windows NT . Спочатку напишемо Script для створення бази даних : // ADO Flags var adLockOptimistic = 3; var adOpenStatic = 3; var SQL_DataBase = 'DSN=OTSt;UID=sa;PWD=;DATABASE=OTSt' //var SQL_DataBase = 'DSN=OTStt;UID=;PWD=' var oConn; var oRs; function db_Connect(){ // Create ADO Connection Object. Use IISSDK OBDC Souce with // default sa account and no password oConn = new ActiveXObject('ADODB.Connection'); oConn.Open(SQL_DataBase); oConn.CommandTimeout=600; } function db_Record(SQL){ var oRs; // Create ADO Recordset Component, and associate it with ADO connection oRs = new ActiveXObject('ADODB.Recordset'); oRs.ActiveConnection = oConn; // Get empty recordset oRs.Source = SQL; oRs.CursorType = adOpenStatic; // use a cursor other than Forward Only oRs.LockType = adLockOptimistic; // use a locktype permitting insertions oRs.Open(); return oRs; } function db_Close(){ oConn.Close(); } function db_Requery(Rec,SQL){ Rec.Close(); Rec.Source = SQL; Rec.Open(); } db_Connect(); try { oRs=db_Record('CREATE TABLE dbo.DBTEST ( String char (30) NULL, Number int NOT NULL DEFAULT (0), Random int NOT NULL DEFAULT (0))'); }catch (e) { } oRs=db_Record('SELECT * FROM DBTEST WHERE 0=1'); for(i=0;i oRs.Addnew(); oRs('String').value='User'+i; oRs('Number').value=i; oRs('Random').value=Math.round(100*Math.random()); oRs.Update(); if(i%10000==0) WScript.echo('Now in base present '+i+' records'); } WScript.echo('Completed'); База даних буде мати вид :
Стовбчик Number буде ключем. Напишемо ще один Script , для тестування швидкості роботи SQL Server . Щоб визначети час відповіді на запит як умога точніше будемо посилати на сервер не один запит , а декілька десятків однакових запитів, обрахувавши середній час відповіді отримаємо точний час обробки запиту і знаходження сервером результуючої множини елементів. Але треба враховувати такий випадок - якщо для підвищення точності послати декілька сотень однакових запитів, то SQL Server почне хешування таблиці для оптимізації своєї роботи і результати роботи будуть не точні, оскільки при звичайному запиті хешування таблиці не робиться. // ADO Flags var adLockOptimistic = 3; var adOpenStatic = 3; var SQL_DataBase = 'DSN=OTSt;UID=sa;PWD=;DATABASE=OTSt' //var SQL_DataBase = 'DSN=OTStt;UID=;PWD=' var oConn; var oRs; function db_Connect(){ // Create ADO Connection Object. Use IISSDK OBDC Souce with // default sa account and no password oConn = new ActiveXObject('ADODB.Connection'); oConn.Open(SQL_DataBase); oConn.CommandTimeout=600; } function db_Record(SQL){ var oRs; // Create ADO Recordset Component, and associate it with ADO connection oRs = new ActiveXObject('ADODB.Recordset'); oRs.ActiveConnection = oConn; // Get empty recordset oRs.Source = SQL; oRs.CursorType = adOpenStatic; // use a cursor other than Forward Only oRs.LockType = adLockOptimistic; // use a locktype permitting insertions oRs.Open(); return oRs; } function db_Close(){ oConn.Close(); } function db_Requery(Rec,SQL){ Rec.Close(); Rec.Source = SQL; Rec.Open(); } function Test(TestNumber, Query, CountTests){ Max=0; Min=1000000; Delta=0; Ave=0; WScript.echo('Query #'+TestNumber); for(i=0;i StartTime=new Date(); db_Requery(oRs,Query); EndTime=new Date(); Delta=(EndTime-StartTime); WScript.echo(' Probe #'+i+' Result='+Delta+' ms'); Ave=(Ave*i+Delta)/(i+1); } WScript.echo(' Result='+Ave+' ms'); } db_Connect(); oRs=db_Record('SELECT * FROM DBTEST WHERE 1=0'); Test(1, ' SELECT * FROM DBTEST ' , 50 ); Test(2 , ' SELECT * FROM DBTEST ORDER BY String',50); Test( 3 ,' SELECT * FROM DBTEST ORDER BY Number ',50); Test (4,'SELECT Sum(Number) FROM DBTEST GROUP BY String',50); Test(5 , ' SELECT Sum(Number) FROM DBTEST GROUP BY Random',50); Test( 6 , ' SELECT * FROM DBTEST WHERE Number = 99999 ' , 50); Test(7 ,' SELECT * FROM DBTEST WHERE String = 'User99999'',50); Test(8,'SELECT * FROM DBTEST WHERE Number in (SELECT Number FROM DBTEST ) ' , 50 ); Test(9 ,'SELECT * FROM DBTEST WHERE Number in (SELECT Number FROM DBTEST WHERE String Test(10 , ' SELECT * FROM DBTEST WHERE Number in (SELECT Number FROM DBTEST WHERE String='User50000')', 50); Test(11, ' SELECT * FROM DBTEST WHERE Number in (SELECT Number FROM DBTEST WHERE String > ' User10000 ' ) ' , 50); Test(12 , 'INSERT INTO DBTEST (String,Number) VALUES('User30',30) ' , 50 ); Test(13 , 'DELETE FROM DBTEST (String,Number) VALUES('User30',30) ' , 50); Test(14 ,' DELETE FROM DBTEST ' , 1); db_Close() Головна функція Test у циклі 50 разів посилає запит на сервер, обраховує різницю між початком обробки запиту і часом закінчення обробки : StartTime=new Date(); « обробка запиту » EndTime=new Date(); Delta=(EndTime - StartTime); У останньому script маємо 14 тестів для тестування різних можли-востей SQL Server . Розглянемо їх докладніше . Тести 12 і 13 характеризують швидкість вставки і вилучення елементів у базі даних. Тест 14 знищує усю таблицю. Запити на вибірку інформації : Тест 1:' SELECT * FROM DBTEST ' - виділити всі елементи ; Тест 2: ' SELECT * FROM DBTEST ORDER BY String' -відсортувати усі елементи за значенням у стовбчику “ String ”; Тест 3:' SELECT * FROM DBTEST ORDER BY Number'- відсортува-ти усі елементи за значенням у стовбчику “ Number ”; Тест 4:'SELECT Sum(Number) FROM DBTEST GROUP BY String' - скласти усі елементи стовбчика “ Number ” за значенням у стовбчи-ку “ String ”; Тест 5:' SELECT Sum(Number) FROM DBTEST GROUP BY Random' - скласти усі елементи стовбчика “ Number ” за значенням у стовбчику “ Random ”; Тест 6:' SELECT * FROM DBTEST WHERE Number = 99999 ' – визначити усі елементи, у яких значення у стовбчику “ Number ” = 99999; Тест 7:' SELECT * FROM DBTEST WHERE String = 'User99999'' - визначити усі елементи, у яких значення у стовбчику “String “ = 'User99999' ; Тест 8 : 'SELECT * FROM DBTEST WHERE Number in (SELECT Number FROM DBTEST ) ' - визначити усі елементи з множини чисел ; Тест 9 :'SELECT * FROM DBTEST WHERE Number in (SELECT Number FROM DBTEST WHERE String усі елементи з множини елементів, у яких значення у стовбчику “String “ Тест 10 : ' SELECT * FROM DBTEST WHERE Number in (SELECT Number FROM DBTEST WHERE String='User50000')' - визначити усі елементи з множини елементів, у яких значення у стовбчику “String “ = ' User50000'; Тест 11 : ' SELECT * FROM DBTEST WHERE Number in (SELECT Number FROM DBTEST WHERE String > ' User10000 ' ) '- визначити усі елементи з множини елементів, у яких значення у стовбчику “String “ > ' User10000' ; Частина 3 : РЕЗУЛЬТАТИ ТЕСТУВАННЯ Для наведення прикладу універсальності при використанні написан-ного script при вимірюванні швидкодії, виміряємо швидкість обробки запитів у системі SQL Server 7.0 та Microsoft Access 97. Щоб script сприймався системою Access без суперечень треба змінити параметри ідентифікації : // var SQL_DataBase = 'DSN=OTSt;UID=sa;PWD=;DATABASE=OTSt' var SQL_DataBase = 'DSN=OTStt;UID=;PWD=' Отримані результати приведемо у таблиці :
Розглядаючи швидкість обробки множин елментів зазначимо, що чии більше елементів обробляє сервер у базі даних тим більше часу на це йде. Так наприклад запит 10 на пошук у базі даних елемента типу String - 'User50000' ззаймає набагато менше часу ніж пошук елементів, що менше 'User50000'. Таких елементів приблизно 50 тисяч і їх пошук займає досить довгий час. Пошук елементів, що більше 'User10000' займає у сервера ще більший час. Запити 12,13 визначають час занесення до бази нового рядка і вилучення рядка з бази даних. Проводячи наведені дослідження за роботою сервера ми отримуємо повну характеристику його роботи. Використаємо наведені вище програмні додатки і проведемо виміри на інших SQL -серверах. Порівняємо швидкості роботи SQL Server 7.0 і Oracle 8 :
|