Member 11856456 Ответов: 2

Как разбить запрос на несколько таблиц с помощью набора данных


У меня есть запрос, который возвращает 1 000 000 строк. Как я могу взять это и разбить на более мелкие партии по 10 000 штук? У меня он установлен, чтобы заполнить объект DataTable называется ДТ. Однако я хотел бы, чтобы он заполнял набор данных несколькими таблицами по 10 000.

то, что я хочу сделать, это пройти через каждый из них.

sqlconn1.Open()
        sqladaptor.SelectCommand = New SqlCommand("Select * from Profile, sqlconn1)
        sqladaptor.SelectCommand.CommandTimeout = False
        sqladaptor.SelectCommand.ExecuteNonQuery()
        sqladaptor.Fill(dt)
        sqlconn1.Close()
        sqlconn1.Dispose()
        sqladaptor.Dispose()


Что я уже пробовал:

Я заполнял таблицу данных, я могу настроить ее так, чтобы она заполняла одну таблицу в наборе данных. но мне нужно динамически создавать таблицы для набора данных. Я подумал, что дозирование их может сделать это проще.

2 Ответов

Рейтинг:
6

OriginalGriff

Чтобы добавить к тому, что Дейв правильно сказал, то, что вы делаете, все равно не извлекает 1 000 000 записей - вместо этого он пытается извлечь 2 000 000!

sqlconn1.Open()
sqladaptor.SelectCommand = New SqlCommand("Select * from Profile, sqlconn1)
sqladaptor.SelectCommand.CommandTimeout = False
sqladaptor.SelectCommand.ExecuteNonQuery()
sqladaptor.Fill(dt)
sqlconn1.Close()
sqlconn1.Dispose()
sqladaptor.Dispose()

Эта линия:
sqladaptor.SelectCommand.ExecuteNonQuery()
Выполняет вашу команду SQL, что означает, что SQL подготавливает 1 000 000 строк для возврата и возвращает количество найденных строк.
Затем эта строка:
sqladaptor.Fill(dt)
Делает это снова, сохраняя все 1 000 000 строк в DataTable.

Если бы вы попытались найти менее эффективный способ сделать что-нибудь, это, вероятно, было бы так!

И, пожалуйста, не используйте SELECT * FROM - всегда есть список строк, которые вы хотите в порядке, вы хотите их: SELECT Column1, Column2 FROM ... это сокращает объем данных, которые вы хотите извлечь, до минимума, возвращая только столбцы, которые вы собираетесь использовать - а изображения, например, могут занимать значительное пространство, - и делает ваш код моим "надежным" в случае изменений базы данных.

Но главное, что нужно убрать из этого, как говорит Дэйв: никогда не пытайтесь представить пользователю более ста или около того строк: страница, Поиск, фильтр - но подумайте, как пользователь на мгновение: как вы собираетесь найти строку, которая вас интересует, из 1 000 000 строк, нанесенных на ваш экран? Сколько времени вам понадобится, чтобы прокрутить вниз так далеко?
Делайте это по-своему, и ваши пользователи возненавидят ваше приложение, а значит, и вас самих.


Dave Kreskowiak

Я даже не потрудился взглянуть на код, потому что идея получить 1 миллион записей была просто безумной, независимо от того, как это было сделано.

OriginalGriff

Делать это дважды - это новый уровень безумия! :смеяться:

Member 11856456

Я вижу, что он создает 2 000 000, потому что те же самые данные в базе данных плюс datatable, который я заполнил. Я также должен был объяснить, что заполненная таблица данных находится только в памяти и не отображается. его просто нужно сравнивать в фоновом режиме при поиске совпадающих данных, когда кто-то импортирует файл excel. Я соединю вашу информацию с тем, что получил от Дэйва. Спасибо вам обоим!

OriginalGriff

Это не имеет значения, он все еще использует глупый объем данных, и это подчеркивает SQL server, его пропускную способность и ваше приложение.

Вместо того чтобы читать все это, используйте предложения SQL WHERE для извлечения только тех данных, которые вам нужны, когда они вам нужны. Это имеет дополнительное преимущество-быть в курсе изменений, вносимых другими пользователями той же базы данных.

Member 11856456

спасибо, отличная информация!

Рейтинг:
18

Dave Kreskowiak

Вы не. Вам придется разбить запрос на несколько запросов, каждый из которых возвращает свой собственный набор записей.

Откровенно говоря, считывание 1 000 000 в память-ужасная идея по любой причине. Умножьте 1 000 000 на количество байт данных в каждой строке, и это примерно то, сколько памяти вам понадобится, чтобы сохранить его.

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

Вы не можете получить никакого преимущества в производительности от загрузки всех этих данных в память для любого вида обработки. Такая обработка должна быть оставлена на SQL Server, потому что это то, для чего он был разработан.

Тааак, зачем тебе это нужно?


Member 11856456

есть ли место, чтобы получить пример того, как это сделать? Я не против изменить дизайн и код того, что я делаю сейчас. Я решил, что это не самый лучший способ, но это был единственный способ, которым я мог понять, как сравнивать с имеющимися у меня данными.

Dave Kreskowiak

- Что делать? Зачем вам понадобилось загружать в память 1 миллион записей?

Member 11856456

Как это сделать: "вам придется разбить свой запрос на несколько запросов, каждый из которых возвращает свой собственный набор записей". Это может быть хорошим опытом обучения для меня. Итак, вместо 1 000 000 в памяти, как мне сделать ваш метод?

Dave Kreskowiak

И именно так вы это и делаете. По одному запросу за раз. Честно говоря, разбиение таблицы на несколько таблиц в памяти ничего вам не дает. Можно усложнить любой процесс, которым ты занимаешься на записи.

Опять же, что вы пытаетесь сделать со всеми этими данными в памяти?

Member 11856456

сравнения, для меня имело смысл иметь все необходимое для проведения сравнений, когда совпадение найдено, я мог бы обновить его, если бы была доступна новая информация.

Dave Kreskowiak

Это должно быть сделано в самой базе данных, а не в клиентском коде.

У вас есть несколько проблем, пытаясь сделать это память. Во-первых, требования к хранению. Выполнение этого в нескольких таблицах данных просто усложняет ситуацию.

Вторая скорость. После загрузки вы теряете всю индексацию, которую нужно было бы перестроить, чтобы ускорить процесс в зависимости от того, что вы подразумеваете под "сравнениями".

Если все сделано правильно и база данных построена и проиндексирована правильно, движок базы данных будет бить мочу из всего, что вы можете сделать на стороне клиента.

Member 11856456

есть ли хорошая статья, где я могу увидеть, как это делается? Я погуглил один запрос на несколько запросов в vb.net, или sql-запрос в пакеты в vb.net на этот счет не так уж много документации.

Dave Kreskowiak

Нет. Никто не делает этого по очень веским причинам.

Ты ищешь в Гугле не те вещи. Это не более чем проблема подкачки. Получение блока записей из любого идентификатора и возврат следующего X-го числа записей.

ВЫБИРАТЬ список столбцов
ОТ стол
ЗАКАЗАТЬ ПО колонка
СМЕЩЕНИЕ (@SkipRows) СТРОК ПРИНЕСТИ СЛЕДУЮЩИЙ (@TakeRows) ТОЛЬКО СТРОКИ

Имейте в виду, что то, что вы пытаетесь сделать,-это тупик. Это плохое решение, которое будет работать плохо и не будет хорошо масштабироваться с увеличением количества записей.

Member 11856456

Я ценю это. Спасибо!