Скорость обработки запросов на SQL серверах

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



о посилати на сервер не один запит , а декiлька десяткiв однакових запитiв, обрахувавши середнiй час вiдповiдi отримаСФмо точний час обробки запиту i знаходження сервером результуючоСЧ множини елементiв. Але треба враховувати такий випадок - якщо для пiдвищення точностi послати декiлька сотень однакових запитiв, то SQL Server почне хешування таблицi для оптимiзацiСЧ своСФСЧ роботи

i результати роботи будуть не точнi, оскiльки при звичайному запитi хешування таблицi не робиться.

// 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()

Головна функцiя Test у циклi 50 разiв посилаСФ запит на сервер, обраховуСФ рiзницю мiж початком обробки запиту i часом закiнчення обробки :

StartTime=new Date();

обробка запиту

EndTime=new Date();

Delta=(EndTime - StartTime);

У останньому script маСФмо 14 тестiв для тестування рiзних можли-востей SQL Server. Розглянемо СЧх докладнiше .

Тести 12 i 13 характеризують швидкiсть вставки i вилучення елементiв у базi даних.

Тест 14 знищуСФ усю таблицю.

Запити на вибiрку iнформацiСЧ :

Тест 1:" SELECT * FROM DBTEST " - видiлити всi елементи ;

Тест 2: " SELECT * FROM DBTEST ORDER BY String" -вiдсортувати усi елементи за значенням у стовбчику тАЬStringтАЭ;

Тест 3:" SELECT * FROM DBTEST ORDER BY Number"- вiдсортува-ти усi елементи за значенням у стовбчику тАЬ Number тАЭ;

Тест 4:"SELECT Sum(Number) FROM DBTEST GROUP BY String"

- скласти усi елементи стовбчика тАЬ Number тАЭ за значенням у стовбчи-ку тАЬStringтАЭ;

Тест 5:" SELECT Sum(Number) FROM DBTEST GROUP BY

Random" - скласти усi елементи стовбчика тАЬ Number тАЭ за значенням у стовбчику тАЬ Random тАЭ;

Тест 6:" SELECT * FROM DBTEST WHERE Number = 99999 " визначити усi елементи, у яких значення у стовбчику тАЬ Number тАЭ = 99999;

Тест 7:" SELECT * FROM DBTEST WHERE String = User99999" - визначити усi елементи, у яких значення у стовбчику тАЬString тАЬ = User99999 ;

Тест 8 : "SELECT * FROM DBTEST WHERE Number in (SELECT Number FROM DBTEST ) " - визначити усi елементи з множини чисел ;

Тест 9 :"SELECT * FROM DBTEST WHERE Number in (SELECT

Number FROM DBTEST WHERE String < User50000 ) " - визначити усi елементи з множини елементiв, у яких значення у стовбчику тАЬString тАЬ < User50000 ;

Тест 10 : " SELECT * FROM DBTEST WHERE Number in (SELECT Number FROM DBTEST WHERE String=User50000)" - визначити усi елементи з множини елементiв, у яких значення у стовбчику тАЬString тАЬ = User50000;

Тест 11 : " SELECT * FROM DBTEST WHERE Number in (SELECT Number FROM DBTEST WHERE String > User10000 ) "- визначити усi елементи з множини елементiв, у яких значення у стовбчику тАЬString тАЬ > User10000 ;

Частина 3 : РЕЗУЛЬТАТИ ТЕСТУВАННЯ

Для наведення прикладу унiверсальностi при використаннi написан-ного script при вимiрюваннi швидкодiСЧ, вимiряСФмо швидкiсть обробки запитiв у системi SQL Server 7.0 та Microsoft Access 97.

Щоб script сприймався системою Access без суперечень треба змiнити параметри iдентифiкацiСЧ :

//var SQL_DataBase = "DSN=OTSt;UID=sa;PWD=;DATABASE=OTSt"

var SQL_DataBase = "DSN=OTStt;UID=;PWD="

Отриманi результати приведемо у таблицi :

Тест №SQL Server 7.0 Access 9712,673 1,81 27,7815,60337,3565,21148,2397,5450,9030,49460,3450,23170,3900,287811,2077,1193,8432,53100,6550,5071111,4699,816120,30,285130,310,221455,6234,324

Як видно з результатiв проведенного вимiрювання запити на локальнiй базi даних Access опрацьовуються значно швидше нiж на серверi.

Аналiзуючи запити 2 i 3, 4 i 5, 6 i 7 бачимо, що об