SlideShare a Scribd company logo
1 of 13
Download to read offline
Рекомендации по оптимизации
Создавайте вспомогательные структуры в базе с учетом
специфики запросов к данным.
Пишите так, чтобы помочь оптимизатору запросов.
1. Индексы не будут использованы
•	 WHERE COL1 > COL2
•	 WHERE COL1 < COL2
•	 WHERE COL1 >= COL2
•	 WHERE COL1 <= COL2
•	 WHERE COL1 IS NOT NULL
•	 WHERE COL1 NOT IN (value1, value2)
•	 WHERE COL1 != expression
•	 WHERE COL1 LIKE '%patern'
2. Не используйте
выражения от индексных
столбцов
SELECT DEPT_NAME FROM DEPARTMENT WHERE
UPPER(DEPT_NAME) like 'SALES%');
3. Для фильтрации записей
используйте WHERE, а не HAVING
•	 Запрос без индекса:
SELECT DEPTID, SUM(SALARY)
FROM EMP
GROUP BY DEPTID
HAVING DEPTID = 100;
•	 Запрос с индексом:
SELECT DEPTID, SUM(SALARY)
FROM EMP
WHERE DEPTID = 100
GROUP BY DEPTID;
4. Для использования индекса по
нескольким столбцам указывайте в
разделе WHERE начальные столбцы
ключа индекса			
• Индекс: Index(PART_NUM, PRODUCT_ID)
• Запрос с использованием индекса:
SELECT * FROM PARTS WHERE PART_NUM = 100;
• Запрос без использования индекса:
SELECT * FROM PARTS WHERE PRODUCT_ID = 5555;
 
5. Не стройте индексы для
маленьких таблиц		
• Если таблица небольшого размера,
то индексы не нужны.
• При выборе из таблицы более 15-25% строк
полный просмотр быстрее, чем сканирование
через индекс.
6. Стройте индексы для полей, по
которым производится сортировка
записи - тогда оптимизатор будет
использовать индексное
сканирование
SELECT SALARY FROM EMP
ORDER BY EMPID;
7. Минимизируйте число
просмотров таблиц		
• Два просмотра таблицы:
SELECT *
FROM STUDENT WHERE GroupNumber = 341
UNION
SELECT *
FROM STUDENT WHERE GroupNumber = 441
• Один просмотр таблицы:
SELECT *
FROM STUDENT WHERE GroupNumber = 341
OR GroupNumber =441)
 
8. Соединяйте таблицы
в правильном порядке
При соединении таблиц вначале указывайте
таблицу с меньшим количеством строк.
9. Используйте более
простые запросы
•	 Много мелких запросов в цикле лучше объединить
в один большой.
•	 Чтобы уменьшить количество вложенных запросов,
можно делать промежуточные выборки.
10. IN, EXISTS или JOIN?
•	 Если в основной выборке много строк,
а в подзапросе мало, то лучше использовать IN.
•	 Если в подзапросе сложный запрос, а в основной
выборке относительно мало строк, то лучше
использовать EXISTS.
•	 Если оба запрос сложные, надо использовать JOIN. 
11. Группировка
Если после группировки надо отсортировать результат,
то желательно, чтобы поля сортировки и поля
группировки перечислялись в одном порядке.
12. Используйте результаты
работы оптимизатора повторно		
• В оперативной памяти хранятся все результаты
ранее выполненных запросов до тех пор, пока эта
память не потребуется для записи результатов
последующих запросов.
• По возможности составляйте запросы таким
образом, чтобы они совпадали с написанными
ранее.

More Related Content

Similar to 34 - Базы данных. Рекомендации по составлению запросов

Индексы в MySQL
Индексы в MySQLИндексы в MySQL
Индексы в MySQLPavel Zyukin
 
СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8Technopark
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
 
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...it-people
 
Query perfomance tuning
Query perfomance tuningQuery perfomance tuning
Query perfomance tuningcollabock
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaSveta Smirnova
 
Разработка баз данных - введение
Разработка баз данных - введениеРазработка баз данных - введение
Разработка баз данных - введениеАлександр Шамрай
 
0043
00430043
0043JIuc
 
Иван Фролков
Иван ФролковИван Фролков
Иван ФролковCodeFest
 
Оптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовОптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовAlex.Kolonitsky
 
MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. RussianRawan Qurmet
 
22 - Базы данных. Представления
22 - Базы данных. Представления22 - Базы данных. Представления
22 - Базы данных. ПредставленияRoman Brovko
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьSergey Xek
 
0042
00420042
0042JIuc
 

Similar to 34 - Базы данных. Рекомендации по составлению запросов (15)

Индексы в MySQL
Индексы в MySQLИндексы в MySQL
Индексы в MySQL
 
СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
 
Query perfomance tuning
Query perfomance tuningQuery perfomance tuning
Query perfomance tuning
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
 
24 25 запросы
24 25 запросы24 25 запросы
24 25 запросы
 
Разработка баз данных - введение
Разработка баз данных - введениеРазработка баз данных - введение
Разработка баз данных - введение
 
0043
00430043
0043
 
Иван Фролков
Иван ФролковИван Фролков
Иван Фролков
 
Оптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовОптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросов
 
MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. Russian
 
22 - Базы данных. Представления
22 - Базы данных. Представления22 - Базы данных. Представления
22 - Базы данных. Представления
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
0042
00420042
0042
 

More from Roman Brovko

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task NetworkingRoman Brovko
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3Roman Brovko
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernetRoman Brovko
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2Roman Brovko
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1Roman Brovko
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flashRoman Brovko
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2CRoman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uartRoman Brovko
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorRoman Brovko
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwmRoman Brovko
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsRoman Brovko
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_worldRoman Brovko
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisitesRoman Brovko
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advancedRoman Brovko
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advancedRoman Brovko
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advancedRoman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окруженияRoman Brovko
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advancedRoman Brovko
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basicsRoman Brovko
 

More from Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
 

34 - Базы данных. Рекомендации по составлению запросов

  • 1. Рекомендации по оптимизации Создавайте вспомогательные структуры в базе с учетом специфики запросов к данным. Пишите так, чтобы помочь оптимизатору запросов.
  • 2. 1. Индексы не будут использованы • WHERE COL1 > COL2 • WHERE COL1 < COL2 • WHERE COL1 >= COL2 • WHERE COL1 <= COL2 • WHERE COL1 IS NOT NULL • WHERE COL1 NOT IN (value1, value2) • WHERE COL1 != expression • WHERE COL1 LIKE '%patern'
  • 3. 2. Не используйте выражения от индексных столбцов SELECT DEPT_NAME FROM DEPARTMENT WHERE UPPER(DEPT_NAME) like 'SALES%');
  • 4. 3. Для фильтрации записей используйте WHERE, а не HAVING • Запрос без индекса: SELECT DEPTID, SUM(SALARY) FROM EMP GROUP BY DEPTID HAVING DEPTID = 100; • Запрос с индексом: SELECT DEPTID, SUM(SALARY) FROM EMP WHERE DEPTID = 100 GROUP BY DEPTID;
  • 5. 4. Для использования индекса по нескольким столбцам указывайте в разделе WHERE начальные столбцы ключа индекса • Индекс: Index(PART_NUM, PRODUCT_ID) • Запрос с использованием индекса: SELECT * FROM PARTS WHERE PART_NUM = 100; • Запрос без использования индекса: SELECT * FROM PARTS WHERE PRODUCT_ID = 5555;
  • 6.   5. Не стройте индексы для маленьких таблиц • Если таблица небольшого размера, то индексы не нужны. • При выборе из таблицы более 15-25% строк полный просмотр быстрее, чем сканирование через индекс.
  • 7. 6. Стройте индексы для полей, по которым производится сортировка записи - тогда оптимизатор будет использовать индексное сканирование SELECT SALARY FROM EMP ORDER BY EMPID;
  • 8. 7. Минимизируйте число просмотров таблиц • Два просмотра таблицы: SELECT * FROM STUDENT WHERE GroupNumber = 341 UNION SELECT * FROM STUDENT WHERE GroupNumber = 441 • Один просмотр таблицы: SELECT * FROM STUDENT WHERE GroupNumber = 341 OR GroupNumber =441)
  • 9.   8. Соединяйте таблицы в правильном порядке При соединении таблиц вначале указывайте таблицу с меньшим количеством строк.
  • 10. 9. Используйте более простые запросы • Много мелких запросов в цикле лучше объединить в один большой. • Чтобы уменьшить количество вложенных запросов, можно делать промежуточные выборки.
  • 11. 10. IN, EXISTS или JOIN? • Если в основной выборке много строк, а в подзапросе мало, то лучше использовать IN. • Если в подзапросе сложный запрос, а в основной выборке относительно мало строк, то лучше использовать EXISTS. • Если оба запрос сложные, надо использовать JOIN. 
  • 12. 11. Группировка Если после группировки надо отсортировать результат, то желательно, чтобы поля сортировки и поля группировки перечислялись в одном порядке.
  • 13. 12. Используйте результаты работы оптимизатора повторно • В оперативной памяти хранятся все результаты ранее выполненных запросов до тех пор, пока эта память не потребуется для записи результатов последующих запросов. • По возможности составляйте запросы таким образом, чтобы они совпадали с написанными ранее.