і результати роботи будуть не точні, оскільки при звичайному запиті хешування таблиці не робиться.
// 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<CountTests;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 < ' User50000 ' ) ",50);
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 тестів для тестування різних можли-востей SQLServer. Розглянемо їх докладніше .
Тести 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 < ' User50000 ' ) " - визначити усі елементи з множини елементів, у яких значення у стовбчику “String “ < ' User50000 ';
Тест 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 при вимірюванні швидкодії, виміряємо швидкість обробки запитів у системі SQLServer 7.0 та MicrosoftAccess 97.
Щоб script сприймався системою Access без суперечень треба змінити параметри ідентифікації :
//var SQL_DataBase = "DSN=OTSt;UID=sa;PWD=;DATABASE=OTSt"
var SQL_DataBase = "DSN=OTStt;UID=;PWD="
Отримані результати приведемо у таблиці :
Тест № | SQL Server 7.0 | Access 97 |
1 | 2,673 | 1,81 |
2 | 7,781 | 5,603 |
3 | 7,356 | 5,211 |
4 | 8,239 | 7,54 |
5 | 0,903 | 0,494 |
6 | 0,345 | 0,231 |
7 | 0,390 | 0,287 |
8 | 11,207 | 7,11 |
9 | 3,843 | 2,53 |
10 | 0,655 | 0,507 |
11 | 11,469 | 9,816 |
12 | 0,3 | 0,285 |
13 | 0,31 | 0,22 |
14 | 55,62 | 34,324 |
Як видно з результатів проведенного вимірювання запити на локальній базі даних Access опрацьовуються значно швидше ніж на сервері.
Аналізуючи запити 2 і 3, 4 і 5, 6 і 7 бачимо, що обробка елементів різних типів у однакових запитах має різний час.
Так наприклад сортувати усіх елементів за значенням у стовбчику “String” опрацьовується повільніше ніж у стовбчику " Number"- причина у розміру елементів цих типів.
Теж саме при обробці запитів 4 і 5 при сумуванні елементів стовбчика " Number" за елементами стовбчиків “ String ” і ” Random”.
Стовбчик “String ” зберігає значення типу String і стовбчик ”Random”
зберігає значення типу Integer, елементи типів мають різний розмір і обробляються з різною швидкістю.
Розглядаючи швидкість обробки множин елментів зазначимо, що чии більше елементів обробляє сервер у базі даних тим більше часу на це йде. Так наприклад запит 10 на пошук у базі даних елемента типу String - 'User50000' ззаймає набагато менше часу ніж пошук елементів, що менше 'User50000'. Таких елементів приблизно 50 тисяч і їх пошук займає досить довгий час. Пошук елементів, що більше 'User10000' займає у сервера ще більший час.
Запити 12,13 визначають час занесення до бази нового рядка і вилучення рядка з бази даних.
Проводячи наведені дослідження за роботою сервера ми отримуємо повну характеристику його роботи.
Використаємо наведені вище програмні додатки і проведемо виміри на інших SQL-серверах. Порівняємо швидкості роботи SQLServer 7.0 і Oracle 8 :
Тест № | SQL Server 7.0 | Oracle 8 |
1 | 2,673 | 2,71 |
2 | 7,781 | 8,06 |
3 | 7,356 | 8,09 |
4 | 8,239 | 8,75 |
5 | 0,903 | 1,041 |
6 | 0,345 | 0,4 |
7 | 0,390 | 0,432 |
8 | 11,207 | 11,917 |
9 | 3,843 | 4,05 |
10 | 0,655 | 0,78 |
11 | 11,469 | 12,021 |
12 | 0,3 | 0,295 |
13 | 0,31 | 0,291 |
14 | 55,62 | 43,134 |
Як видно з результатів SQL Server 7.0 працює швидше за Oracle 8 при обробці вибірок, а при вставці і вилученні елементів у Oracle краші результати. Це можна пояснити різною будовою ядер обробки запитів.
Проведемо такіж заміри і для SQL сервера Informix.
Тест № | SQL Server 7.0 | Informix |
1 | 2,673 | 2,11 |
2 | 7,781 | 6,932 |
3 | 7,356 | 7,138 |
4 | 8,239 | 7,934 |
5 | 0,903 | 0,856 |
6 | 0,345 | 0,456 |
7 | 0,390 | 0,471 |
8 | 11,207 | 13,04 |
9 | 3,843 | 4,41 |
10 | 0,655 | 0,748 |
11 | 11,469 | 12,814 |
12 | 0,3 | 0,315 |
13 | 0,31 | 0,31 |
14 | 55,62 | 51,48 |
По результам видно, що SQL Server 7.0 працює повільніше за Informix при обробці простих запитів, а при пошуку і порівнянні елементів працює швидше. На запитах по вставці і вилученні елементів у Informix і SQLServer 7.0 майже однакові результати.
Таким чином ми досягли мети данної роботи - побудували програмні додатки, якими змогли визначити характеристики працездатності різних серверних баз даних.
В результаті проведенної роботи було розглянуто різні фактори, що впливають на швидкість роботи системи SQLServer 7.0.
Були написані дві програми, що дають змогу вимірювати швид-кість обробки запитів багаторівневою серверною системою MicrosoftSQLServer 7.0 і тим самим дають можливість досліджувати ефективність настройки параметрів системи, дають змогу оцінити оптимальність побудови бази даних, оптимальність використання індексів, правил, обмежень, ефективність роботи з транзакціями.
Були розглянуті сильні і слабкі боки технологій роботи з програмними додатками - DB-Libraryта ODBC з DAO.
Як приклад роботи програмних додатків отримані дані про швидкодію систем баз даних SQL Server 7.0 та Microsoft Access 97.
Порівняні результати застосування програмних додатків у системах SQL-серверів таких як Oracle та Informix з швидкістю роботи Microsoft SQL Server 7.0.
Використовуючи написані script-и програмісти і розробники систем баз даних типу клієнт/сервер можуть визначати характеристики створених ними систем з ціллю аналізу і удосконалення.
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ :
1. “Використання MicrosoftSQLServer 7.0” Стефан Вінкоп
вид. Москва 1999 р.
2. “ Teach Yourself Oracle 8 In 21 Days” Cary N. Prague
3. “ Секреты Access 97” Уильям Амо изд.Диалектика 1997р.
4. “ Технологія Java” Джо Вебер вид. “BHV” 1996 р.
5. Журнал “PCWorld” № 3,7,8 за 97 р., № 1,9 за 98 р.
6. www.techrepublic.com