Медленный запрос - оптимизация
Добавлено: 04 июн 2012, 01:04
Существует таблица формата:
Create Table TblValue_1(
f_value float
, i_col smallint
, i_row smallint
)
После заполнения таблицы делаю
Commit Table TblValue_1
Create Index On TblValue_1 (i_col)
Create Index On TblValue_1 (i_row)
Необходимо получить для каждой строки массив SomeArray() as float, состоящий элементов имеющих соседние значения i_col или i_row.
Код следующий:
Set Event Processing Off
for i = 1 to iMaxX
for j =1 to iMaxY
SELECT f_value "fValue" FROM TblValue_1WHERE (i_col >= (i - 1) AND i_col <= (i + 1) AND i_row >= (j- 1) AND i_row <= (j + 1)) INTO _tmp
SELECT Count(*) "iCountElement" FROM _tmp INTO _tmp2
Fetch First From _tmp2
iCountElements = _tmp2.iCountElement ' количество элементов
redim SomeArray(iCountElements)
Close Table _tmp2
Fetch First From _tmp
for i = 1 to iCountElements
SomeArray(i) = _tmp.fValue
Fetch Next From _tmp
next
Close Table _tmp
next
next
Set Event Processing On
При iMaxX = iMaxY = 5 выполнение кода подвисает на приличное время.
Как ускорить алгоритм? что делаю не так? Как проще получить количество строк в запросе?
Имеет ли смысл Set Event Processing Off...Set Event Processing On если к строкам таблицы будут привязаны объекты и таблица TblValue_1 будет показана слоем?
Create Table TblValue_1(
f_value float
, i_col smallint
, i_row smallint
)
После заполнения таблицы делаю
Commit Table TblValue_1
Create Index On TblValue_1 (i_col)
Create Index On TblValue_1 (i_row)
Необходимо получить для каждой строки массив SomeArray() as float, состоящий элементов имеющих соседние значения i_col или i_row.
Код следующий:
Set Event Processing Off
for i = 1 to iMaxX
for j =1 to iMaxY
SELECT f_value "fValue" FROM TblValue_1WHERE (i_col >= (i - 1) AND i_col <= (i + 1) AND i_row >= (j- 1) AND i_row <= (j + 1)) INTO _tmp
SELECT Count(*) "iCountElement" FROM _tmp INTO _tmp2
Fetch First From _tmp2
iCountElements = _tmp2.iCountElement ' количество элементов
redim SomeArray(iCountElements)
Close Table _tmp2
Fetch First From _tmp
for i = 1 to iCountElements
SomeArray(i) = _tmp.fValue
Fetch Next From _tmp
next
Close Table _tmp
next
next
Set Event Processing On
При iMaxX = iMaxY = 5 выполнение кода подвисает на приличное время.
Как ускорить алгоритм? что делаю не так? Как проще получить количество строк в запросе?
Имеет ли смысл Set Event Processing Off...Set Event Processing On если к строкам таблицы будут привязаны объекты и таблица TblValue_1 будет показана слоем?