Published on

May 25, 2015

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

При работе с базами данных SQL Server разработчики часто используют ADO.Net и легковесные ORM для взаимодействия с базой данных. Эти инструменты позволяют использовать параметры без необходимости указывать соответствующие типы данных SQL. Хотя это может сэкономить время разработчикам, неправильное использование может привести к проблемам с производительностью.

Одна из распространенных проблем возникает при работе с параметрами строк. В .Net строки по умолчанию являются Unicode. При использовании класса System.Data.SqlClien.SqlParameter, если параметр добавляется без указания типа данных SQL, он будет рассматриваться как nvarchar, Unicode-эквивалент. Однако большинство существующих баз данных используют char или varchar, а не nchar или nvarchar.

Когда база данных обнаруживает несоответствие типов, например, сравнение nvarchar с varchar, выполняется неявное преобразование для избежания потери информации. Это преобразование должно выполняться для каждой строки в таблице, что приводит к дорогостоящему запросу с неоптимальным планом запроса.

Давайте рассмотрим пример, чтобы проиллюстрировать эту проблему. У нас есть таблица с именем Account с колонками accountNumber типа CHAR(20) и accountName типа VARCHAR(100). Если мы запрашиваем эту таблицу без указания типа данных SQL, будет сгенерирован следующий запрос и план:

SELECT accountNumber, accountName
FROM Account
WHERE accountNumber = @accountNumber

Несмотря на то, что запрос ищет конкретный аккаунт, выполняется сканирование индекса, что может быть очень дорогостоящим для большой таблицы с миллионами строк. Это может привести к конфликтам и блокировкам в базе данных, особенно если запрос вызывается несколько раз в тесном цикле.

Для улучшения производительности рекомендуется указывать тип данных SQL при добавлении параметров. Например:

SELECT accountNumber, accountName
FROM Account
WHERE accountNumber = @accountNumber

Указав тип данных SQL как CHAR и установив размер 20, будет сгенерирован запрос и план с использованием поиска по индексу, что гораздо более оптимально.

В заключение, хотя опускание типов данных SQL при использовании параметров может сэкономить время разработчикам, это может привести к снижению производительности и конфликтам в базе данных. Важно тщательно изучать запросы, генерируемые вашим кодом, и изучать их производительность. Запуск SQL Profiler может помочь отслеживать запросы приложения и их анализ, что позволит принимать обоснованные решения о указании типов данных SQL.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.