уточнение и продолжение :)
Misha v.3 01.07.2008 11:45
/ 01.07.2008 12:03
голова < пепел :)
в описание исходных условий вкралась ошибка, в связи с тем что я сравнение старого odbc драйвера с новым драйвером и запросом с 2 TOP проводил в пятницу, но тогда у меня не получалось подключить mssql драйвер. результаты были похожие, поэтому когда вчера мне удалось подключить mssql драйвер и я выполнил все тесты повторно я упустил одну важную деталь: таблица к тому моменту была модифицирована и в ней появились дополнительные столбцы: name VARCHAR(127) с русскими строками длиной от 4 до 10 букв, dt DATETIME, ts TIMESTAMP, number FLOAT.
в запросе напрямую они не участвовали, однако доставались (*)
спасибо egr-у за то, что вынудил ещё раз взглянуть на код и подумать над результатами.
обратите внимание: сравнивать мои результаты с его напрямую нельзя, разные системы, разные сервера. имеет смысл сравнивать результаты работы в одной системе.
в общем создал другую таблицу, как описано ранее (id INT IDENTITY, uid VARCHAR(63), скопированы все uid-ы из предыдущей таблицы, unique индекс).
"участники" тестирования те-же самые: 323 + xml, старый odbc драйвер, новый odbc драйвер и mssql драйвер.
результаты (все цифры от запроса к запросу немного плавают, CPU убрал, т.к. в любом запросе у меня он скачет на порядок):
что Reads Writes Duration
старый драйвер 221185 734 13860
новый драйвер 2800 0 550
2 TOP + subquery 5300 0 1400(2400 -- первый запрос)
mssql драйвер 2950 0 1700
ситуация изменилась, но не сильно.
старый odbc драйвер очень сильно грузит сервер и в разы проигрывает новому драйверу.
почему с mssql драйвером (а скорее всего MSSQL 2000 сервер) начинает тупить с большими offset не очень понятно, судя по trace -- не должен. ещё раз читаем сообщение egr-а: скорее всего имеет место быть какая-то неоптимальность в MSSQL 2000, которая поправлена в более поздних версиях сервера.
до кучи решил посмотреть как обстоят дела с запросом без больших offset (значительно чаще встречаются задачи "показать последние N записей").
в парсерном запросе просто закомментировал $.offset(90000); запрос, который был с 2 TOP и подзапросами сильно упростился (в результате он представляет то, что отправляется серверу mssql драйвером):
SELECT
TOP 15 *
FROM
test
ORDER BY
uid DESC;
результаты:
что Reads Writes Duration
старый драйвер 220306 650 800
новый драйвер 2800 0 300
query in QA 60 0 20
mssql драйвер 70 0 20
видим: новый odbc драйвер в любом случае лучше старого.
mssql драйвер благодаря использованию mssql специфики (TOP) значительно опережает их.