powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с большими объёмами данных и SQL
25 сообщений из 47, страница 1 из 2
Помогите с большими объёмами данных и SQL
    #37660247
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте !!!
Есть база данных SQL с таблицей с 30-ю колонками(с1, с2, с3…) и со значениями от 0-999 и с кол-вом строк (суммарно во всех таблицах) около 7 000 000 .
Нужно создать выборку по количеству совпадений(скажем минимум в 20-ти колонках) с эталоном, а результат вывести в Excel.
Пробовал загрузить в массив у тупо сравнить.
Процесс сравнения с 1 эталоном занимает 14 минут, следовательно, 1000 запросов никак не сделать.
Слышал, что можно как-то через SQL-запрос ускорить процесс .
Или если есть какой-то другой выход?????
ПОМОГИТЕ !!!!!!
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37660250
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумеется, SQL-запросом будет сделать на порядки быстрее. Только
а) нужно указать СУБД
б) описать структуру данных (а то сначала "база данных SQL с таблиц ей , потом "суммарно во всех таблиц ах "), что такое эталон (то ли таблица, то ли запись в таблице), описать, как там с индексами и т.п.
в) ну и сделать это на соответствующем вашей СУБД форуме
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37660256
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

База данных MySQL
использую для подключения MySQL ODBC 5.1 Driver
Имеются таблицы 14 шт. с именами table1, table2....
В каждом по 500 000 строк и 30 колонок с именами Id, С1, С2.... Descr
Индекс колонка Id.
И есть колонка с описанием Descr
Я думаю что кто-то уже пробовал работать и для удобства разбил одну таблицу на 14 относительно мелких
Эталон это сравниваемая строчка из CSV файла (с 28-ю значениями) в котором в разные периоды от 1 до 1000 строк

как итог нужно получить результаты с 2 колонок (ID И Descr) в таблице Excel

Это все что я знаю.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37660270
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ID во всех 14 таблицах разные...
Да еще развернуть C1, C2,.. Cx в одно поле...
Получим одну таблицу,.. ну, 20 млн. записей, и что?
По ней и будем делать выборку...

Вот только проблема...
- если можете управлять сервером БД - то маленькая...
- если качать все это на клиента, а потом делать - можно сразу повеситься...
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37660271
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM,

В принципе база лежит на отдельном сервере и
с админом хорошие отношения.
Думаю с серваком проблем не будет.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37660373
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ar-markдля удобства разбил одну таблицу на 14 относительно мелкихчтоб вы понимали - это не для удобства, а как раз для осложнения себе жизни.

ar-markЭталон это сравниваемая строчка из CSV файла (с 28-ю значениями) в котором в разные периоды от 1 до 1000 строкэта фраза непонятна, что же именно лежит в эталоне?

Давайте-ка пример (можно не разворачивать все 28 значений, давайте ограничимся 8-ю) как эталонной строчки, так и таблицы, а также требуемого результата.
Насколько я понимаю, таблицы все типовые, так что рассмотрение и создание ограничим одной таблицей, потом сделаете по аналогии.
для приведенияпримеров таблицлогично использоватьтэгCSV
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37660483
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Ок Вечером выложу
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37660689
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ar-markПробовал загрузить в массив у тупо сравнить.
...................
Эталон это сравниваемая строчка из CSV файла

я полагаю, что хорошим решением может быть заливка CSV-файла в таблицу БД и последующая обработка SQL-запросами....
ar-markкак-то через SQL-запрос ускорить процесс
Многие участники форума SQL.ru успешно применяют SQL-запросы для решения самых разнообразных задач... )))) - чего и Вам желаем)))) "Как много нам открытий чудных..." - в общем - учить его, SQL, не повредит)))

С уважением......
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37661318
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выложил файлы
1. MySQL база, подрезал до 1 таблицы , 10-ти колонок , 500 000 строк (Id, c1, c2, c3, c4, c5, c6, c7, c8, descr)
2. CSV файл с эталонами также 10 колонок, только в 10-ой колонке не описание а кол-во мин. совпадений для данной строки (тут в разные дни, разное кол-во строк, я оставил 5 для теста).
3. сам XLSM Файл (переделал для обработки 8-и колонок).

Stat.rar

в таком виде все работает нормально, но с полной базой в 28 колонок начинаются тормозы.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37661438
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично я это все смотреть не буду, надо заморачиваться с MySQL, которого у меня щас нет под рукой, ковырять алгоритм и т.п.
Либо ждем, кто заморочится
Либо выкладывайте просто пример таблицы (4-5 строк), пример строки-эталона (1 строка, если я правильно понял) и необходимый результат
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37662027
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Файл называемый эталонным который меняется каждый день
кол-во колонок совпадает с кол-вом колонок в базе, только меняются значения и кол-во строк
последняя колонка содержит минимальное кол-во совпадений для данной строки
NC1C2C3C4C5C6C7C8min13012453592955898123098279883327312330485691746321143007167934432532671429129401

База
Задача сравнить каждую строчку базы со всеми строками в CSV файле, и если кол-во совпадений больше или ровно МИНИМАЛЬНОГО значения всех строчек, то записать в EXEL(индекс , описание, максимальное кол-во совпадений)
idc1c2c3c4c5c6c7c8descr130129421417782ПП-2-20-90127536717482319ПП-5-16-5533216575466588187ПП-1-92-3414789786437394885ПП-2-60-62553233303911971169ПП-6-57-23263136206898835318ПП-8-93-313

Конечний результат
ИндексОписаниеМаксимум совпадений22117ПП-3-80-773250277ПП-3-80-773255973ПП-3-80-129277157ПП-3-80-772295141ПП-3-79-1242116133ПП-3-80-1292133733ПП-3-80-7732190629ПП-3-80-1262197285ПП-3-80-1282

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
Sub get_stat_comp()
Dim y As Long
Dim minim As Long
Dim maxs As Long
Dim h As Long
Dim jj As Long
Dim jk As Long

With ThisWorkbook.Sheets("Статистика").Range("A2:C1000")
.Cells.ClearContents
End With

arr = Array()
filename$ = ThisWorkbook.Path & "\" & "etalon.csv"
arr = csv2arr(filename$)

If Not IsArray(arr) Then MsgBox "!!!", vbCritical, "Ошибка": Exit Sub

Set sqlcon = CreateObject("ADODB.Connection")
Set sqlrs = CreateObject("ADODB.Recordset")
Set sqltxt = CreateObject("ADODB.Command")
   
sqlcon.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=localhost; DATABASE=stat_db00A; UID=root; PWD=; OPTION=3;"
sqlcon.Open
    
sqltxt.ActiveConnection = sqlcon
sqltxt.CommandType = 1
sqltxt.CommandText = "select * from table1"
    
sqlrs.Open sqltxt
sqlrs.MoveFirst
    
y = 2
Do Until sqlrs.EOF

maxs = 0
For i = 2 To UBound(arr, 1)

minim = Int(arr(i, UBound(arr, 2)))
h = 0
    For x = 2 To UBound(arr, 2) - 1
    jj = Int(sqlrs.Fields(x - 1))
    jk = Int(arr(i, x))
    If jk = jj Then h = h + 1
    Next x
If h < minim Then GoTo a1
If h > maxs Then maxs = h
Next i

ThisWorkbook.Sheets("Статистика").Cells(y, 1) = sqlrs.Fields(0)
ThisWorkbook.Sheets("Статистика").Cells(y, 2) = sqlrs.Fields(9)
ThisWorkbook.Sheets("Статистика").Cells(y, 3) = maxs
If y > 1000 Then MsgBox "Слишком много совпадений !!!", vbCritical, "Ошибка": Exit Sub
y = y + 1
a1:
DoEvents
sqlrs.MoveNext
Loop
    
   sqlcon.Close
   MsgBox "Найдено " & y - 1 & " строк."
End Sub


Function csv2arr(Optional ByVal filename$ = "", _
                        Optional ByVal ColumnsSeparator$ = ";", _
                        Optional ByVal RowsSeparator$ = vbNewLine) As Variant

On Error Resume Next
Set fso = CreateObject("scripting.filesystemobject")
   Set ts = fso.OpenTextFile(filename$, 1, True): txt$ = ts.ReadAll: ts.Close
    Set ts = Nothing: Set fso = Nothing

    txt = Trim(txt): Err.Clear
   If txt Like "*" & RowsSeparator$ Then txt = Left(txt, Len(txt) - Len(RowsSeparator$))

    tmpArr1 = Split(txt, RowsSeparator$): RowsCount = UBound(tmpArr1) + 1
    ColumnsCount = UBound(Split(tmpArr1(0), ColumnsSeparator$)) + 1

    If Err.Number > 0 Then MsgBox "Ошибка", vbCritical: End
    ReDim arr(1 To RowsCount, 1 To ColumnsCount)

    For i = LBound(tmpArr1) To UBound(tmpArr1)
        tmpArr2 = Split(Trim(tmpArr1(i)), ColumnsSeparator$)
        For j = 1 To ColumnsCount
            arr(i + 1, j) = tmpArr2(j - 1)
        Next j
    Next i
    csv2arr = arr
End Function
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37662041
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чётче, чётче! Ещё чётче!
ar-markЗадача сравнить каждую строчку базы со всеми строками в CSV файле, и если кол-во совпаденийЧто считается сопадением конкретной строки?
- все столбцы таблицы = все столбцы эталона?
- какой-то из столбцов таблицы = тому же столбцу эталона?
- какой-то из столбцов таблицы = любому столбцу эталона?
ar-markбольше или ровно МИНИМАЛЬНОГО значения всех строчекЧто такое минимальноек значение всех строчек? Минимальное значение любого из столбцов в любой из строк? Где, в эталоне? В таблице?ar-mark то записать в EXEL(индекс , описание, максимальное кол-во совпадений)я ведь просил привести конкретный пример, а у вас результат никак не связан с исходными данными.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37662206
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
Чётче, чётче! Ещё чётче!
Код: sql
1.
2.
3.
4.
-- данные
create table table1(id int primary key, c1 int not null, c2 int not null, ..., c28 int not null, descr varchar(255) not null);
--'эталон'
create table etalon(id int primary key, c1 int not null, c2 int not null, ..., c28 int not null, "min" int not null);


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
-- желаемый результат (в терминах T-SQL, вроде бы)
select t.id "Индекс"
 , t.descr "Описание"
 , max(
        case when t.c1=e.c1 then 1 else 0 end +
        case when t.c2=e.c2 then 1 else 0 end +
        ...
        case when t.c28=e.c28 then 1 else 0
     ) "Максимум совпадений"
from table1 t 
  join etalon e 
  on
    case when t.c1=e.c1 then 1 else 0 end +
    case when t.c2=e.c2 then 1 else 0 end +
    ... +
    case when t.c28=e.c28 then 1 else 0 end >=e."min"
group by t.id, t.descr
having count(*)=(select count(*) from t_etalon);


Проблема: неприемлимое время выполения.
На тестовых данных ( таблица-данные .5M записей, таблица-эталон 5 записей )
-процедура ТС-а "Recordset LOOP+Array LOOP" отрабатывает ~48сек, возврщает 25 записей;
-отпимизированная(?) процедура "SQL query" отрабатывает ~10сек.
Железо Intel(R) Pentium(R) Dual CPU T2370@1.73GHz, DDR2 SDRAM 2GB, Seagate(R) Momentus(R) 5400 ST9250827AS 250GB

Аппроксимируя для реальных данных ( таблица-данные 7M записей, таблица-эталон 1K записей ), получил время выполнения оптимизированной(?) процедуры порядка восьми часов *ой...*. Это без учёта меньшего количества полей в тестовых таблицах.

...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37662351
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Вот СПАСИБО !!!
Это то, что я искал.
После тестов выложу результат.
Еще раз спасибо.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37662376
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ar-markShocker.Pro,

Вот СПАСИБО !!!это не я скукотищаПроблема: неприемлимое время выполения.тут не используются индексы, можно по идее еще покурить...
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37662444
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища,

Спосибо Спосибо Спосибо !!!
Правда пока не запустил, все мучаюсь с СИНТАКСИСОМ.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37662588
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
sqltxt.ActiveConnection = sqlcon
sqltxt.CommandType = 1


sqltxt = "select t.id, t.descr, max( " & _
"case when t.c1=e.c1 then 1 else 0 end + " & _
"case when t.c2=e.c2 then 1 else 0 end + " & _
"case when t.c3=e.c3 then 1 else 0 end + " & _
"case when t.c4=e.c4 then 1 else 0 end + " & _
"case when t.c5=e.c5 then 1 else 0 end + " & _
"case when t.c6=e.c6 then 1 else 0 end + " & _
"case when t.c7=e.c7 then 1 else 0 end + " & _
"case when t.c8=e.c8 then 1 else 0) from table1 t " & _
"join etalon e on " & _
"case when t.c1=e.c1 then 1 else 0 end + " & _
"case when t.c2=e.c2 then 1 else 0 end + " & _
"case when t.c3=e.c3 then 1 else 0 end + " & _
"case when t.c4=e.c4 then 1 else 0 end + " & _
"case when t.c5=e.c5 then 1 else 0 end + " & _
"case when t.c6=e.c6 then 1 else 0 end + " & _
"case when t.c7=e.c7 then 1 else 0 end + " & _
"case when t.c8=e.c8 then 1 else 0 end >=e.min " & _
"group by t.id, t.descr " & _
"having count(*)=(select count(*) from t_etalon);"

sqlrs.Open sqltxt



Что не так?
Ошибка 3709
Невозможно использования подключения для данной операции.
Оно закрыто или не допускается
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37662630
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты тут что-то наворочал странного и ненужного:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Set sqlcon = CreateObject("ADODB.Connection")
Set sqlrs = CreateObject("ADODB.Recordset")
Set sqltxt = CreateObject("ADODB.Command")
   
sqlcon.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=localhost; DATABASE=stat_db00A; UID=root; PWD=; OPTION=3;"
sqlcon.Open
    
sqltxt.ActiveConnection = sqlcon
sqltxt.CommandType = 1
sqltxt.CommandText = "select * from table1"
    
sqlrs.Open sqltxt


вот так:
Код: vbnet
1.
2.
3.
4.
5.
6.
Set sqlcon = CreateObject("ADODB.Connection")
Set sqlrs = CreateObject("ADODB.Recordset")
   
sqlcon.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=localhost; DATABASE=stat_db00A; UID=root; PWD=; OPTION=3;"
sqlcon.Open
sqlrs.Open "select * from table1", sqlcon
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37662777
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мои 5 копеек:
Код: vbnet
1.
2.
3.
4.
5.
6.
    For x = 1 To 8
        ladder = ladder & "case when t.c" & x & "=e.c" & x & " then 1 else 0 end + "
    Next
    sql = "select t.id, t.descr, max(" & Left(ladder, Len(ladder) - 7) & ") from table1 t " & _
        "join etalon e on " & Left(ladder, Len(ladder) - 3) & ">=e.min group by t.id, t.descr " & _
        "having count(*)=(select count(*) from t_etalon);"
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37662858
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

К сожалению ругается так же.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37662882
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ar-markК сожалению ругается так же.ругается потому что для sqltxt не задан активный коннекшн. Решение я уже привел выше
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37662968
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

я подправил и теперь ошибка в запросе
sqltxt = "select t.id, t.descr, max( " & _
"case when t.c1=e.c1 then 1 else 0 end + " & _
"case when t.c2=e.c2 then 1 else 0 end + " & _
"case when t.c3=e.c3 then 1 else 0 end + " & _
"case when t.c4=e.c4 then 1 else 0 end + " & _
"case when t.c5=e.c5 then 1 else 0 end + " & _
"case when t.c6=e.c6 then 1 else 0 end + " & _
"case when t.c7=e.c7 then 1 else 0 end + " & _
"case when t.c8=e.c8 then 1 else 0) from table1 t " & _

мне кажется ошибка из-за того что при расчете мах
etalon еще не присоединен(то есть e.c1 пусто), убираю эту часть и все работает, но без МАХа

"join etalon e on " & _
........

еще from t_etalon надо менять на from etalon
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37663285
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ar-mark,
12092948 предназначалось для Shocker.Pro, исключительно для четкого описания того, что Вы хотите получить. Там запрос с JOIN и GROUP BY отрабатывает ... не оптимально. Вечером выложу другой вариант.

ЗЫ: если можно, выложите одну таблицу со всеми полями и файл-эталон для него (чем больше строк в эталоне, тем лучше). Хочется проверить, насколько больше времени будет тратиться на обработку реальных данных.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37663302
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
тут не используются индексы, можно по идее еще покурить... Покури, уважаемый, покури.
Я не вижу, в где тут можно прикрутить индексы :(
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37663320
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотищаПокури, уважаемый, покури.
Я не вижу, в где тут можно прикрутить индексы :(чё обзываешься?
мне просто некогда выкуривать код ТС и твой код и тем более не хочу на него ориентироваться, чтобы не замутить себе разум чужими алгоритмами, и написать запрос по-своему с нуля.
Однако, автор не хочет уточнять ТЗ, поэтому я пока в паузе.
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с большими объёмами данных и SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]