powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Медленная обработка VIEW Informix-ом
9 сообщений из 9, страница 1 из 1
Медленная обработка VIEW Informix-ом
    #33073172
alander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Начну издалека:
У меня есть таблица, на которую создан VIEW.
Выглядит примерно так
CREATE TABLE Table (
id INT NOT NULL PRIMARY KEY,
className VARCHAR(20),
ref1 INT REFERENCES ...
ref2 INT REFERENCES ...
...
);

CREATE VIEW View
AS SELECT * FROM Table
WHERE className = 'Foo';

Проблемы следующая: запрос на таблицу Table (к примеру SELECT * FROM Table WHERE ref1 = ... AND ref2 = ...) работает быстро, а такой же запрос к View работает гораздо медленнее...
Индекс на колонку className создан, но от тоже особо не помогает.
запрос вроде SELECT * FROM Table WHERE className = 'Foo' AND ref1 = ... AND ref2 = ... также работает быстрее, чем SELECT * FROM View WHERE ref1 = ... AND ref2 = ...

В чем же дело? Как ускорить работу Informix-а со вьюшками?
...
Рейтинг: 0 / 0
Медленная обработка VIEW Informix-ом
    #33073183
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А при запросе через вьюшку индексы используются ?
И какой размер выборки ? Очень большой ?
Есть ли нормальные темповые пространства на сервере ?
...
Рейтинг: 0 / 0
Медленная обработка VIEW Informix-ом
    #33073420
Vybegallo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Покажите execution plan для обеих вариантов.

(set explain on;
select ...)
...
Рейтинг: 0 / 0
Медленная обработка VIEW Informix-ом
    #33074954
alander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--А при запросе через вьюшку индексы используются ?
В каком смысле?

--И какой размер выборки ? Очень большой ?
Количество записей в таблице около 400000, сама выборка может быть пустой

--Есть ли нормальные темповые пространства на сервере ?
Есть

--Покажите execution plan для обеих вариантов
А как его можно посмотреть?
...
Рейтинг: 0 / 0
Медленная обработка VIEW Informix-ом
    #33075009
alander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот что получилось:
QUERY:
------
SELECT count(*) FROM PersonExamList
WHERE PersonExamList.studentID
IN (SELECT id FROM Student WHERE branchID = -1 AND facultyID = 3
AND begin_year = 1998 AND specialityID=11)
AND PersonExamList.parentid=0

Estimated Cost: 321
Estimated # of Rows Returned: 1
Maximum Threads: 1

1) and.graderecord: INDEX PATH

Filters: ((and.graderecord.classname = 'PersonExamList' AND and.graderec
ord.parentid = 0 ) AND and.graderecord.examsheetid IS NULL )

(1) Index Keys: studentid (Parallel, fragments: ALL)
Lower Index Filter: and.graderecord.studentid = ANY <subquery>

Subquery:
---------
Estimated Cost: 221
Estimated # of Rows Returned: 8
Maximum Threads: 1

1) and.student: INDEX PATH

Filters: and.student.specialityid = 11

(1) Index Keys: branchid facultyid state studyformid begin_year (Key-F
irst) (Parallel, fragments: ALL)
Lower Index Filter: (and.student.branchid = -1 AND and.student.facul
tyid = 3 )
Key-First Filters: (and.student.begin_year = 1998 )



Соответственно хотелось бы:
Чтобы сначала исполнялось
(1) Index Keys: studentid (Parallel, fragments: ALL)
Lower Index Filter: and.graderecord.studentid = ANY <subquery>

а затем
Filters: ((and.graderecord.classname = 'PersonExamList' AND and.graderec
ord.parentid = 0 ) AND and.graderecord.examsheetid IS NULL )

Можно ли так сделать?
...
Рейтинг: 0 / 0
Медленная обработка VIEW Informix-ом
    #33075917
vybegallo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно, читайте "optimizer directives" в доках. Но тема не раскрыта - почему отдельный select выполняется быстрее, чем теоретически идентичный с использованием view. Народ интересуется сравнить планы выполнения в обеих случаях.
...
Рейтинг: 0 / 0
Медленная обработка VIEW Informix-ом
    #33076505
alander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот планы выполнения обоих запросов.. Первый для VIEW, второй для TABLE..
Кстати план для VIEW отличается от ранее приведенного, различие видимо возникло из-за того, что первый выполнялся на однопроцессорной машине, а второй не дву.. Структура баз данных одна и таже

QUERY:
------
SELECT count(*) FROM PersonExamList
WHERE PersonExamList.studentID
IN (SELECT id FROM Student WHERE branchID = -1 AND facultyID = 3
AND begin_year = 1998 AND specialityID=11)
AND PersonExamList.parentid=0

Estimated Cost: 16
Estimated # of Rows Returned: 1
Maximum Threads: 1

1) and.graderecord: INDEX PATH

Filters: ((and.graderecord.studentid = ANY <subquery> AND and.graderecord.classname
= 'PersonExamList' ) AND and.graderecord.parentid = 0 )

(1) Index Keys: examsheetid (Parallel, fragments: ALL)
Lower Index Filter: and.graderecord.examsheetid IS NULL

Subquery:
---------
Estimated Cost: 2
Estimated # of Rows Returned: 1
Maximum Threads: 1

1) and.student: INDEX PATH

(1) Index Keys: facultyid branchid begin_year specialityid (Parallel, fragments: A
LL)
Lower Index Filter: (((and.student.begin_year = 1998 AND and.student.branchid =
-1 ) AND and.student.specialityid = 11 ) AND and.student.facultyid = 3 )



QUERY:
------
SELECT count(*) FROM GradeRecord
WHERE GradeRecord.studentID
IN (SELECT id FROM Student WHERE branchID = -1 AND facultyID = 3
AND begin_year = 1998 AND specialityID=11)
AND GradeRecord.parentid=0

Estimated Cost: 32
Estimated # of Rows Returned: 1
Maximum Threads: 1

1) and.graderecord: INDEX PATH

Filters: and.graderecord.parentid = 0

(1) Index Keys: studentid (Parallel, fragments: ALL)
Lower Index Filter: and.graderecord.studentid = ANY <subquery>

Subquery:
---------
Estimated Cost: 2
Estimated # of Rows Returned: 1
Maximum Threads: 1

1) and.student: INDEX PATH

(1) Index Keys: facultyid branchid begin_year specialityid (Parallel, fragments: A
LL)
Lower Index Filter: (((and.student.begin_year = 1998 AND and.student.branchid =
-1 ) AND and.student.specialityid = 11 ) AND and.student.facultyid = 3 )
...
Рейтинг: 0 / 0
Медленная обработка VIEW Informix-ом
    #33077958
Valentyn Pidburtnyi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alanderВот планы выполнения обоих запросов.. Первый для VIEW, второй для TABLE..


Я чего-то не понял. Запросы разные - соотв-но и планы разные.
Чтобы запрос для TABLE был такой же как для VIEW, в нем нужно также указать ограничение, которое есть во вьюшке PersonExamList по таблице GradeRecord.
И для полного счастья еще текст вьюхи, чтобы увидеть енто самое ограничение вживую.

ЗЫ "план для VIEW отличается от ранее приведенного" видимо по причине различности данных на двух базах. В "ранее приведенном" случае большее кол-во строк удовлетворяет условиям выборки. В таких условиях и план будет другим (не обязательно, конечно), даже если БД идентичны по схеме.
...
Рейтинг: 0 / 0
Медленная обработка VIEW Informix-ом
    #33078868
vybegallo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ув. alander !
Когда вы сравниваете 2 запроса, то сравнивайте яблоки с яблоками - приводите планы ОДНОГО И ТОГО ЖЕ запроса (с использованием и без использования view) НА ОДНИХ И ТЕХ ЖЕ ДАННЫХ.
Потому что план запроса в информикс зависит не только от структуры базы, но и от самих данных. Про UPDATE STATISTCS слыхали ?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Медленная обработка VIEW Informix-ом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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