Как быстро LINQ?

Идея заключается в том, что для соображений скорости и кеширования операнды должны считываться с адресов, соответствующих их естественному размеру. Чтобы это произошло, элементы структуры компоновщика компилируются так, чтобы следующий член или следующая структура были выровнены.

struct pixel {
    unsigned char red;   // 0
    unsigned char green; // 1
    unsigned int alpha;  // 4 (gotta skip to an aligned offset)
    unsigned char blue;  // 8 (then skip 9 10 11)
};

// next offset: 12

Архитектура x86 всегда могла извлекать неверные адреса. Тем не менее, он медленнее, и когда несоосность перекрывает две разные строки кэша, тогда он вытесняет две строки кэша, когда выровненный доступ будет вытеснять только один.

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

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

Значения TL; DR: важны.

9
задан Joel Coehoorn 22 September 2008 в 16:22
поделиться

7 ответов

LINQ к SQL переводит Ваше выражение запроса в T-SQL, таким образом, Ваша производительность запросов должна быть точно тем же, как будто Вы отправили тот SQL-запрос с помощью ADO.NET. Там является немного служебным, я предполагаю, для преобразования дерева выражений для запроса в эквивалентный T-SQL, но мой опыт состоит в том, что это является маленьким по сравнению с фактическим временем запроса.

Можно, конечно, узнать точно, что сгенерирован T-SQL, и поэтому удостоверьтесь, что у Вас есть хорошие индексы поддержки.

Главная разница от DataViews - то, что LINQ к SQL не загружает все данные в память и фильтрует его там. Скорее это заставляет базу данных делать то, к чему это способно и только загружает данные соответствия в память.

19
ответ дан 4 December 2019 в 07:15
поделиться

Это зависит от того, что Вы пытаетесь сделать. LINQ был очень быстр, чтобы я вытянул данные из базы данных, но LINQ-SQL действительно непосредственно переводит Ваш запрос в SQL для выполнения его. Однако существуют времена, что я нашел, что Хранимые процедуры использования лучше при некоторых обстоятельствах.

Например, у меня есть некоторые данные, которые я должен запросить, который включает несколько таблиц и довольно интенсивных ключей. С LINQ, и относительно негибкость LINQ для настройки запросов эти запросы заняли бы несколько минут. Тонкой настройкой руки SQL (а именно, путем размещения, 'ГДЕ '-аргументы-типа в СОЕДИНЕНИИ для уменьшения интенсивности данных СОЕДИНЕНИЯ), я смог решительно улучшить производительность.

Мой совет, используйте LINQ везде, где Вы можете, но не бояться пойти путем Хранимой процедуры, если Вы решаете, что SQL, сгенерированный LINQ, является просто слишком медленным, и SQL может быть настроен рукой легко для выполнения то, в чем Вы нуждаетесь.

11
ответ дан 4 December 2019 в 07:15
поделиться

Какой длины часть строки? Как быстро LInq к SQL. Это зависит от того, как Вы используете его.

"фильтрация представлений данных является очень медленной" becuase в этой модели, Вы получаете все записи и затем фильтруете на клиенте. Но Linq к SQL не работает как этот, если Вы не злоупотребляете им.

Запрос Linq только оценен в прошлую минуту, которой это должно быть. Таким образом, можно добавить, "где" ограничения на запрос, прежде чем он будет оценен. Целое выражение, включая фильтры, выполнится на базе данных, как это должно.

Stackoverflow использует Linq, и это не маленькая база данных.

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

Мое мнение - то, что для некоторых вещей, Вы захотите, чтобы профессиональный DBA обработал оптимальный сохраненный proc. Можно затем получить доступ к этому от Linq, если Вы хотите. Но 80% или больше методов доступа к базе данных не будут критическими по отношению к производительности, и сохраненный procs может быть трудоемким излишеством для них.

Для обновлений основанные на наборе операции серверной стороны в сохраненном proc или sql с "обновлением..., где..." будет намного быстрее, чем использование нескольких распространений в прямом и обратном направлениях базы данных для чтения записи, пишут запись, повторяются.

0
ответ дан 4 December 2019 в 07:15
поделиться

Необходимо быть более конкретными с тем, под чем Вы подразумеваете, управляют записями. Если изменения не являются 100%-м человеком для каждой записи и могут делаться основанными на наборе, Вы, скорее всего, лучше из выполнения изменений в T-SQL на стороне дб (сохранил procs). Другими словами, постарайтесь не вытягивать большие объемы данных по сети и/или обработайте границы, если это возможно.

3
ответ дан 4 December 2019 в 07:15
поделиться

я нахожу, что сгенерированные запросы LINQ хороши. там некоторые лучшие практики, реализованные в запросах linq, такой нас, название таблицы префиксов от владельца, избегают (*) и так далее. когда запросы сложны (больше, чем простое соединение), я нашел, что linq всегда находят хорошее решение, и мое решение никогда не было лучше (таким образом, в моем профилировщике SQL говорится).

Затем вопрос: это - лучший прямой запрос... или переносящий запрос в сохраненный proc? сохраненный proc должен быть лучше, потому что план выполнения хранится. но на самом деле при создании выбора поставщиком SQL-сервера .NET Вы называете специальную хранимую процедуру, где первый параметр является Вашим текстом запроса. затем план выполнения кэшируется так или иначе.

Если в Вашем хранилище Вы делаете больше чем 1 выбор, сохраненный shuold лучше.

1
ответ дан 4 December 2019 в 07:15
поделиться

Стоит принять во внимание, что LINQ к SQL работает путем получения объекта от базы данных сначала, Вы затем применяете изменения свойства в объектах и называете SubmitChanges для сохранения их назад после чего, каждая строка/объект испускает необходимый оператор обновления.

Для массовых обновлений это нигде не рядом столь же эффективно как просто отправка единственного оператора обновления, который относится ко всему пакету строк за один раз.

0
ответ дан 4 December 2019 в 07:15
поделиться

Обычно, управление которого много записей должны произойти максимально близко с дб. Если бы она, где моя задача я надеялся бы выполнять в нем, сохранила procs. То, что я лично. Linq является еще одним слоем абстракции сверх доступа к данным и в то время как он работает хорошо на "нормальные" потребности т.е. несколько сотен объектов, отправленных в UI, он не должен считаться заменой для операций типа хранилища данных.

-3
ответ дан 4 December 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: