Вы должны знать, что он существует, поскольку большинство нативных функций более «продвинутого» управляемого языка в конечном итоге вызывает их.
Кроме того, он может быть заключен в языки сценариев, такие как Autoit с DllCall
Настройте очередь производителя / потребителя с одним процессом производителя, который будет извлекать из считывающего устройства и помещать записи в очередь как можно быстрее, но без «обработки». Затем какое-то другое количество процессов (сколько вам нужно, зависит от вашей системы) для удаления из очереди и обработки каждой записи в очереди.
Это простой запрос с диапазоном значений, например WHERE Id от 1 до 500000? Если это так, вы можете просто запустить N запросов, каждый из которых возвращает 1 / N диапазона. Но при использовании однопоточного подхода полезно знать, где вы находитесь в узком месте. Если вы выполняете непрерывное чтение с одного дискового шпинделя для выполнения запроса, вам, вероятно, следует придерживаться одного потока. Если он разделен между шпинделями по некоторому диапазону, вы можете разумно настроить свои запросы, чтобы максимизировать пропускную способность с диска (то есть читать с каждого диска параллельно с отдельными запросами). Если вы ожидаете, что все строки будут в памяти, вы можете распараллелить их по своему желанию. Но если запрос более сложный, вы не сможете легко разбить его без больших накладных расходов. В большинстве случаев указанные выше параметры не будут применяться должным образом, и производитель / потребитель, упомянутый Джоэлом, будет единственным местом для параллелизации. В зависимости от того, сколько времени вы тратите на обработку каждой строки, это может дать лишь незначительную выгоду.
Вы не должны читать столько строк на client.
При этом вы можете разделить свой запрос на несколько запросов и выполнять их параллельно. Это означает, что запускайте несколько команд SqlCommand в отдельных потоках и заставляйте их перемешивать каждый раздел результата. Вопрос A + состоит в том, как разделить результат, и это во многом зависит от ваших данных и вашего запроса:
ID между 1 и 10000
, ID между 10001 и 20000
и т. д.) RecordTypeID IN (1,2)
, RecordTypeID IN (3,