Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с большими объёмами данных и SQL / 25 сообщений из 47, страница 1 из 2
14.02.2012, 02:02
    #37660247
ar-mark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
Здравствуйте !!!
Есть база данных SQL с таблицей с 30-ю колонками(с1, с2, с3…) и со значениями от 0-999 и с кол-вом строк (суммарно во всех таблицах) около 7 000 000 .
Нужно создать выборку по количеству совпадений(скажем минимум в 20-ти колонках) с эталоном, а результат вывести в Excel.
Пробовал загрузить в массив у тупо сравнить.
Процесс сравнения с 1 эталоном занимает 14 минут, следовательно, 1000 запросов никак не сделать.
Слышал, что можно как-то через SQL-запрос ускорить процесс .
Или если есть какой-то другой выход?????
ПОМОГИТЕ !!!!!!
...
Рейтинг: 0 / 0
14.02.2012, 02:06
    #37660250
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
Разумеется, SQL-запросом будет сделать на порядки быстрее. Только
а) нужно указать СУБД
б) описать структуру данных (а то сначала "база данных SQL с таблиц ей , потом "суммарно во всех таблиц ах "), что такое эталон (то ли таблица, то ли запись в таблице), описать, как там с индексами и т.п.
в) ну и сделать это на соответствующем вашей СУБД форуме
...
Рейтинг: 0 / 0
14.02.2012, 02:32
    #37660256
ar-mark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
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
14.02.2012, 03:41
    #37660270
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
Если ID во всех 14 таблицах разные...
Да еще развернуть C1, C2,.. Cx в одно поле...
Получим одну таблицу,.. ну, 20 млн. записей, и что?
По ней и будем делать выборку...

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

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

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

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

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

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

С уважением......
...
Рейтинг: 0 / 0
14.02.2012, 15:56
    #37661318
ar-mark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
Выложил файлы
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
14.02.2012, 16:52
    #37661438
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
Лично я это все смотреть не буду, надо заморачиваться с MySQL, которого у меня щас нет под рукой, ковырять алгоритм и т.п.
Либо ждем, кто заморочится
Либо выкладывайте просто пример таблицы (4-5 строк), пример строки-эталона (1 строка, если я правильно понял) и необходимый результат
...
Рейтинг: 0 / 0
14.02.2012, 23:35
    #37662027
ar-mark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
Файл называемый эталонным который меняется каждый день
кол-во колонок совпадает с кол-вом колонок в базе, только меняются значения и кол-во строк
последняя колонка содержит минимальное кол-во совпадений для данной строки
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
14.02.2012, 23:49
    #37662041
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
Чётче, чётче! Ещё чётче!
ar-markЗадача сравнить каждую строчку базы со всеми строками в CSV файле, и если кол-во совпаденийЧто считается сопадением конкретной строки?
- все столбцы таблицы = все столбцы эталона?
- какой-то из столбцов таблицы = тому же столбцу эталона?
- какой-то из столбцов таблицы = любому столбцу эталона?
ar-markбольше или ровно МИНИМАЛЬНОГО значения всех строчекЧто такое минимальноек значение всех строчек? Минимальное значение любого из столбцов в любой из строк? Где, в эталоне? В таблице?ar-mark то записать в EXEL(индекс , описание, максимальное кол-во совпадений)я ведь просил привести конкретный пример, а у вас результат никак не связан с исходными данными.
...
Рейтинг: 0 / 0
15.02.2012, 04:37
    #37662206
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
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
15.02.2012, 10:02
    #37662351
ar-mark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
Shocker.Pro,

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

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

Спосибо Спосибо Спосибо !!!
Правда пока не запустил, все мучаюсь с СИНТАКСИСОМ.
...
Рейтинг: 0 / 0
15.02.2012, 11:55
    #37662588
ar-mark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
Код: 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
15.02.2012, 12:09
    #37662630
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
ты тут что-то наворочал странного и ненужного:
Код: 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
15.02.2012, 12:51
    #37662777
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
Мои 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
15.02.2012, 13:23
    #37662858
ar-mark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
Antonariy,

К сожалению ругается так же.
...
Рейтинг: 0 / 0
15.02.2012, 13:31
    #37662882
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
ar-markК сожалению ругается так же.ругается потому что для sqltxt не задан активный коннекшн. Решение я уже привел выше
...
Рейтинг: 0 / 0
15.02.2012, 14:04
    #37662968
ar-mark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
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
15.02.2012, 16:19
    #37663285
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с большими объёмами данных и SQL
ar-mark,
12092948 предназначалось для Shocker.Pro, исключительно для четкого описания того, что Вы хотите получить. Там запрос с JOIN и GROUP BY отрабатывает ... не оптимально. Вечером выложу другой вариант.

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


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