parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

уточнение и продолжение :)

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) значительно опережает их.