Если вы используете MS SQL 2008, вы можете / должны использовать параметры TableValue. По сути, вы бы отправили свои направляющие в виде DataTable для вашей хранимой процедуры.
Тогда внутри вашей хранимой процедуры вы можете использовать параметры в качестве «таблицы» и выполнить объединение или ИСКЛЮЧИТЬ или что у вас есть, чтобы получить свои результаты.
Этот метод быстрее, чем использование функции для разделения, потому что функции на сервере MS SQL действительно медленные.
Но я полагаю, что время затрачивается из-за большого дискового ввода-вывода, который требуется для этого запроса. Поскольку вы выполняете поиск по столбцу UId и поскольку они «случайные», никакой индекс здесь не поможет. Двигателю придется прибегнуть к сканированию таблицы. Это означает, что вам понадобится серьезная производительность дискового ввода-вывода, чтобы получить результаты в «хорошее время».
Использование типа данных Uid в качестве индекса не рекомендуется. Тем не менее, это может не иметь значения в вашем случае. Но позвольте мне спросить вас об этом:
Руководства, которые вы отправляете из своего приложения, являются просто случайным списком руководств или здесь есть какие-то деловые отношения или отношения сущностей? Вполне возможно, что ваша модель данных не соответствует тому, что вы пытаетесь сделать. Так как же определить, по каким путеводителям вам нужно искать?
Однако, ради аргумента, давайте предположим, что ваши направляющие являются просто случайным выбором, тогда нет индекса, который действительно используется, так как ядро базы данных должно будет выполнить сканирование таблицы, чтобы выбрать каждую из требуемых направляющих / записей из миллион записей у вас есть. В такой ситуации единственный способ ускорить процесс - это физический уровень базы данных, то есть физическое хранение ваших данных на жестких дисках и т. Д.
Например:
Более быстрые диски улучшат производительность
Если этот тип запроса запускается снова и снова, то поможет больше памяти на коробке, потому что движок может кэшировать данные в памяти, и ему не нужно будет выполнять физическое чтение
Если вы разделите вашу таблицу, то движок может распараллелить операцию поиска и быстрее получить результаты.
Если ваша таблица содержит много других полей, которые вам не всегда нужны, то разделение таблицы на две таблицы, где table1 содержит guid и минимальный минимальный набор полей, а table2 содержит остальные, ускорится. запрос совсем немного из-за требований дискового ввода-вывода меньше
Здесь можно посмотреть множество других вещей
Также обратите внимание, что когда вы отправляете специальные операторы SQL, которые не имеют параметров, движок должен создавать план каждый раз, когда вы его выполняете. В этом случае это не имеет большого значения, но имейте в виду, что каждый план будет кэшироваться в памяти, выталкивая любые данные, которые могли быть кэшированы.
Наконец, в этом случае вы всегда можете увеличить свойство commandTimeOut, чтобы обойти проблемы тайм-аута.
Сколько времени требуется сейчас и какие улучшения вы ожидаете получить или надеетесь получить?