Объединение “КАК” и “В” для SQL Server [дубликат]

mmap путь быстрее. Вы могли бы записать простой сравнительный тест для доказательства его себе:

char data[0x1000];
std::ifstream in("file.bin");

while (in)
{
  in.read(data, 0x1000);
  // do something with data
}

по сравнению с:

const int file_size=something;
const int page_size=0x1000;
int off=0;
void *data;

int fd = open("filename.bin", O_RDONLY);

while (off < file_size)
{
  data = mmap(NULL, page_size, PROT_READ, 0, fd, off);
  // do stuff with data
  munmap(data, page_size);
  off += page_size;
}

Очевидно, я не учитываю детали (как то, как определить, когда Вы достигаете конца файла, если Ваш файл не является несколькими из page_size, например), но это действительно не должно быть намного более сложно, чем это.

, Если Вы можете, Вы могли бы попытаться разбить свои данные в несколько файлов, которые могут быть mmap () - редактор полностью вместо частично (намного более простого).

Несколько месяцев назад у меня была непродуманная реализация раздвижного окна mmap () - потоковый класс редактора для boost_iostreams, но никто не заботился, и я начал действовать с другим материалом. Больше всего, к сожалению, я удалил архив старых незаконченных проектов несколько недель назад, и это было одной из жертв:-(

Обновление : Я должен также добавить протест, что этот сравнительный тест выглядел бы очень отличающимся в Windows, потому что Microsoft реализовала изящный кэш файла, который делает большую часть того, что Вы сделали бы с mmap во-первых. Т.е. для часто полученных доступ файлов, Вы могли просто сделать станд.:: ifstream.read () и это было бы с такой скоростью, как mmap, потому что кэш файла уже сделает размещение в ОЗУ для Вас, и это прозрачно.

Заключительное Обновление : Посмотрите, люди: через большое количество различных комбинаций платформы ОС и стандартных библиотек и дисков и иерархий памяти, я не могу сказать наверняка, что системный вызов mmap, просматриваемый как черный квадрат, всегда всегда всегда будет существенно быстрее, чем read. Это не было точно моим намерением, даже если мои слова могли бы быть истолкованы тот путь. В конечном счете, моя точка была то, что i/o с отображенной памятью обычно быстрее, чем основанный на байте i/o; это все еще верно . Если Вы находите экспериментально, что нет никакого различия между этими двумя, то единственное объяснение, которое кажется разумным мне, состоит в том, что Ваша платформа реализует размещение в ОЗУ под покрытиями способом, которое выгодно для производительности вызовов к read. Единственный способ быть абсолютно уверенным, что Вы используете i/o с отображенной памятью портативным способом, состоит в том, чтобы использовать mmap. Если Вы не заботитесь о мобильности, и можно полагаться на представляющие параметры целевых платформ, то использование read может подойти, не жертвуя в известной мере никакой производительностью.

Редактирование для чистки списка ответа: @jbl:

раздвижное окно mmap звучит интересным. Можно ли сказать немного больше об этом?

Уверенный - я писал библиотеку C++ для Мерзавца (libgit ++, если Вы будете), и я столкнулся с подобной проблемой к этому: Я должен был быть в состоянии открыть большие (очень большие) файлы и не иметь производительность быть общей собакой (как это будет с std::fstream).

Boost::Iostreams уже имеет mapped_file Источник, но проблема состояла в том, что это было mmap, проверяют с помощью ping-запросов целые файлы, который ограничивает Вас 2^ (wordsize). На 32-разрядных машинах 4 ГБ не являются достаточно большими. Весьма разумно ожидать иметь .pack файлы в Мерзавце, которые становятся намного больше, чем это, таким образом, я должен был считать файл в блоках, не обращаясь к регулярному файлу i/o. Под покрытиями [1 112], я реализовал Источник, который является более или менее другим представлением взаимодействия между [1 113] и std::istream. Вы могли также попробовать аналогичный подход, просто наследовавшись std::filebuf в mapped_filebuf и точно так же наследовавшись std::fstream в [1 118]. Это - взаимодействие между двумя, в которых это трудно разобраться. Boost::Iostreams имеет часть работы, сделанной для Вас, и она также обеспечивает рычаги для фильтров и цепочек, таким образом, я думал, что будет более полезно реализовать его тот путь.

228
задан MPelletier 12 January 2014 в 05:15
поделиться

5 ответов

По сути, оператор IN создает серию операторов ИЛИ ... так что

SELECT * FROM table WHERE column IN (1, 2, 3)

Фактически

SELECT * FROM table WHERE column = 1 OR column = 2 OR column = 3

И, к сожалению, это путь, по которому вам придется идти со своими операторами LIKE

SELECT * FROM table
WHERE column LIKE 'Text%' OR column LIKE 'Hello%' OR column LIKE 'That%'
251
ответ дан 23 November 2019 в 03:44
поделиться

Еще один вариант - использовать что-то вроде этого

SELECT  * 
FROM    table t INNER JOIN
        (
            SELECT  'Text%' Col
            UNION SELECT 'Link%'
            UNION SELECT 'Hello%'
            UNION SELECT '%World%'
        ) List ON t.COLUMN LIKE List.Col
107
ответ дан 23 November 2019 в 03:44
поделиться

Вам нужно несколько предложений LIKE, соединенных оператором OR.

SELECT * FROM table WHERE 
column LIKE 'Text%' OR 
column LIKE 'Link%' OR 
column LIKE 'Hello%' OR 
column LIKE '%World%' OR 
8
ответ дан 23 November 2019 в 03:44
поделиться

Нет, MSSQL не допускает такие запросы. Вы должны использовать столбец LIKE '...' ИЛИ ​​столбец LIKE '...' и т. Д.

5
ответ дан 23 November 2019 в 03:44
поделиться

Нет, вам придется использовать ИЛИ , чтобы объединить ваши LIKE утверждения:

SELECT 
   * 
FROM 
   table
WHERE 
   column LIKE 'Text%' OR 
   column LIKE 'Link%' OR 
   column LIKE 'Hello%' OR
   column LIKE '%World%'

Вы просматривали полнотекстовый поиск ?

9
ответ дан 23 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

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