powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с большими объёмами данных и SQL
22 сообщений из 47, страница 2 из 2
Помогите с большими объёмами данных и 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
22 сообщений из 47, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с большими объёмами данных и SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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