C#: Используя дженерик для создания массива указателей

Фильтрация соединений только с помощью 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". По-моему, единственной целью для ее существования является краткость. Рассматривая влияние производительности, я не думаю, что это - неопровержимый довод.

12
задан Brendan 27 October 2009 в 15:48
поделиться

2 ответа

Из MSDN

Даже при использовании с небезопасным ключевое слово, взяв адрес управляемый объект, получивший размер управляемый объект или объявление указателя к управляемому типу не допускается. За дополнительную информацию см. Небезопасный код и Указатели (Руководство по программированию на C #).

Также я не знаю, есть ли у вас, но убедитесь, что вы используете фиксированное ключевое слово в своем коде.

0
ответ дан 2 December 2019 в 21:44
поделиться

Согласно Руководству по программированию на C # :

Любой из следующих типов может быть тип указателя:

  • sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal или bool
  • Любой тип перечисления.
  • Любой тип указателя.
  • Любой определяемый пользователем тип структуры, содержащий поля неуправляемых типов только.

Когда вы накладываете ограничение struct на свой универсальный тип, компилятор не имеет достаточно информации, чтобы сделать вывод, что все вышеперечисленные требования будут выполнены (в частности, последний пункт).

Поскольку у нас нет шаблонов в C #, вы можете рассмотреть возможность создания перегрузок вашего адаптера массива / указателя для числовых типов, которые имеют смысл, или фабричного класса, который создает LargeArray с заданным размером определенного типа.

12
ответ дан 2 December 2019 в 21:44
поделиться
Другие вопросы по тегам:

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