Швидкiсть обробки запитiв на SQL-серверах \укр\
Информация - Разное
Другие материалы по предмету Разное
В° враховувати такий випадок - якщо для пiдвищення точностi послати декiлька сотень однакових запитiв, то SQL Server почне хешування таблицi для оптимiзацii своСФ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х докладнiше .
Тести 12 i 13 характеризують швидкiсть вставки i вилучення елементiв у базi даних.
Тест 14 знищуСФ усю таблицю.
Запити на вибiрку iнформацii :
Тест 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 швидкодii, вимiряСФмо швидкiсть обробки запитiв у системi SQL Server 7.0 та Microsoft Access 97.
Щоб script сприймався системою Access без суперечень треба змiнити параметри iдентифiкацii :
//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 бачимо, що обробка елементiв рiзних типiв у однакових запитах маСФ рiзний час.
Так наприклад сортувати усiх елементiв за значенням у стовбчику тАЬStringтАЭ опрацьовуСФться повiльнiше нiж у стовбчику " Number"- причина у розмi?/p>