Пример 3: использование функции COUNT и оценка её производительности
•fwi_nn — поле с индексом без NULL^B («field, with index, no nulls») (число).
Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 25/545
Пример 3: использование функции COUNT и оценка её производительности
dm MySQLР
test_counts
«column»
*PK id: INT fni: INT fwi: INT
*fni_nn: INT
*fwi_nn: INT
«PK»
+PK_test_cou nts(I NT)
«index»
+idx_fwi(INT)
+idx_fwi_nn(INT)
dm SQLServer2012
«column»
*PK id: int fni : int fwi: int
*fni _nn: i nt
*fwi_nn: int
«PK»
+P K_test_cou nts(int)
«index»
+idx_fwi(int)
+idx_fwi_nn(int)
test_counts
«column»
*PK id: NUMBER(10) fni: NUMBER(10) fwi : NUMBER(10)
*fni_nn: NUMBER(10)
*fwi_nn: NUMBER(10)
«PK»
+PK_test_counts(NUMBER)
«index»
+idx_fwi(NUMBER)
+idx_fwi_nn(NUMBER)
MySQL MS SQL Server Oracle
Рисунок 2.1.a — Таблица test_counts во всех трёх СУБД
Суть исследования состоит в последовательном добавлении в таблицу по тысяче записей (от нуля до десяти миллионов с шагом в тысячу) и выполнении следующих семи запросов с COUNT после добавления каждого десятка тысяч записей:
MySQL Исследование 2.1.3.EXP.A
1— Вариант 1: COUNT(*) SELECT COUNT(*) FROM
2'test_counts'
3
1— Вариант 2: СОиот(первичный_ключ)
2SELECT COUNT('id')
3 FROM 'test_counts'
1— Вариант 3: COUNT(1)
2SELECT COUNT(1)
3 FROM 'test_counts'
1-- Вариант 4: СОиот(поле_без_индекса)
2SELECT COUNT('fni')
3 FROM 'test_counts'
1-- Вариант 5: СОиот(поле_с_индексом)
2SELECT COUNT('fwi')
3 FROM 'test_counts'
-- Вариант 6: COUNT(DISTINCT
1поле_без_индекса)
2SELECT COUNT(DISTINCT 'fni')
3 FROM 'test_counts'
1-- Вариант 7: COUNT(DISTINCT поле_с_индексом)
2SELECT COUNT(DISTINCT 'fwi')
3 FROM 'test counts'
MS SQL | Исследование 2.1.3.EXP.A |
1— Вариант 1: COUNT(*)
2SELECT COUNT(*)
3 FROM [test_counts]
1-- Вариант 2: СОиот(первичный_ключ)
2SELECT COUNT([id])
3 FROM [test_counts]
1— Вариант 3: COUNT(1)
2SELECT COUNT(1)
3 FROM [test_counts]
1-- Вариант 4: СОиот(поле без индекса)
2SELECT COUNT([fni])
3FROM [test counts]
Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 26/545
Пример 3: использование функции COUNT и оценка её производительности
|
MS SQL |
Исследование 2.1.3.EXP.A (продолжение) | |
||
1 |
- Вариант 5: COUNT(поле с индексом) |
|||
2 |
SELECT COUNT([fwi]1 |
|||
3 |
FROM |
[test_counts] |
||
1 |
- |
Вариант 6: COUNT(DISTINCT поле без индекса) |
||
- |
||||
|
|
|
||
2 |
SELECT COUNT(DISTINCT [fni] |
|||
3 |
FROM |
[test_counts] |
||
1 |
- |
Вариант 7: COUNT(DISTINCT поле с индексом) |
||
- |
||||
|
||||
|
|
|
||
2 |
SELECT COUNT(DISTINCT [fwi] |
|||
3 |
FROM |
[test counts] |
||
|
|
|
||
|
Oracle |
Исследование 2.1.3.EXP.A | |
||
1- Вариант 1: COUNT(*)
2SELECT COUNT(*)
3 |
FROM |
"test_counts" |
||
1 |
- |
Вариант 2: COUNT(первичный_ключ) |
||
- |
||||
|
||||
|
|
|
||
2 |
SELECT COUNT("id") |
|||
3 |
FROM |
"test_counts" |
||
1 |
- |
Вариант 3: COUNT(1) |
||
- |
||||
|
||||
|
|
|
||
2 |
SELECT COUNT(1) |
|||
3 |
FROM |
"test_counts" |
||
1 |
- |
Вариант 4: COUNT(поле без индекса) |
||
- |
||||
|
||||
|
|
|
||
2 |
SELECT COUNT("fni") |
|||
3 |
FROM |
"test_counts" |
||
1 |
- |
Вариант 5: COUNT(поле с индексом) |
||
- |
||||
|
||||
|
|
|
||
2 |
SELECT COUNT("fwi") |
|||
3 |
FROM |
"test_counts" |
||
1 |
- |
Вариант 6: COUNT(DISTINCT поле без индекса) |
||
- |
||||
|
|
|
||
2 |
SELECT COUNT(DISTINCT "fni" |
|||
3 |
FROM |
"test_counts" |
||
1 |
- |
Вариант 7: COUNT(DISTINCT поле с индексом) |
||
- |
||||
|
||||
|
|
|
||
2 |
SELECT COUNT(DISTINCT "fwi" |
|||
3 |
FROM |
"test_counts" |
||
В первую очередь рассмотрим время, затраченное каждой СУБД на вставку тысячи записей, и зависимость этого времени от количества уже имеющихся в таблице записей. Соответствующие данные представлены на рисунке 2.1. b.
Как видно из графика, даже на таком относительно небольшом объёме данных все три СУБД показали падение производительности операции вставки ближе к концу эксперимента. Сильнее всего данный эффект проявился у Oracle. MySQL показал наименьшее время выполнения операции на протяжении всего эксперимента (также результаты MySQL оказались самыми стабильными).
Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 27/545
Пример 3: использование функции COUNT и оценка её производительности
Рисунок 2.1.b — Время, затраченное каждой СУБД на вставку тысячи записей
Теперь посмотрим на графики зависимости времени выполнения каждого из семи рассмотренных выше запросов 2.1.3.EXP.A от количества данных в таблице.
На рисунках 2.1.c, 2.1.d, 2.1 .e приведены графики для MySQL, MS SQL Server и
Oracle соответственно.
Рисунок 2.1.c — Время, затраченное MySQL на выполнение разных COUNT
Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 28/545
Пример 3: использование функции COUNT и оценка её производительности
Рисунок 2.1.d — Время, затраченное MS SQL Server на выполнение разных
COUNT
Рисунок 2.1.e — Время, затраченное Oracle на выполнение разных COUNT
Чтобы увидеть всю картину целиком, представим в таблице значения медиан времени выполнения каждого запроса 2.1.3.EXP.A для каждой СУБД:
|
MySQL |
MS SQL Server |
Oracle |
COUNT(*) |
36.662 |
0.702 |
0.541 |
COUNT(id) |
11.120 |
0.679 |
0.001 |
COUNT(1) |
9.995 |
0.681 |
0.001 |
COUNT(fni) |
6.999 |
1.494 |
0.001 |
COUNT(fwi) |
12.333 |
1.475 |
0.001 |
COUNT(DISTINCT fni) |
9.252 |
6.300 |
0.001 |
COUNT(DISTINCT fwi) |
9.626 |
1.743 |
0.001 |
Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 29/545