Тестирование производительности различных методов доступа к данным при работе системы с SQL Server 2000

Оценивалась производительность следующих компонент:

  • ADO;
  • SDAC (SQL Server Data Access Components);
  • BDE (используемая в системе компонента).

Характеристика настройки компонент и конфигурации оборудования представлена в Конфигурации оборудования.

Условия тестирования

Каждый тест во всех группах выполнялся 10 раз. Сервер во время тестирования был занят не только выполнением тестов, но и другой обработкой информации для эксплуатации системы. При этом характер другой работы при тестировании различных компонент не менялся. Иными словами, все тесты были организованы таким образом, чтобы не дать преимуществ ни одной из компонент.

Во время испытаний тестовое подключение рабочей станции к SQL Server было единственным для сервера. Испытания производительности компонент при многопользовательских подключениях к серверу не проводились.

Результаты тестирования представлены в пунктах 1 – 4 настоящего документа. Все значения времени выполнения операций в таблицах этих разделов измерены в миллисекундах. Первый столбец в этих таблицах содержит номер теста. Применена сквозная нумерация.

Результаты тестирования

1. Первая группа испытаний: получение длинной выборки

Перед каждой выборкой была произведена очистка буфера данных с помощью команды DBCC DROPCLEANBUFFERS. Время фиксировалось по получению последней записи из набора.

a) Select * from SP_FIRM (возвращает 4843 строк, в том числе строковые поля)

п/п

ADO

SDAC

BDE

1

1422

950

10504
2

1421

940

10405
3

1421

951

10274
4

1461

942

10666
5

1451

981

10504
6

1492

940

10445
7

1442

940 10394
8

1512

940 10365
9 1532 941 10384
10

1492

1001 11767
Мин. 1421 940 10274
Макс. 1532 1001 11767
Размах 111 61 493
Среднее

1464

952

10571

б) select top 40000 * from SP_PRICE (возвращает 40000 строк, несколько полей)

п/п

ADO

SDAC

BDE

1

1962

1842

27129
2

1932

1681

27380
3

1962

1711

29301
4

1923

1532

28351
5

2023

1642

28922
6

1942

1522

28310
7

2041

1612

28530
8

2192

1512

28331
9

1963

1512

28441
10

1923

1622

28451
Мин. 1923 1512 27129
Макс. 2192 1842 29301
Размах 269 330 2172
Среднее 1986 1619

28315

в) select ID_PRICE from PRICE_LIST (возвращает 128267 строк, возвращает только одно индексированное поле)

п/п

ADO

SDAC

BDE

1

1681

830 22563
2

1701

841 22422
3

1552

850 23233
4

1552

1001 23844
5

1562

1001 22452
6

1552

830 23023
7

1541

821 22512
8

1543

951 22462
9

1632

841 22513
10

1621

860 22483
Мин. 1543 821 22422
Макс. 1701 1001 23844
Размах 158 180 1422
Среднее

1594

883

22751

г) получение списка товаров для ЭФ «Выбор товаров из каталога (возвращает 1933 строки из четырех связанных таблиц)*

п/п

ADO

SDAC

BDE

1 1000 782 1500
2 1250 780 1594
3 1015 766 1500
4 1296 1094 1532
5 999 781 1483
6 1000 780 1484
7 983 1031 1485
8 1296 782 1483
9 990 821 1499
10

1121

810 1515
Мин. 983 766 1483
Макс. 1296 1094 1594
Размах 313 328 111
Среднее

1095

843

1507

*) тест 1.г) проводился на более мощном клиентском компьютере.

2. Вторая группа испытаний: пакетное обновление. Накапливаем изменения и отправляем пакет изменений на сервер.

В качестве примера считываем таблицу SP_PRICE (1406 строк) и обновляем в ней поле VALUE (integer)

2.1 Внесение изменений в клиентский набор

a) 10 записей

Не представляет интереса, так как на всех типах подключения обновления происходят почти мгновенно

б) 100 записей

п/п

ADO

SDAC

BDE

1 80 9 180
2 70 10 179
3 80 10 209
4 80 0 200
5 80 9 180
6 81 9 180
7 80 9 200
8 80 10 199
9 89 9 180
10 80 9 180
Мин. 70 0 179
Макс. 89 10 209
Размах 19 10 30
Среднее 80 9 ms 189 ms

в) 500 записей

п/п

ADO

SDAC

BDE

1 329 29 2513
2 329 30 2553
3 340 29 2553
4 330 30 2543
5 329 40 2553
6 329 30 2552
7 331 29 2644
8 341 29 2533
9 341 29 2543
10 329 20 2544
Мин. 329 20 2513
Макс. 341 40 2644
Размах 12 20 131
Среднее 363 30 2553

2.2 Отправка изменений на сервер.

a) 10 записей

п/п

ADO

SDAC

BDE

1 120 191 210
2 109 189 210
3 130 180 210
4 130 180 331
5 109 180 231
6 120 179 269
7 109 179 250
8 121 181 229
9 109 179 310
10 109 181 390
Мин. 109 179 210
Макс. 130 191 390
Размах 21 12 180
Среднее 117 182 306

б) 100 записей

п/п

ADO

SDAC

BDE

1 190 400 681
2 219 411 630
3 210 400 691
4 209 409 630
5 211 400 621
6 200 411 681
7 221 400 611
8 189 400 620
9 200 470 670
10 199 400 621
Мин. 189 400 611
Макс. 221 470 691
Размах 32 70 80
Среднее 205 410 646

в) 500 записей

п/п

ADO

SDAC

BDE

1 961 1501 3254
2 611 1402 3073
3 590 1362 2874
4 590 1412 2473
5 611 1401 2443
6 721 1372 2523
7 580 1362 2442
8 601 1431 2893
9 621 1362 2383
10 601 1362 2444
Мин. 580 1362 2383
Макс. 961 1501 3254
Размах 381 139 871
Среднее 649 1397 2680

3. Третья группа испытаний: выполнение процедур.

В качестве примера 10 раз попеременно выполняем процедуру SP_GET_LIST_VAL и выборку “Select * from SP_O_OPL” (каждый запрос возвращает небольшой набор записей (в данном случае 2 и 23 строк соответственно)).

п/п

ADO

SDAC

BDE

1 430 279 932
2 331 371 660
3 450 560 740
4 329 229 741
5 420 400 681
6 390 419 861
7 460 400 631
8 571 411 910
9 561 309 730
10 459 421 731
Мин. 329 229 631
Макс. 571 560 932
Размах 242 331 301
Среднее 440 380 762

Во время тестирование изначально планировалось использовать процедуру SP_GET_LIST_SKLAD, однако выяснилось, что ADO показывает чрезвычайно низкую производительность с этой процедурой при ее первом выполнении на сервере с чистым кэшем (порядка 2 сек). Для сравнения Query Analyzer, как и SDAC показали результат порядка 500-550ms, BDE – 1000-1200ms.

Объяснений этому явлению не найдено, на других тестовых примерах ADO показывал хорошую скорость. Тем не менее надо учесть, что в каких-то случаях можно наткнуться на падение производительности ADO при исполнении запросов.

4. Четвертая группа испытаний: выполнение сложных процедур

а) Расчет себестоимости

Запрос:

exec dbo.SP_COST_RECALC @dt = ‘Nov 29 2006 5:55:06:030PM’, @SkipError = 1, @IdGood = NULL, @DoDebug = NULL

п/п

ADO

SDAC

BDE

1

6048

7862

5797

2

6078

5818

9262

3

10936

5218

8962

4

13680

5777

7760

5 9433 12057

8031

6

5186

8591

8442

7

5828

9983

5858

8

11657

8983

10475

9

9152

5558

9564

10

8311

5758

8372

Мин. 5186 5218 5797
Макс. 13680 12057 10475
Размах

8494

6839

4678

Среднее 8631 7561 8252

б) Создание базовых цен

Запрос:

exec dbo.SP_PRICE_VIEW_BASE @id_shpl = 0, @price_date = ‘Mar XX 2007 12:00:00:000AM’, @order_by = NULL, @ShowLastPrice = NULL, @FromBackUp = 0, @CheckLast = NULL

XX – от 1 до 30 в зависимости от номера теста (постоянно генерируем новые цены)

п/п

ADO

SDAC

BDE

1 35622

17666

21781

2 13169

11957

17795

3 24305

19026

18687

4 18517

18215

20438

5 13619

25005

16143

6 21110

29413

17966

7 17044

22462

15272

8 15562

22371

14341

9 19518

29141

19347

10 17364

19217

29411
Мин. 13169 11957 14341
Макс. 35622 29413 29411
Размах

22453

17456

15070

Среднее 19583

21447

19118
Результаты испытаний
  • 1. Итоговые данные испытаний представлены в таблице. Данные во второй, третьей и четвертой колонках – время выполнения операций в миллисекундах. В следующих трех колонках представлены результаты сравнения производительности компонент.
  • тестов

    ADO

    SDAC

    BDE

    Ускорение

    ADO/BDE

    SDAC/BDE

    SDAC/ADO

    Получение длинной выборки
    1.а 1464 952 10571

    7.2

    11.1

    1.5

    1.б 1986 1619 28315

    14.3

    17.5

    1.2

    1.в 1594 883 22751 14.3 25.8 1.8
    1.г* 1095 843 1507 1.4 1.8 1.3
    Пакетное обновление
    на клиенте
    2.1.б 80 9 189 2.4 21.0 8.9
    2.1.в 363 30 2553 7.0 85.1 12.1
    отправка на сервер
    2.2.а 117 182 306 2.6 1.7 0.6
    2.2.б 205 410 646 3.2 1.6 0.5
    2.2.в 649 1397 2680 4.1 1.9 0.5
    Выполнение процедур
    3 440 380 762 1.7 2.0 1.2
    Выполнение сложных процедур
    4.а 8631 7561 8252 1.0 1.1 1.1
    4.б 19583 21447 19118 1.0 0.9 0.9

    *) тест 1.г проводился на более мощном клиентском компьютере.

  • 2. Во всех проводимых испытаниях (за исключением 4 группы) BDE оказался явным аутсайдером. При этом драйвер BDE оказывает наибольшую нагрузку на сервер. Технология BDE является устаревшей. В нее заложены некоторые ограничения, которые возможно обойти, но это усложняет написание кода, и, возможно, негативно сказывается на производительности системы в целом.
  • 3. Несомненным лидером испытаний являются компоненты SDAC. Их работа не вызвала нареканий и в большинстве случаев была самой быстрой. В наиболее тяжелых операциях, связанных с получением большого объема информации с сервера, SDAC показал лучшие результаты. ADO проиграл от 20% до 80% лидеру (надо отметить, что отставание не превысило 1 секунду). BDE в этом тесте не выдержал конкуренцию.
  • 4. Совершенно очевидно, что при выборе компонент надо прежде всего ориентироваться на результаты испытаний группы 1, так как 80 – 90% операций в системе – это выборка данных. Остальные группы испытаний дополняют слабые и сильные стороны той или иной технологии и показывают эффективность и корректность работы в других режимах.
  • 5. Стоит отметить, что, хотя ADO в первой группе испытаний работал медленнее SDAC, эта технология показала хорошие результаты.
  • 6. Во второй группе испытаний тестировалась работоспособность с клиентским набором. В первую очередь необходимо было убедиться, что технологии ADO и SDAC не содержат проблем BDE, связанных с торможением при изменении большого количества строк. Результаты испытаний подтвердили, что этой проблемы в ADO и SDAC нет.
  • 7. Также измерялась скорость, с которой эти изменения в клиентском наборе отправляются на сервер. Надо отметить, что в этих испытаниях ADO превзошел SDAC. Однако такие ситуации, когда изменяется действительно много строк на стороне клиента, при эксплуатации системы возникают нечасто.
  • 8. Стоит обратить внимание на третью группу испытаний. Тестировалась скорость, с которой клиент способен получать ответ на простые запросы. Здесь SDAC и ADO показали близкие результаты. Однако в некоторых немногочисленных случаях ADO сильно притормаживал (причины этого непонятны). Вполне вероятно, что это проблема решаема, но такие «отклонения от правил» настораживают.
  • 9. Из многочисленных источников в Интернете известно, что при использовании ADO сервер способен быстрее отвечать на полученные запросы. При этом нагрузка на процессор сильно снижается, что в конечном итоге приводит к увеличению количества пользователей, способных одновременно эффективно работать с базой данных. Можно предположить, что аналогичную картину можно наблюдать и при использовании компонентов SDAC.
  • Подводим итоги
  • Результаты испытаний показали высокую эффективность технологии SDAC. К несомненным достоинствам этой технологии добавляется простота миграции с BDE на механизмы, предоставляемые компонентами SDAC. Компоненты SDAC поддерживают полный набор свойств и событий компонентов BDE.
  • — SDAC (как и ADO) использует провайдер OLE DB для подключению к SQL Server.

    — SDAC специально создан для работы с SQL Server и поддерживает все возможные механизмы SQL Server.

    В отличие от SDAC ADO является общей настройкой для разных типов баз данных. Эта технология поддерживает и устаревший провайдер ODBC. Для решения проблем совместимости Microsoft была вынуждена пойти на некоторые компромиссы при создании ADO.

  • На первом этапе проекта необходимо заменить технологию BDE на SDAC. Теоретически можно сразу преступить к реализации такой замены. Можно замену проводить по-этапно, осуществлять такую замену в отдельных модулях и режимах, сразу же после тестирования передавать изменения заказчику для использования в эксплуатации на рабочей базе. Общая продолжительность введения технологии SDAC в проект по предварительной оценке – 2-3 месяца. Эта замена позволит снять с эксплуатации устаревшую, непроизводительную технологию BDE, повысить эффективность и скорость обработки данных в проекте.
  • Мы видим и достоинства технологии ADO. К ним в первую очередь относятся:
    • поддержка производителя;
    • проверенность технологии;
    • возможность найти в Интернете ответ практически на любой вопрос.

    Переход на ADO в принципе возможен, но, по нашему мнению, нерационален, так как значительно сложнее. Он потребует значительно большего количества времени и людских ресурсов из-за отсутствия в технологии ADO симметричных компонентам BDE свойств и событий.

    Конфигурация оборудования

    Сервер:

    — ПО: MS SQL Server 2000 (version 8.00.760) под Windows 2000 Server SP3 (Build 2195)

    — Процессор: Intel Pentium IV 2.8 GHz Northwood

    — Память: 512 MB DDR400 (2 x 256 Mb Dual Channel)

    — HDD: Seagate 120Gb IDE

    Клиент:
    — ПО: Delphi 6 (build 6.240) под Windows 2000 Proffesional

    — ADO: MDAC 2.8 (2.80.1022.3)

    — SDAC: SDAC version 3.80 for Delphi 6

    — BDE: version 5.01 и 5.11

    — Процессор: Intel Pentium III 533 MHz

    — Память: 384 Мб (3×128 SDRAM PC133)

    Настройки компонент

    BDE:

    TransIsolation: tiReadCommitted

    CachedUpdates: True

    ADO:

    — IsolationLevel: ilReadCommitted

    — CursorLocation: clUseClient

    — Provider: SQLOLEDB

    CursorType: ctKeySet

    LockType: ltBatchOptimistic

    SDAC:

    IsolationLevel: ilReadCommitted

    CachedUpdates: True

    CursorType: ctDefaultResultSet

    По итогам тестирования нами признана компонента доступа к данным: SQL Server Data Access Components, правильно говорят — родное всегда лучше!