Member 11856456 Ответов: 1

Как сравнить данные со всей базой данных SQL?


Первоначально я сделал заявление сравнения, которое хорошо работает. Он полностью присоединяется к моим таблицам на основе их идентификаторов таблиц. потом импорт листа Excel в своей таблице, а затем сравнить оба. Однако я еще не импортировал все свои данные. При проведении исследований я обнаружил, что если я заполняю таблицу или таблицы в наборе данных, то каждая таблица может состоять только из 16 777 216 строк. Однако проблема в том, что моя база данных предназначена для генеалогии, а SSDI (индекс смертности социального страхования) составляет более 90 миллионов имен.

Мне нужно иметь возможность полностью объединить все мои таблицы, которые находятся в базе данных, чтобы я мог сделать истинное сравнение при сопоставлении. в основном мне нужно взять внешнюю таблицу, импорт excel, и сравнить ее со всей базой данных. Как я могу сравнить свои данные с сотнями миллионов людей?

temptable.Reset()
               'first make a connection string to your excel file, if you want to search for multiple excel files to pick from.
               Dim excelConnection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + files.FileName + ";Extended Properties=Excel 12.0;")
               Dim excmd As New OleDbCommand("Select * from [Sheet1$]", excelConnection)
               excelConnection.Open()

               Dim sheet1 As String = excelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing).Rows(0)("TABLE_NAME").ToString()
               'Dim dtExcelData As New DataTable()
               'dtExcelData.Reset()
               Dim oda As New OleDbDataAdapter((Convert.ToString("SELECT * FROM [") & sheet1) + "]", excelConnection)
               oda.Fill(temptable)
               excelConnection.Close()

               'dipose
               excelConnection.Dispose()
               oda.Dispose()
               excmd.Dispose()


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

далее я полностью присоединяюсь ко всем своим столам

'connect to
      Dim sqlconn1 As New SqlConnection("SQLCON")
      Dim sqladaptor = New SqlDataAdapter

      sqlconn1.Open()
      sqladaptor.SelectCommand = New SqlCommand("Select Profile.Individual_ID, First_name, Middle_name, Last_name, Sex, Race, Place_of_birth, County_of_birth, State_of_birth, Date_of_birth, death.Death_ID, Place_of_death, State_of_death, County_of_death, Date_of_death, Cause_of_death, Cemetery_reference.Cemetery_ID, Cemetery_name, Cemetery_state, Cemetery_county, Cemetery_address, Cemetery_Section, Cemetery_Row, Cemetery_Lot, Grave, Burial_date from Profile full join Death On profile.Individual_ID = death.individual_ID full join Burial On Profile.Individual_ID = Burial.Individual_ID full join Cemetery_reference On Burial.Cemetery_ID = Cemetery_reference.Cemetery_ID ORDER BY Last_name ASC, First_name ASC, Date_of_birth ASC", sqlconn1)
      sqladaptor.SelectCommand.CommandTimeout = False
      sqladaptor.SelectCommand.ExecuteNonQuery()
      sqladaptor.Fill(dt)
      sqlconn1.Close()
      sqlconn1.Dispose()
      sqladaptor.Dispose()



затем я переставляю свой взгляд на временную таблицу

Dim view As New DataView(temptable)
       view.Sort = "Last_name ASC, First_name ASC, Date_of_birth ASC"
       Dim temptab As DataTable = view.ToTable
       temptable.Clear()
       temptable = temptab



затем я делаю свои сравнения ряд за рядом

For I = 0 to temptable.rows.count
    For i2 = 0 to dt.rows.count
       'match code
    next
next


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

пока единственными константами являются Дата рождения и дата смерти. вы можете быть мертвым только один раз и быть живым только один раз.

First_name	Middle_name	Last_name	Gender	Date_of_death	Date_of_birth	Place_of_birth
WILLIAM	THAMES	HAMMES	M	1/1/1957	1/1/1900	New York
JAMES	W	ODONNELL	M	1/2/1957	1/2/1900	New York



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

надеюсь, эта дополнительная информация поможет вам.

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

На данный момент я сделал внутреннее соединение всех таблиц базы данных, а затем сравнил их с вставленной bulksql временной таблицей excel. Я использовал sqldataadapter.метод заполнения как для таблиц базы данных, так и для внешних данных. Мне просто нужна помощь в правильном направлении, которая показала бы лучший метод достижения того, что я ищу.

Garth J Lancaster

Я думаю, что вам следует изменить (использовать "улучшить вопрос") свой вопрос и дать еще несколько подробностей - например, "какой" сервер БД вы используете, MySql, SQL Server и т. д., Возможно, "сокращенные" схемы и т. д. "Нам здесь" очень трудно дать вам ответ, основанный на том, что у вас есть до сих пор.

Я мог бы сказать "индексирование" /секционирование и/или создание представлений над вашими данными как очень общий метод, но, вероятно, неправильный подход, потому что в том, что вы предоставили, недостаточно информации для уточнения ответа

Maciej Los

Какая база данных?

Maciej Los

Эта строка (подчеркнутая часть) очень странная:

Dim oda As New OleDbDataAdapter((Convert.ToString("SELECT * FROM [") & sheet1) + "]", excelConnection)

Вам не нужно преобразовывать строку в строку, потому что это уже строка!

Какие данные хранятся в файле Excel?

1 Ответов

Рейтинг:
1

CHill60

Поскольку вы упомянули как "bulksql", так и "sqldataadapter", я надеюсь, что можно с уверенностью предположить, что вы используете базу данных SQL Server.

Если это так, то нет жесткого и быстрого правила для размера таблицы, оно будет зависеть от многих факторов - см. Спецификации максимальной емкости для SQL Server - SQL Server | Microsoft Docs[^]

Единственное место, где я видел число, которое вы цитируете, относится к объектам MongoDb BSON.

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

- Вы имеете в виду несколько таблиц в своем вопросе - если вы создаете таблицы, чтобы преодолеть воспринимаемое ограничение размера, то это неправильный дизайн.

- Загружайте данные в базу данных пакетами, если это проще - я бы использовал bulksql для справочных данных, так как это одноразовое упражнение. Используйте sqldataadapter.заполните данные Excel или bulksql снова.

- При запросе базы данных позвольте SQL-серверу взять нагрузку на себя - результаты, к которым вы возвращаетесь VB.net должно быть просто небольшое подмножество фактических данных.

- Подумайте о написании хранимых процедур для обработки процесса сопоставления.

Кроме того, здесь просто недостаточно информации, чтобы мы могли вам должным образом помочь


Member 11856456

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

CHill60

Согласно комментариям Гарта и Мацея ...
- Подтвердите, что вы используете базу данных SQL Server (или сообщите, что вы используете).
- Как выглядят таблицы, к которым вы пытаетесь присоединиться - просто включите соответствующие столбцы и любые индексы, которые вы настроили
- Как выглядит таблица "temp"
- Поделитесь кодом, который у вас есть для "join"
- Возможно, некоторые примеры данных (не слишком много) и ожидаемые результаты помогут нам понять, что вы ожидаете увидеть

Member 11856456

Я обновил информацию, включая разделы, о которых спрашивали. Надеюсь, это даст некоторое лучшее разъяснение.