обновление odbc драйвера + его сравнение со старым драйвером, с mssql драйвером, и direct запросом с TOP.
Misha v.3 30.06.2008 15:17
/ 30.06.2008 17:37
исправил openType и options, немного изменил пропуск строк до указанного offset. стало работать существенно быстрее (ибо readOnly теперь работает).
тестировал следующим образом (MSSQL 2000):
- создал табличку с полями id int identity, uid varchar(63). на поле uid добавил unique index ASC.
- в табличку добавил 100 000 записей
- тестовый запрос:
$t[^table::sql{
SELECT
*
FROM
test
ORDER BY
uid DESC
}[
$.limit(15)
$.offset(90000)
]]
и вывожу полученные записи.
- Stop SQL server, Start SQL server, 2 обращения к скрипту.
результаты:
1. parser 3.2.3 cgi + xml + старый odbc драйвер (9.4): первый запрос ~11 сек, второй и последующие запросы ~11 сек (без изменений);
2. parser 3.2.3 cgi + xml + новый odbc драйвер (9.5): первый запрос ~600ms, второй и последующие запросы ~500ms;
3. parser 3.2.3 cgi + xml +
native mssql драйвер от egr-а: первый запрос ~5 сек, чторой и последующий ~3.5 сек.
4. запускаю Query Analizer, выполняю запрос:
SELECT getdate();
SELECT
TOP 15 *
FROM
test
WHERE
id NOT IN (
SELECT
TOP 90000 id
FROM
test
ORDER BY
uid DESC
)
ORDER BY
uid DESC;
SELECT getdate();
что первый, что последующие запросы -- ~1.5 сек (время выполнения запроса смотрю по разнице между getdate()).
4. Stop|Start серверу, запускаю profiler, затем все запросы в указанном ниже порядке (не делаю Stop|Start для каждого эксперимента, т.к. для старого драйвера и запроса с 2 TOP+подзапросом разницы от повторных запусков почти нет). ниже результаты значимых столбцов из trace.
что CPU Reads Writes Duration
старый драйвер 2625 254997 1144 14060
новый драйвер 672 2336 0 576
2 TOP + subquery 735 5346 0 1923
mssql драйвер 718 3192 0 3876
делаю вывод, что новый механизм (readonly курсор) -- лучший вариант :)
собрал и выложил обновленный драйвер и его исходники.