Intereting Posts
PostgreSQL: как обновлять строки в CTE Поиск отсутствующих дат с использованием SQL Два выбора или один выбор + одно соединение в SQL? Объединение таблиц в столбцах составного внешнего / первичного ключа в запросе В модуле sqlite3 Python, почему не может cursor.rowcount () указать мне количество строк, возвращаемых оператором select Получить имя исходной таблицы строки при запросе родителя, наследуемого от POSTGRESQL: как фильтровать для создания запроса? SQL ORDER BY несколькими столбцами Ограничение возвращаемой записи из SQL-запроса в Oracle SQL: какое отношение (1: 1, 1: m, m: m, …) между этими двумя таблицами? ORA-00904: неверный идентификатор Каков наилучший способ отладки хранимых процедур (и написать sprocs, которые легче отлаживать)? Различия DateTime между строками в базе данных Группа SQL и сумма за месяц – по умолчанию для нуля Как константные значения влияют на предложение ON для Joins?

Задача Linq to SQL nvarchar

Я обнаружил огромную проблему с производительностью в Linq to SQL.

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

var q = ( from a in tbl where a.index == "TEST" select a) var qa = q.ToArray(); 

Параметр передается как nvarchar, что приводит к тому, что весь индекс преобразуется из varchar в nvarchar перед использованием.

Если параметр является varchar, это очень быстрый поиск.

Есть ли способ переопределить или изменить это?

Спасибо Привет Крейгу.

Хммм. Это была известная ошибка с предварительными RTM-сборками LINQ-to-SQL, но из того, что я читал в Интернете, это была фиксированная проблема для сравнений равенств в RTM (хотя и была разбита на сопоставления Contains ()).

Независимо от того, вот на форумах MSDN есть поток с некоторыми обходными решениями: http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/4276ecd2-31ff-4cd0-82ea-7a22ce25308b

Обходной путь мне больше всего нравится:

 //define a query IQueryable<Employee> emps = from emp in dc2.Employees where emp.NationalIDNumber == "abc" select emp; //get hold of the SQL command translation of the query... System.Data.Common.DbCommand command = dc2.GetCommand(emps); //change param type from "string" (nvarchar) to "ansistring" (varchar) command.Parameters[0].DbType = DbType.AnsiString; command.Connection = dc2.Connection; //run IEnumerable<Employee> emps2 = dc2.Translate<Employee>(command.ExecuteReader()); 

Кстати, в другом случае я видел, что это произошло в таблице с нечетным распределением значений (например, 50% таблицы имели одинаковое значение), что означает, что, учитывая, что параметр неизвестен SQL Server во время компиляции плана, сканирование таблицы было лучшим план доступен. Если ваш дистрибутив также необычен, тогда обходные пути выше не будут работать, поскольку сканирование не будет происходить из отсутствующего преобразования, а скорее из самой параметризации. В этом случае единственным обходным решением, которое я бы знал, было бы использовать подсказку OPTIMIZE FOR и вручную указать SQL.