Фильтрация соединений только с помощью WHERE
может быть чрезвычайно неэффективной в некоторых общих сценариях. Например:
SELECT * FROM people p, companies c
WHERE p.companyID = c.id AND p.firstName = 'Daniel'
базы данных Most выполнят этот запрос вполне буквально, сначала беря Декартово произведение из people
и companies
таблицы и тогда фильтрация по тем, которые имеют соответствие companyID
и id
поля. В то время как полностью неограниченный продукт не существует нигде, но в памяти и затем только на мгновение, ее вычисление действительно занимает время.
А лучший подход должен сгруппировать ограничения с JOIN
с, где релевантный. Это не только субъективно легче считать, но также и намного более эффективный. Таким образом:
SELECT * FROM people p JOIN companies c ON p.companyID = c.id
WHERE p.firstName = 'Daniel'
Это немного более длинно, но база данных в состоянии посмотреть ON
пункт и использовать его, чтобы вычислить полностью ограниченный JOIN
непосредственно, вместо того, чтобы запуститься с [1 113] все и затем ограничить вниз. Это быстрее для вычисления (особенно с большими наборами данных и/или соединениями много-таблицы) и требует меньшей памяти.
я изменяю каждый запрос, который я вижу который использование синтаксис "запятой JOIN
". По-моему, единственной целью для ее существования является краткость. Рассматривая влияние производительности, я не думаю, что это - неопровержимый довод.
Из MSDN
Даже при использовании с небезопасным ключевое слово, взяв адрес управляемый объект, получивший размер управляемый объект или объявление указателя к управляемому типу не допускается. За дополнительную информацию см. Небезопасный код и Указатели (Руководство по программированию на C #).
Также я не знаю, есть ли у вас, но убедитесь, что вы используете фиксированное ключевое слово в своем коде.
Согласно Руководству по программированию на C # :
Любой из следующих типов может быть тип указателя:
- sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal или bool
- Любой тип перечисления.
- Любой тип указателя.
- Любой определяемый пользователем тип структуры, содержащий поля неуправляемых типов только.
Когда вы накладываете ограничение struct
на свой универсальный тип, компилятор не имеет достаточно информации, чтобы сделать вывод, что все вышеперечисленные требования будут выполнены (в частности, последний пункт).
Поскольку у нас нет шаблонов в C #, вы можете рассмотреть возможность создания перегрузок вашего адаптера массива / указателя для числовых типов, которые имеют смысл, или фабричного класса, который создает LargeArray
с заданным размером определенного типа.