powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с большими объёмами данных и SQL
47 сообщений из 47, показаны все 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
Помогите с большими объёмами данных и SQL
    #37663420
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ar-mark
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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.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




а если так
Код: vbnet
1.
2.
3.
4.
s1=""
s1=s1 & "select t.id, t.descr, e.min from table1 t,etalon e "
s1=s1 & "  where ((t.c1=e.c1)+(t.c2=e.c2)+ (t.c3=e.c3)+ (t.c4=e.c4)+(t.c5=e.c5)"
s1=s1 & " +(t.c6=e.c6)+( t.c7=e.c7)+(t.c8=e.c8))<=-e.min"
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37663438
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пояснение

s1=""
s1=s1 & "select t.id, t.descr, e.min from table1 t,etalon e "
s1=s1 & " where ((t.c1=e.c1)+(t.c2=e.c2)+ (t.c3=e.c3)+ (t.c4=e.c4)+(t.c5=e.c5)"
s1=s1 & " +(t.c6=e.c6)+( t.c7=e.c7)+(t.c8=e.c8))<=-e.min"


если t.c1=e.c1 , получим -1, иначе 0
сумма будет отрицательная
поэтому меняем знак у е.min
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37663444
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыла про INT
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37663786
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА,
а если так

Код: sql
1.
2.
3.
4.
s1=""
s1=s1 & "select t.id, t.descr, e.min from table1 t,etalon e "
s1=s1 & "  where ((t.c1=e.c1)+(t.c2=e.c2)+ (t.c3=e.c3)+ (t.c4=e.c4)+(t.c5=e.c5)"
s1=s1 & " +(t.c6=e.c6)+( t.c7=e.c7)+(t.c8=e.c8))<=-e.min"



У ТС MySQL, там True==1, но сути дела это не меняет. Основная проблема - невозможность(?) использования индексов.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37664156
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ar-mark,
тестовый вариант
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37664234
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
'''''А если так, access вместо сервера --для отладки
'''''для каждой строки эталона---свой динамический запрос
'''''
код
Код: 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.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
Sub get_stat_comp1()
Dim y As Long
Dim minim As Long
Dim maxs As Long
Dim h As Long
Dim jj As Long
Dim jk As Long
Dim arr                ''
Dim filename$, sqlcon, sqlrs, sqltxt
Dim i, x, s1, j
''''''''''''''''''''
With ThisWorkbook.Sheets("Статистика").Range("a:m")
.Cells.ClearContents
End With
arr = Array()
filename$ = ThisWorkbook.Path & "\" & "etalon.csv"
arr = csv2arr2(filename$, ",")
''''''''''''''''''''''''''''''''''''''''''''
Dim j1, j1a, j2, j2a
y = 0
j1 = UBound(arr, 1)
j2 = UBound(arr, 2)
j1a = 0
Do While j1a < j1
j1a = j1a + 1
j2a = 0
Debug.Print
Debug.Print j1a;
y = y + 1
Do While j2a < j2
j2a = j2a + 1
ThisWorkbook.Sheets("Статистика").Cells(j1a + 1, j2a) = arr(j1a, j2a)
arr(j1a, j2a) = Val(arr(j1a, j2a))
Loop
Loop
y = y + 2
'''''''''''''''''''''''''''''''''''
If Not IsArray(arr) Then
MsgBox "!!!", vbCritical, "Ошибка"
Exit Sub
End If
''''''''''''''''''''
Set sqlcon = CreateObject("ADODB.Connection")
Set sqlrs = CreateObject("ADODB.Recordset")
Set sqltxt = CreateObject("ADODB.Command")

'''''''''''''''
sqlcon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0"
sqlcon.Open "d:\abat\record.mdb"
''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
''''''''''''''''''''''''''''''''''''''''''
For i = 2 To j1
s1 = ""
s1 = s1 & "select * from table1 "
s1 = s1 & "  where (0"
''''''''''''''''''''''''''''
j2a = 1
Do While j2a < j2 - 1
j2a = j2a + 1
s1 = s1 & " +(c" & Trim(j2a - 1) & "=" & arr(i, j2a) & ")"
'Debug.Print s1
Loop
''''''''''''''''''''''
s1 = s1 & ")<=" & -arr(i, j2)
Debug.Print
Debug.Print s1;
sqltxt.CommandText = s1
sqlrs.Open sqltxt
''''''''''''''''''''''''''
'Debug.Print sqlrs.fields.Count
j = 0
Do While j < j2
j = j + 1
'Debug.Print j, sqlrs.fields(j - 1).Name
ThisWorkbook.Sheets("Статистика").Rows(1).Columns(j) = sqlrs.fields(j - 1).Name
Loop
''''''''''''''''''''''''''''
Do While sqlrs.EOF = False
'Debug.Print
'Debug.Print "mm"
j = 1
y = y + 1
h = 0
Do While j < j2 - 1
j = j + 1
Debug.Print sqlrs.fields(j - 1).Value, arr(i, j)
If Int(sqlrs.fields(j - 1).Value) = arr(i, j) Then
h = h + 1
ThisWorkbook.Sheets("Статистика").Rows(y).Columns(j) = -sqlrs.fields(j - 1)

Else
ThisWorkbook.Sheets("Статистика").Rows(y).Columns(j) = sqlrs.fields(j - 1)


End If
Loop
ThisWorkbook.Sheets("Статистика").Rows(y).Columns(j2) = sqlrs.fields(j2 - 1)
ThisWorkbook.Sheets("Статистика").Rows(y).Columns(j2 + 1) = i - 1
ThisWorkbook.Sheets("Статистика").Rows(y).Columns(j2 + 2) = arr(i, j2)
ThisWorkbook.Sheets("Статистика").Rows(y).Columns(j2 + 3) = h


ThisWorkbook.Sheets("Статистика").Rows(1).Columns(j2 + 1) = "стр"
ThisWorkbook.Sheets("Статистика").Rows(1).Columns(j2 + 2) = "миним"
ThisWorkbook.Sheets("Статистика").Rows(1).Columns(j2 + 3) = "колич"
ThisWorkbook.Sheets("Статистика").Rows(2).Columns(j2 + 3) = "отрицательные -совпадают"


'Debug.Print j
DoEvents
sqlrs.MoveNext
Loop
sqlrs.Close
'sqlcon.Close

Next i
'MsgBox "Найдено " & y - 1 & " строк."
End Sub
Function csv2arr2(Optional ByVal filename$ = "", _
      Optional ByVal ColumnsSeparator$ = ";", _
      Optional ByVal RowsSeparator$ = vbNewLine) As Variant

Dim fso  ''
Dim ts
Dim txt, i, j, tmpArr1, tmpArr2, RowsCount, ColumnsCount
''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$))
End If

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

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

For i = LBound(tmpArr1) To UBound(tmpArr1)
'i = i + 1
tmpArr2 = Split(Trim(tmpArr1(i)), ColumnsSeparator$)
For j = 1 To ColumnsCount
arr(i + 1, j) = tmpArr2(j - 1)
Next j
Next i
csv2arr2 = arr
End Function

Модератор: ПЕНСИОНЕРКА, все же такие простыни - под спойлер
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37664283
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА,
впечатляет ... %)
А индексы всё-равно не используются.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37664319
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотища,

а зачем они, если нет стыковки и поиска
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37664333
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА,
без них тоскливо: треть суток ждать данных от запроса.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37664421
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотищаar-mark,
тестовый вариант
Просто нет слов !!!!!!!!!!
500 000 строк, 8 колонок и 4 строки в эталоне не успел моргнуть 7,8сек
500 000 строк, 8 колонок и 1000 строк в эталоне 1706,14сек
Проверить с настоящей базой пока не могу !!!!
Но тут и проверять нечего, ждать 5-6 часов лучше чем месяц.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37664425
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА,

Отличный вариант!!!
Проблему со скоростью не решает, зато больше данных выводит.
Спасибо !!!!
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37664437
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, после того, как стало более-менее понятно, чего вы добиваетесь (сверить эталон с базой по некоему ограничению) - стало ясно, что запрос должен строиться со стороны эталона к базе. Изначально и так это было ясно, поскольку "условие" находится в эталоне - просто нужно было подробно понять принцип. Да и отсутствие индексов сильно мешает...

Кстати, ещё (и сильно) ускорить запросы можно, если существует какая-нибудь корреляция между эталоном и записями в базе. То есть, эталон строится на основании информации из этой базы по каким-либо принципам... Вам же незря тонко намекали на ТЗ.

Да и насчет 5-6 часов на реальных данных - вы несколько торопитесь. Если увеличение количества записей (в базе) приведет к увеличению времени линейно, - то увеличение количества столбцов в условии - как бы не вылилось в экспоненту... так что не месяц, конечно, - но несколько суток может и получиться
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37664444
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ar-mark,

можно получить итоги
-по каждому эталону-позиции(строка эталон и строки таблицы)
-или по позиции-эталону(строка таблицы и под какие эталоны попадает)
-или по позиции-эталонам(сводная)

намного информативнее, чем позиция,мах

убрать лишнее всегда можно, я для отладки добавила много "лишнего"(не по заданию)
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37664445
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM,

забыла
-можно дозаписать строки ко вчерашним строкам или добавить новый эталон
- и выдавать, как изменились данные за период

иначе зачем эта груда цифр
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37664453
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ar-mark,

конечно

я не знаю(даже не догадываюсь) вашей задачи, но мне более интересен следующий вариант
-в первую строку листа(не csv) набить, например столбцы с1-с9-с17-с25-с30
-и в этот же лист получить результат
-при необходимости скорректировать первую строку
-и повторить поиск

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

многое зависит от того
-кто готовит эталон
-КОМУ нужны итоги(как и чем их просматривать)
-есть ли вариантность
- ..........т.п.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37665295
ar-mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА,

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

Только сегодня, наконец-то удалось уточнить некоторые моменты.
Оказалось база и есть ЭТАЛОНЫ, а сравниваемый файл CSV, это результаты тестов оборудования (по сути это ничего не меняет).
В CSV каждая строчка это результат 28-и тестов одной модели.
Кол-во строк в СSV это кол-во протестированных моделей из одной партии.
Нужно найти в базе строчки с максимальным кол-во совпадений с группой тестов(СSV).

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

Еще раз СПАСИБО, что откликнулись.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37665783
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, о чем и говорили...
Если CSV всегда разный (тестируется всегда разное оборудование), то корреляции нет. Накапливать CSV смысла не имеет...
И статистика ищется для всей партии целиком... Может, статметоды какие применить?
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37666090
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю эталонную таблицу экспортировать на SQL-сервер (вряд ли она более 100Мб размером) и работать с ним...
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37666174
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM,
Здесь 12099545 так и есть. Импорт 'эталона' из csv в базу,
запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
-- table1 данные
-- t_etalon 'эталон', импортированный из csv
select t.id, t.descr
  ,(select max(
(e2.c1 = t.c1)+
(e2.c2 = t.c2)+
(e2.c3 = t.c3)+
(e2.c4 = t.c4)+
(e2.c5 = t.c5)+
(e2.c6 = t.c6)+
(e2.c7 = t.c7)+
(e2.c8 = t.c8)) from t_etalon e2) max_coinc
from table1 t
where 5=(
select count(e.id) from t_etalon e
where e.min_coinc<=
(e.c1 = t.c1)+
(e.c2 = t.c2)+
(e.c3 = t.c3)+
(e.c4 = t.c4)+
(e.c5 = t.c5)+
(e.c6 = t.c6)+
(e.c7 = t.c7)+
(e.c8 = t.c8));

, экспорт результата в csv. Всё равно доолго получается.
Вся надёжа на волшебные 'статметоды'.
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37666238
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, я не etalon.csv предлагаю импортировать (хотя и его придётся...), а общую table1...table14 собирать и експортировать из MySql в MSSQL (Express, например, прямо у ТС на компе).
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37666270
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM,
есть веские основания считатать, что mssql шустрее справится с такой задачей?
ЗЫ: насчет алгоритма поиска никаких позитивных мыслей не приходило?
...
Рейтинг: 0 / 0
Помогите с большими объёмами данных и SQL
    #37666290
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритм - думаю пока. Уже до динамического программирования дошел. Но там и использование СУБД не понадобится, хотя можно и подумать...
А насчет MSSQL (или даже Акцесса) - так тут разговор за индексы был. Да и поэкспериментировать на SQL2008 R2 можно поболе (ну, не пользовался я MySQL на уровне разработчика).
...
Рейтинг: 0 / 0
47 сообщений из 47, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с большими объёмами данных и SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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