powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Проблема поиска данных в большой таблице
47 сообщений из 47, показаны все 2 страниц
Проблема поиска данных в большой таблице
    #37259175
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день господа, мой первый пост. Есть у меня проблема с которой не знаю куда и к кому обратиться.
Имеется у меня табличка на 70 миллионов записей и с каждым рабочим днем увеличивающаяся в среднем на еще миллион.
Ниже скрипт таблицы с парой индексов.

CREATE TABLE "dimam".rtorders(
id SERIAL NOT NULL,
pageid INTEGER default 1 NOT NULL,
s_marketplaceid INTEGER NOT NULL,
s_marketplaceid2 INTEGER default 0 NOT NULL,
marketplaceid INTEGER default 1000 NOT NULL,
s_actstatusid INTEGER default 1 NOT NULL,
s_vstatusid INTEGER default 1 NOT NULL,
s_rtsourceid INTEGER default 1 NOT NULL,
s_rttableid INTEGER default 1 NOT NULL,
rtsourcerecid INTEGER,
s_ordercondid INTEGER default 2 NOT NULL,
odealtype INTEGER default 0 NOT NULL,
ordernumber INTEGER,
ordernumtxt VARCHAR(40),
marketnumber DECIMAL(30,0) default 0,
clientcode VARCHAR(8),
portfolioid INTEGER default 1 NOT NULL,
portfoliocode VARCHAR(20),
tradecode VARCHAR(20),
docnumtxt VARCHAR(40),
docdate DATE,
assetcode VARCHAR(60),
assetname VARCHAR(25),
assettype VARCHAR(30),
isrepo INTEGER default 0,
orderdate DATE NOT NULL,
ordertime DATETIME YEAR to SECOND NOT NULL,
orderterm DATE NOT NULL,
cliringdate DATE NOT NULL,
nunits DECIMAL(30,8) default 0.00000000 NOT NULL,
nprice DECIMAL(30,8) default 0.00000000 NOT NULL,
ntotalsum DECIMAL(30,8) default 0.00000000 NOT NULL,
strikeprice DECIMAL(30,8) default 0.00000000,
reporate DECIMAL(30,8) default 0.00000000,
refundrate DECIMAL(30,8) default 0.00000000,
repoperiod INTEGER default 0,
currencytypeid INTEGER default 1,
orderkind INTEGER default 1 NOT NULL,
islong INTEGER default 0 NOT NULL,
signkind INTEGER default 0 NOT NULL,
signkindhand INTEGER default 0 NOT NULL,
signkindonline INTEGER default 0 NOT NULL,
stopkind INTEGER default 0 NOT NULL,
stoptransid INTEGER default 0 NOT NULL,
cldocsinstid INTEGER,
checkinid INTEGER default 0,
errorcount INTEGER default 0 NOT NULL,
errorid INTEGER default 0 NOT NULL,
errorstr VARCHAR(255),
insdate DATETIME YEAR to SECOND default Current YEAR to SECOND,
insuser VARCHAR(40) default User,
upddate DATETIME YEAR to SECOND,
upduser VARCHAR(40))
EXTENT SIZE 1999998 NEXT SIZE 1999998 LOCK MODE ROW;

ALTER TABLE "dimam".rtorders ADD CONSTRAINT PRIMARY KEY (id) CONSTRAINT "dimam".pk_rtorders;
CREATE INDEX "paveld".i_cdmp_rtorders ON "dimam".rtorders(cliringdate, marketplaceid, portfolioid);
CREATE INDEX "paveld".i_srtdc_rtorders ON "dimam".rtorders(cliringdate, s_rtsourceid);

Теперь суть проблемы. Таблица содержит биржевые заявки клиентов(portfolioid) за каждый рабочий день(cliringdate). Заявки бывают подписанные автоматически и нет(signkind 1/0). Из не подписанных заявок создаются документы(признак захвата checkinid 1).
Итак, мне необходимо найти минимальную дату за которую у некого клиента имеются не подписанные заявки для того чтобы создать документ.

Сам запрос выглядит так.
select
min(cliringdate),min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders
where
cliringdate >= "01.01.2010"
and marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
and portfolioid = 13936
and s_vstatusid = 30
and checkinid = 0
and signkind = 0;

План.
QUERY: (OPTIMIZATION TIMESTAMP: 05-13-2011 14:04:18)
------
select
min(cliringdate), min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders
where
cliringdate >= "01.01.2010"
and marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
and portfolioid = 13936
and s_vstatusid = 30
and checkinid = 0
and signkind = 0;

Estimated Cost: 5
Estimated # of Rows Returned: 1

1) dimam.rtorders: INDEX PATH

Filters: ((((dimam.rtorders.checkinid = 0 AND dimam.rtorders.portfolioid = 13936 ) AND dimam.rtorders.signkind = 0 ) AND dimam.rtorders.marketplaceid = ANY <subquery> ) AND dimam.rtorders.s_vstatusid = 30 )

(1) Index Name: paveld.i_srtdc_rtorders
Index Keys: cliringdate s_rtsourceid (Aggregate) (Serial, fragments: ALL)
Lower Index Filter: dimam.rtorders.cliringdate >= 01/01/2010

Subquery:
---------
Estimated Cost: 1
Estimated # of Rows Returned: 4

1) paveld.s: INDEX PATH

(1) Index Name: paveld.i_cm_printfolder
Index Keys: cldocsid marketplaceid (Key-Only) (Serial, fragments: ALL)
Lower Index Filter: paveld.s.cldocsid = 10002

Скорость исполнения порядка 20 секунд, меняю дату "01.01.2010" на "01.01.2011" уже минуты полторы.
Что мне не понравилось в таком исполнении, в плане указан индекс по которому он начал выборку, хотя логичнее(это по мне) было бы предположить, что он не тем индексом воспользовался, так как есть составной индекс "cliringdate, marketplaceid, portfolioid" который как мне показалось должен более подходить для такого условия выборки.
Я попробовал явно указать каким индексом должен воспользоваться запрос.
select
{++ INDEX (rtorders i_cdmp_rtorders)}
min(cliringdate),min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders
where
cliringdate >= "01.01.2010"
and marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
and portfolioid = 13936
and s_vstatusid = 30
and checkinid = 0
and signkind = 0;

План
QUERY: (OPTIMIZATION TIMESTAMP: 05-13-2011 14:15:34)
------
select
{++ INDEX (rtorders i_cdmp_rtorders)}
min(cliringdate), min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders
where
cliringdate >= "01.01.2010"
and marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
and portfolioid = 13936
and s_vstatusid = 30
and checkinid = 0
and signkind = 0;

DIRECTIVES FOLLOWED:
INDEX ( rtorders i_cdmp_rtorders )
DIRECTIVES NOT FOLLOWED:

Estimated Cost: 5
Estimated # of Rows Returned: 1

1) dimam.rtorders: INDEX PATH

Filters: ((dimam.rtorders.checkinid = 0 AND dimam.rtorders.signkind = 0 ) AND dimam.rtorders.s_vstatusid = 30 )

(1) Index Name: paveld.i_cdmp_rtorders
Index Keys: cliringdate marketplaceid portfolioid (Key-First) (Aggregate) (Serial, fragments: ALL)
Lower Index Filter: dimam.rtorders.cliringdate >= 01/01/2010
Index Key Filters: (dimam.rtorders.portfolioid = 13936 ) AND
(dimam.rtorders.marketplaceid = ANY <subquery> )

Subquery:
---------
Estimated Cost: 1
Estimated # of Rows Returned: 4

1) paveld.s: INDEX PATH

(1) Index Name: paveld.i_cm_printfolder
Index Keys: cldocsid marketplaceid (Key-Only) (Serial, fragments: ALL)
Lower Index Filter: paveld.s.cldocsid = 10002

Но что я заметил, скорость выборки упала до 50! секунд, а если так же поменять дату на "01.01.2011" то вообще три минуты.
Собственно с построением индексов у меня беда.

Вопрос, как же все таки получить производительность для поиска минимальной даты. Спасибо заранее за все возможные комментарии.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259290
Ikir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dishonest,

- на таких обьемах стоит задуматься о фрагментации таблицы
- как часто делается update statistics?
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259334
GVF112GVF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dishonest,

На вскидку, можно попробовать:
- выполнить обновление статистика для таблиц/индексов.
- изменить параметры оптимизации для выполнения запроса ( DB2 optimization classes = 5)
- выполнить запрос с использованием db2batch для анализа времени выполнения.
- натравить утилиту db2advis для получение рекомендаций по индексам MQT.

PS:
db2batch - Benchmark tool command
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.cmd.doc/doc/r0002043.html?resultof=%22%64%62%32%62%61%74%63%68%22%20

db2advis - DB2 design advisor command
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.cmd.doc/doc/r0002452.html?resultof=%22%64%62%32%61%64%76%69%73%22%20

С уважением,
Вадим.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259342
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ikirdishonest,

- на таких обьемах стоит задуматься о фрагментации таблицы
- как часто делается update statistics?

Спасибо за комментарий.

- update statistics делается ежедневно после массовой вставки данных утром.
- ранее в свое время пробовали разносить на разные dbspaces и раскладывать по разным дискам плюс в отдельный dbspaces индексы, но что-то де то не понравилось и вернулись опять обратно. + dbspaces не позволяет обращаться по rowid, даже не помню где это используется... Но вообще попробуем поднять в отдельную DB еще раз по такой схеме.

И опять к же если вернуться к сути проблемы это не объясняет, почему informix все таки не использует правильно index, если конечно должен.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259359
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dishonest,какая версия Informix?
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259361
GVF112GVF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GVF112GVFdishonest,

На вскидку, можно попробовать:
- выполнить обновление статистика для таблиц/индексов.
- изменить параметры оптимизации для выполнения запроса ( DB2 optimization classes = 5)
- выполнить запрос с использованием db2batch для анализа времени выполнения.
- натравить утилиту db2advis для получение рекомендаций по индексам MQT.

PS:
db2batch - Benchmark tool command
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.cmd.doc/doc/r0002043.html?resultof=%22%64%62%32%62%61%74%63%68%22%20

db2advis - DB2 design advisor command
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.cmd.doc/doc/r0002452.html?resultof=%22%64%62%32%61%64%76%69%73%22%20

С уважением,
Вадим.

Sorry ... ... это для DB2 ... ;)

В Informix, попробуйте выполнить обновление статистики для таблиц/индексов.
Далее, следует пересмотреть стратегию фрагментации таблиц и индексов (или формирование SQL-запросов).

С уважением,
Вадим.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259370
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GVF112GVFdishonest,

На вскидку, можно попробовать:
- выполнить обновление статистика для таблиц/индексов.
- изменить параметры оптимизации для выполнения запроса ( DB2 optimization classes = 5)
- выполнить запрос с использованием db2batch для анализа времени выполнения.
- натравить утилиту db2advis для получение рекомендаций по индексам MQT.

PS:
db2batch - Benchmark tool command
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.cmd.doc/doc/r0002043.html?resultof=%22%64%62%32%62%61%74%63%68%22%20

db2advis - DB2 design advisor command
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.cmd.doc/doc/r0002452.html?resultof=%22%64%62%32%61%64%76%69%73%22%20

С уважением,
Вадим.

хм.. простите не указал что мы пользуемся IDS 11.50.FC6W4WE. Как я понимаю DB2 это нечто другое?
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259375
GVF112GVF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dishonestIkirdishonest,

- на таких обьемах стоит задуматься о фрагментации таблицы
- как часто делается update statistics?

Спасибо за комментарий.

- update statistics делается ежедневно после массовой вставки данных утром.
- ранее в свое время пробовали разносить на разные dbspaces и раскладывать по разным дискам плюс в отдельный dbspaces индексы, но что-то де то не понравилось и вернулись опять обратно. + dbspaces не позволяет обращаться по rowid, даже не помню где это используется... Но вообще попробуем поднять в отдельную DB еще раз по такой схеме.

И опять к же если вернуться к сути проблемы это не объясняет, почему informix все таки не использует правильно index, если конечно должен.

Какое значение параметра OPTCOMPIND в файле ONCONFIG ? Какая версия Informix ?

С уважением,
Вадим.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259381
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GVF112GVF,

да я эту статистику гоняю вдоль и поперек :)
плюс пробовал выполнять update statistics HIGH for table rtorders(cliringdate,portfolioid,marketplaceid);
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259393
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GVF112GVF
Какое значение параметра OPTCOMPIND в файле ONCONFIG ? Какая версия Informix ?

С уважением,
Вадим.

IDS 11.50.FC6W4WE
OPTCOMPIND устанавливал в 0, добавляя системную переменную в систему. Что с ней что без нее все было так же.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259398
GVF112GVF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dishonestGVF112GVFdishonest,

На вскидку, можно попробовать:
- выполнить обновление статистика для таблиц/индексов.
- изменить параметры оптимизации для выполнения запроса ( DB2 optimization classes = 5)
- выполнить запрос с использованием db2batch для анализа времени выполнения.
- натравить утилиту db2advis для получение рекомендаций по индексам MQT.

PS:
db2batch - Benchmark tool command
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.cmd.doc/doc/r0002043.html?resultof=%22%64%62%32%62%61%74%63%68%22%20

db2advis - DB2 design advisor command
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.cmd.doc/doc/r0002452.html?resultof=%22%64%62%32%61%64%76%69%73%22%20

С уважением,
Вадим.

хм.. простите не указал что мы пользуемся IDS 11.50.FC6W4WE. Как я понимаю DB2 это нечто другое?

Попробуйте сравнить выполнение запроса с OPTCOMPIND=0 и OPTCOMPIND=2 для Вашей сессии.

-- 1]
SET ENVIRONMENT OPTCOMPIND 0
....
-- Ваш SQL ....
-- disconnect for databas
...

-- 2]
SET ENVIRONMENT OPTCOMPIND 2
....
-- Ваш SQL ....

C уважением,
Вадим.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259403
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GVF112GVF
SET ENVIRONMENT OPTCOMPIND 2
....
-- Ваш SQL ....

C уважением,
Вадим.

по умолчанию у нас такой стоит
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259439
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dishonest, давайте посмотрим на запрос (начнём с малого - без особых наворотов).
Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
min(cliringdate)
from rtorders
where
cliringdate >= "01.01.2010"
and marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid =  10002 )
and portfolioid =  13936 
and s_vstatusid =  30 
and checkinid =  0 
and signkind =  0 ;

1. select s.marketplaceid from printfolder s where s.cldocsid = 10002 может вернуть несколько значений?
2. По cliringdate идёт поиск min. Значит желательно его иметь последним в индексе. А до него - всё то, по чему у вас наложены явные фильтры, причём в порядке эффективности - т.е. начиная с того столбца по которому данный фильтр вернёт минимальное количество значений. Это в идеале для одного запроса.
Проставьте приблизительно количество записей, которые вам вернёт запрос, если его выполянть только с ОДНИМ из нижеперечисленных условий.
Есть подозрение, что это portfolioid. если да - вам нужны индексы типа (portfolioid, cliringdate) или (portfolioid, checkinid, cliringdate) и тому подобное. Возможно даже (portfolioid, marketplaceid, checkinid, cliringdate) - просто не представляю разнообразие marketplaceid у одного клиента...
(Я не могу тоже предположить что-такое у вас s_vstatusid и signkind).


Рекомендую начать с (portfolioid, checkinid, cliringdate)
П.С.: Да кстати, что-то у меня подозрение, что у вас нет внешних ключей - и соответственно индексов по отдельно взятым столбцам. Это правда?
1) cliringdate >= "01.01.2010"
2) marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
3) portfolioid = 13936
4) s_vstatusid = 30
5) checkinid = 0
6) signkind = 0;
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259482
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dishonestЧто мне не понравилось в таком исполнении, в плане указан индекс по которому он начал выборку, хотя логичнее(это по мне) было бы предположить, что он не тем индексом воспользовался, так как есть составной индекс "cliringdate, marketplaceid, portfolioid" который как мне показалось должен более подходить для такого условия выборки.

Таки не подходит. Нужно представлять себе индекс, его структуру и попробовать поставить себя на место СУБД, чтобы делать такие выводы. Взял он (Informix), индекс (cliringdate, marketplaceid, portfolioid). Первым полем cliringdate. Про него известно, что оно > 01.01.2010. И пошёл он - пусть даже в индексе - просматривать все эти ключи, пытаясь фильтровать (у вас же IN) среди них marketplaceid... причём чтобы min найти, нужно идти по возрастанию дат, пропуская кучу signkind =1 и checkinid = 1...

Кстати я мог не попасть в яблочко с (portfolioid, checkinid, cliringdate). Могут оказаться чуть более эффективными
(portfolioid, cliringdate), (portfolioid, signkind, cliringdate) или даже (portfolioid, checkinid, signkind, cliringdate)...

П.С.: А при дате 01.01.2011 запрос мог тормозить по следующей очевидной причине: план запроса для 2011 был не таким же, как 2010 - а вы его не просмотрели...
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259494
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛой(Я не могу тоже предположить что-такое у вас s_vstatusid и signkind).

Пардон, конечно же про signkind вы написали - недосмотрел... А вот s_vstatusid - непонятно.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259498
GVF112GVF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dishonestGVF112GVFSET ENVIRONMENT OPTCOMPIND 2
....
-- Ваш SQL ....

C уважением,
Вадим.

по умолчанию у нас такой стоит

Я так понял, что сравнение на дает результата ... :))
Тогда нужно пересматривать SQL и схему базы данных (наличие требуемых индексов) ... and so on ...
как правило, 80% проблем производительности - это SQL.

Попробуйте путь, который предложил Анатолий - от простого к сложному.

С уважением,
Вадим.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259501
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатоЛойdishonest, давайте посмотрим на запрос (начнём с малого - без особых наворотов).
Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
min(cliringdate)
from rtorders
where
cliringdate >= "01.01.2010"
and marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid =  10002 )
and portfolioid =  13936 
and s_vstatusid =  30 
and checkinid =  0 
and signkind =  0 ;

1. select s.marketplaceid from printfolder s where s.cldocsid = 10002 может вернуть несколько значений?
2. По cliringdate идёт поиск min. Значит желательно его иметь последним в индексе. А до него - всё то, по чему у вас наложены явные фильтры, причём в порядке эффективности - т.е. начиная с того столбца по которому данный фильтр вернёт минимальное количество значений. Это в идеале для одного запроса.
Проставьте приблизительно количество записей, которые вам вернёт запрос, если его выполянть только с ОДНИМ из нижеперечисленных условий.
Есть подозрение, что это portfolioid. если да - вам нужны индексы типа (portfolioid, cliringdate) или (portfolioid, checkinid, cliringdate) и тому подобное. Возможно даже (portfolioid, marketplaceid, checkinid, cliringdate) - просто не представляю разнообразие marketplaceid у одного клиента...
(Я не могу тоже предположить что-такое у вас s_vstatusid и signkind).


Рекомендую начать с (portfolioid, checkinid, cliringdate)
П.С.: Да кстати, что-то у меня подозрение, что у вас нет внешних ключей - и соответственно индексов по отдельно взятым столбцам. Это правда?
1) cliringdate >= "01.01.2010"
2) marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
3) portfolioid = 13936
4) s_vstatusid = 30
5) checkinid = 0
6) signkind = 0;

Выкладываю полный список индексов и референсов
CREATE INDEX "dimam".i_clc_rtorders ON "dimam".rtorders(clientcode);

CREATE INDEX "paveld".i_cdmp_rtorders ON "dimam".rtorders(cliringdate, marketplaceid, portfolioid);

CREATE INDEX "paveld".i_cldcs_rtorders ON "dimam".rtorders(cldocsinstid);

CREATE INDEX "dimam".i_cldt_rtorders ON "dimam".rtorders(orderdate);

CREATE INDEX "dimam".i_cltr_rtorders ON "dimam".rtorders(tradecode);

CREATE INDEX "paveld".i_cldmn_rtorders ON "dimam".rtorders(cliringdate, marketnumber);

CREATE INDEX "dimam".i_nnt_rtorders ON "dimam".rtorders(ordernumber, cliringdate, pageid);

CREATE INDEX "dimam".i_nt_rtorders ON "dimam".rtorders(ordernumtxt, cliringdate, pageid);

CREATE INDEX "paveld".i_pid_rtorders ON "dimam".rtorders(portfolioid);

CREATE INDEX "informix".tmp_idx ON "dimam".rtorders(marketplaceid, portfolioid);

CREATE INDEX "paveld".i_mtd_rtorders ON "dimam".rtorders(marketnumber, ordertime, orderdate, cliringdate);

CREATE INDEX "paveld".i_srtdc_rtorders ON "dimam".rtorders(cliringdate, s_rtsourceid);

CREATE INDEX "paveld".i_err_rtorders ON "dimam".rtorders(errorid);

ALTER TABLE "dimam".rtorders ADD CONSTRAINT PRIMARY KEY
(id) CONSTRAINT "dimam".pk_rtorders;

ALTER TABLE "dimam".rtorders ADD CONSTRAINT (FOREIGN KEY
(s_actstatusid) REFERENCES "dimam".s_actstatus CONSTRAINT "dimam".fk_referen_s_actst);

ALTER TABLE "dimam".rtorders ADD CONSTRAINT (FOREIGN KEY
(s_vstatusid) REFERENCES "dimam".s_vstatus CONSTRAINT "dimam".fk_referen_s_vstat);

ALTER TABLE "dimam".rtorders ADD CONSTRAINT (FOREIGN KEY
(s_rtsourceid) REFERENCES "dimam".s_rtsource CONSTRAINT "dimam".fk_referen_s_rtsou);

ALTER TABLE "dimam".rtorders ADD CONSTRAINT (FOREIGN KEY
(s_rttableid) REFERENCES "dimam".s_rttables CONSTRAINT "dimam".fk_referen_s_rtab);

ALTER TABLE "dimam".rtorders ADD CONSTRAINT (FOREIGN KEY
(s_ordercondid) REFERENCES "dimam".s_ordercond CONSTRAINT "dimam".fk_ref_s_rtocond);

s_vstatusid - поле ссылка на внешнюю таблицу где содержатся значений которые указывают на то в какой стадии обработки находится запись. 30 в данном случае что она обработана, нет ошибок и можно отправлять в документ

signkind - это константа 0/1 - признак автоматической подписи записи

1. select s.marketplaceid from printfolder s where s.cldocsid = 10002 может вернуть несколько значений?
Да, в плане приведенном выше кстати кажется указано если я не ошибаюсь Estimated # of Rows Returned: 4

2) marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid = 10002) - имеется таблица printfolder которая указывает какие площадки должны включаться в печать для указанного типа документа
индекс таблицы CREATE INDEX "paveld".i_cm_printfolder ON "paveld".printfolder(cldocsid, marketplaceid);

количество marketplaceid порядка 50 всего, для отдельно взятого документа свой набор из этого кол-ва
клиентов portfolioid порядка 10000 тысяч
собственно количество уникальный торговых можно посчитать начиная с начала 2010 до текущего момента
вроде все указал...
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259507
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dishonest, и напоследок:
при большом разнообразии запросов в приличных (больших/серьёзных/красивых) приложениях для фильтров разработчикам стоит использовать переменные вместо констант... по крайней мере так должны стараться делать разработчики. Но если вы проверяете такой запрос с переменными "вручную" (не из приложения) - проверять приходится тоже с переменными (чтобы получить идентичную реакцию сервера). Я для этого пользуюсь eSQLEditor'ом...
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259508
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатоЛойТаки не подходит. Нужно представлять себе индекс, его структуру и попробовать поставить себя на место СУБД, чтобы делать такие выводы. Взял он (Informix), индекс (cliringdate, marketplaceid, portfolioid). Первым полем cliringdate. Про него известно, что оно > 01.01.2010. И пошёл он - пусть даже в индексе - просматривать все эти ключи, пытаясь фильтровать (у вас же IN) среди них marketplaceid... причём чтобы min найти, нужно идти по возрастанию дат, пропуская кучу signkind =1 и checkinid = 1...
Приходит понимание...
АнатоЛойКстати я мог не попасть в яблочко с (portfolioid, checkinid, cliringdate). Могут оказаться чуть более эффективными
(portfolioid, cliringdate), (portfolioid, signkind, cliringdate) или даже (portfolioid, checkinid, signkind, cliringdate)...
Сейчас буду эксперементировать...
АнатоЛойП.С.: А при дате 01.01.2011 запрос мог тормозить по следующей очевидной причине: план запроса для 2011 был не таким же, как 2010 - а вы его не просмотрели...

QUERY: (OPTIMIZATION TIMESTAMP: 05-13-2011 15:59:52)
------
select
min(cliringdate), min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders
where
cliringdate >= "01.01.2011"
and marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
and portfolioid = 13936
and s_vstatusid = 30
and checkinid = 0
and signkind = 0;

Estimated Cost: 5
Estimated # of Rows Returned: 1

1) dimam.rtorders: INDEX PATH

Filters: ((((dimam.rtorders.checkinid = 0 AND dimam.rtorders.portfolioid = 13936 ) AND dimam.rtorders.signkind = 0 ) AND dimam.rtorders.marketplaceid = ANY <subquery> ) AND dimam.rtorders.s_vstatusid = 30 )

(1) Index Name: paveld.i_srtdc_rtorders
Index Keys: cliringdate s_rtsourceid (Aggregate) (Serial, fragments: ALL)
Lower Index Filter: dimam.rtorders.cliringdate >= 01/01/2011

Subquery:
---------
Estimated Cost: 1
Estimated # of Rows Returned: 4

1) paveld.s: INDEX PATH

(1) Index Name: paveld.i_cm_printfolder
Index Keys: cldocsid marketplaceid (Key-Only) (Serial, fragments: ALL)
Lower Index Filter: paveld.s.cldocsid = 10002
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259516
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатоЛойdishonest, и напоследок:
при большом разнообразии запросов в приличных (больших/серьёзных/красивых) приложениях для фильтров разработчикам стоит использовать переменные вместо констант... по крайней мере так должны стараться делать разработчики. Но если вы проверяете такой запрос с переменными "вручную" (не из приложения) - проверять приходится тоже с переменными (чтобы получить идентичную реакцию сервера). Я для этого пользуюсь eSQLEditor'ом...

Пользуюсь и eSQLEditor'ом.. и InfSQL, запрос сидит в хранимой процедуре, которая понимает от какой даты ей дальше взять набор записей и присвоить созданному документу...
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259535
GVF112GVF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dishonest,

Какая у Вас задача (OLTP/DSS)? Это плановый, аналитический отчет ?!
Возможно, что Вам нужна витрина данных - Data Marts ?

С уважением,
Вадим.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259592
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dishonestALTER TABLE "dimam".rtorders ADD CONSTRAINT (FOREIGN KEY ....


Успокоили, спасибо :)

dishonest s_vstatusid - поле ссылка на внешнюю таблицу где содержатся значений которые указывают на то в какой стадии обработки находится запись. 30 в данном случае что она обработана, нет ошибок и можно отправлять в документ

Т.е. подавляющее большинство (>90%) записей будут как-раз с нужным значением 30? Тогда нет смыcла включать в искомый для нас индекс...

dishonest signkind - это константа 0/1 - признак автоматической подписи записи

Если подавляющее большинство (>90%) записей имеют signkind = 1 - т.е. не нужны - есть смысл включать в искомый для нас индекс...

dishonestколичество marketplaceid порядка 50 всего, для отдельно взятого документа свой набор из этого кол-ва

Допустим, в среднем мы отбираем 5 записей из 50 - это 10%.
На 50 записях - попса, на 10000 - разница в 10 процентов может из запроса в 20 сек, сделать 2 сек....
стоит включить в искомый для нас индекс...

dishonestклиентов portfolioid порядка 10000 тысяч

отличный фильтр - таки остаётся первым в списке.

1. portfolioid вне конкуренции - из 70 млн осталось приблизительно 7 000 документов.
2. s_vstatusid - если мои предположения верны - сошёл с дистанции.
2. за второе место идёт яростная борьба между marketplaceid, signkind, checkinid.
2.1. marketplaceid может оставить всего 70.
2.2. signkind - мне неизвестно - т.е. я не знаю в среднем распределение между авто/ручным если автоматических больше 90% - только тогда это поле стоит использовать.
2.3. checkinid - на разных этапах их то значительно больше с 0, то значительно больше с 1. практически бесполезное поле для индекса.



Итого, навскидку, без всяких проверок и тюнингов (portfolioid, marketplaceid, cliringdate).

Проверяйте скорость и план. Если в плане не тот индекс - UPD STAT MEDIUM для rtorders.
Если и после этого не тот индекс в плане - возможно вместо marketplaceid IN(...) стоит преобразовать запрос в простое соединение rtorders с cldocsdate).

Если и после этого не тот индекс в плане - попробуйте заставить принудительно - чтоб было с чем сравнивать.

Если результат вас удовлетворил по скорости - дальнейшей оптимизацией есть смысл заниматься только для повышения квалификации. Данный индекс помимо всего прочего, вполне подойдёт для других запросов связанных с клиентами и датами...
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259595
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
елы, как дети.

ясен пень такой запрос может выполнится за 4 наносекунды на любом компе.

только индекс нужен (portfolioid, marketplaceid, cliringdate)

cliringdate должен быть в конце, для того что бы найти min(cliringdate) из индекса.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259599
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и фрагментация ИНДЕКСА поможет уменьшить blevel индекса, поэтому тоже до кучи не помешает.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259610
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Дениселы, как дети.
ясен пень такой запрос может выполнится за 4 наносекунды на любом компе.
только индекс нужен (portfolioid, marketplaceid, cliringdate)
cliringdate должен быть в конце, для того что бы найти min(cliringdate) из индекса.
Ну тебя же не было :). А я ещё попрактивал training skill и type skill :). Или ты иеня к "как детям" в этом топике не относишь?
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259622
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛойЖуравлев Денисcliringdate должен быть в конце, для того что бы найти min(cliringdate) из индекса.
Ну тебя же не было :). А я ещё попрактивал training skill и type skill :). Или ты иеня к "как детям" в этом топике не относишь?
Ну и у ТС, надеюсь, в голове не только вывод останется - но и понимание, того почему он такой, и как к такому выводу прийти самому :)
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259625
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛойЖуравлев Дениселы, как дети.
ясен пень такой запрос может выполнится за 4 наносекунды на любом компе.
только индекс нужен (portfolioid, marketplaceid, cliringdate)
cliringdate должен быть в конце, для того что бы найти min(cliringdate) из индекса.
Ну тебя же не было :). А я ещё попрактивал training skill и type skill :). Или ты иеня к "как детям" в этом топике не относишь? прости, я до тебя не дочитал :), как увидел что уже статистику и optcompind обсуждают, так и полыхнул
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259642
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья, всем спасибо за подробные комментарии, сейчас буду дерзать, но в силу того что время уже вечернее, а на создание индексов уходит по 30 минут + потом статистику, все мои опыты и результаты скорее всего будут известны уже в понедельник ближе к вечеру. Обязательно отпишусь.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259647
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dishonestДрузья, всем спасибо за подробные комментарии, сейчас буду дерзать, но в силу того что время уже вечернее, а на создание индексов уходит по 30 минут + потом статистику, все мои опыты и результаты скорее всего будут известны уже в понедельник ближе к вечеру. Обязательно отпишусь.статистику скорее всего можно не собирать, и так заработает. Индекс на такой таблице должен строится меньше 30 минут, используйте pdq .
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259711
Фотография Daugava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dishonest+ dbspaces не позволяет обращаться по rowid
Код: plaintext
1.
2.
3.
4.
5.
To create the rowid column, use the following SQL syntax:

    The WITH ROWIDS clause of the CREATE TABLE statement
    The ADD ROWIDS clause of the ALTER TABLE statement
    The INIT clause of the ALTER FRAGMENT statement
http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.ddi.doc/ddi100.htm
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37259879
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы меня простите господа, я просто совсем не гуру так что ногами не пинайте.

АнатоЛойИтого, навскидку, без всяких проверок и тюнингов (portfolioid, marketplaceid, cliringdate).


CREATE INDEX "paveld".i_pmcd_rtorders ON "dimam".rtorders(portfolioid,marketplaceid,cliringdate);

QUERY: (OPTIMIZATION TIMESTAMP: 05-13-2011 17:07:15)
------
select
min(cliringdate), min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders
where
portfolioid = 13936
and marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
and cliringdate >= "01.01.2010"
and s_vstatusid = 30
and checkinid = 0
and signkind = 0;

Estimated Cost: 5
Estimated # of Rows Returned: 1

1) dimam.rtorders: INDEX PATH

Filters: ((((dimam.rtorders.checkinid = 0 AND dimam.rtorders.portfolioid = 13936 ) AND dimam.rtorders.signkind = 0 ) AND dimam.rtorders.marketplaceid = ANY <subquery> ) AND dimam.rtorders.s_vstatusid = 30 )

(1) Index Name: paveld.i_srtdc_rtorders
Index Keys: cliringdate s_rtsourceid (Aggregate) (Serial, fragments: ALL)
Lower Index Filter: dimam.rtorders.cliringdate >= 01/01/2010

Subquery:
---------
Estimated Cost: 1
Estimated # of Rows Returned: 4

1) paveld.s: INDEX PATH

(1) Index Name: paveld.i_cm_printfolder
Index Keys: cldocsid marketplaceid (Key-Only) (Serial, fragments: ALL)
Lower Index Filter: paveld.s.cldocsid = 1000

АнатоЛойПроверяйте скорость и план. Если в плане не тот индекс - UPD STAT MEDIUM для rtorders.

update statistics MEDIUM for table rtorders;

QUERY: (OPTIMIZATION TIMESTAMP: 05-13-2011 17:26:23)
------
select
min(cliringdate), min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders
where
portfolioid = 13936
and marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
and cliringdate >= "01.01.2010"
and s_vstatusid = 30
and checkinid = 0
and signkind = 0;

Estimated Cost: 5
Estimated # of Rows Returned: 1

1) dimam.rtorders: INDEX PATH

Filters: ((((dimam.rtorders.checkinid = 0 AND dimam.rtorders.portfolioid = 13936 ) AND dimam.rtorders.signkind = 0 ) AND dimam.rtorders.marketplaceid = ANY <subquery> ) AND dimam.rtorders.s_vstatusid = 30 )

(1) Index Name: paveld.i_srtdc_rtorders
Index Keys: cliringdate s_rtsourceid (Aggregate) (Serial, fragments: ALL)
Lower Index Filter: dimam.rtorders.cliringdate >= 01/01/2010

Subquery:
---------
Estimated Cost: 1
Estimated # of Rows Returned: 4

1) paveld.s: INDEX PATH

(1) Index Name: paveld.i_cm_printfolder
Index Keys: cldocsid marketplaceid (Key-Only) (Serial, fragments: ALL)
Lower Index Filter: paveld.s.cldocsid = 10002

АнатоЛойЕсли и после этого не тот индекс в плане - возможно вместо marketplaceid IN(...) стоит преобразовать запрос в простое соединение rtorders с cldocsdate).


Да вообще выкинул ради пробы
Пошел в новый index, результат абсолютно точно такой же с которого начинался пост, но печальночто нет связи с площадками

QUERY: (OPTIMIZATION TIMESTAMP: 05-13-2011 17:30:06)
------
select
min(cliringdate), min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders
where
portfolioid = 13936
and marketplaceid = 26 --in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
and cliringdate >= "01.01.2010"
and s_vstatusid = 30
and checkinid = 0
and signkind = 0;

Estimated Cost: 3
Estimated # of Rows Returned: 1

1) dimam.rtorders: INDEX PATH

Filters: ((dimam.rtorders.checkinid = 0 AND dimam.rtorders.signkind = 0 ) AND dimam.rtorders.s_vstatusid = 30 )

(1) Index Name: paveld.i_pmcd_rtorders
Index Keys: portfolioid marketplaceid cliringdate (Aggregate) (Serial, fragments: ALL)
Lower Index Filter: ((dimam.rtorders.marketplaceid = 26 AND dimam.rtorders.portfolioid = 13936 ) AND dimam.rtorders.cliringdate >= 01/01/2010 )

Попробывал след запрос, виден в плане, скорость даже смотреть не буду, стоимости уже хватило.. чота дето у меня в косерватории
QUERY: (OPTIMIZATION TIMESTAMP: 05-13-2011 17:41:00)
------
select
min(cliringdate), min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders, printfolder
where
portfolioid = 13936
and rtorders.marketplaceid = printfolder.marketplaceid
and printfolder.cldocsid = 10002
and cliringdate >= "01.01.2010"
and s_vstatusid = 30
and checkinid = 0
and signkind = 0;

Estimated Cost: 2723151
Estimated # of Rows Returned: 1

1) paveld.printfolder: INDEX PATH

(1) Index Name: paveld.i_cm_printfolder
Index Keys: cldocsid marketplaceid (Key-Only) (Serial, fragments: ALL)
Lower Index Filter: paveld.printfolder.cldocsid = 10002

2) dimam.rtorders: INDEX PATH

Filters: (((dimam.rtorders.checkinid = 0 AND dimam.rtorders.signkind = 0 ) AND dimam.rtorders.s_vstatusid = 30 ) AND dimam.rtorders.cliringdate >= 01/01/2010 )

(1) Index Name: informix.tmp_idx
Index Keys: marketplaceid portfolioid (Serial, fragments: ALL)
Lower Index Filter: (dimam.rtorders.marketplaceid = paveld.printfolder.marketplaceid AND dimam.rtorders.portfolioid = 13936 )
NESTED LOOP JOIN

Сейчас все таки попробую еще раз трезво на все взглянуть.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37260227
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dishonest,

вместо того чтобы смотреть стоимость, смотрите время выполнения. А лучше всего, если сервер в вашем полном распоряжении, смотрите число disk reads (onstat -p)

Я, когда тестирую запрос, делаю так:

onmode -ky;oninit -v;wait 10;onstat -z; time dbaccess <имя базы> <мой скрипт>.sql; wait 10; onstat -p

То есть - положить сервер, поднять, подождать 10 сек, сбросить статистику, замерить время выполнения скрипта, подождать 10 сек, получить статистику
Чем меньше disk reads тем лучше, их надо сравнивать с предыдущей версией скрипта, изменение времени выполнения скрипта прямо пропорционально изменению дисковых чтений
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37260236
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dishonest
АнатоЛойПроверяйте скорость и план. Если в плане не тот индекс - UPD STAT MEDIUM для rtorders.

update statistics MEDIUM for table rtorders;



Попробуйте UPDATE HIGH для portfolioid,marketplaceid,cliringdate.
Возможно, у вас не обновилось distribution

dishonestАнатоЛойЕсли и после этого не тот индекс в плане - возможно вместо marketplaceid IN(...) стоит преобразовать запрос в простое соединение rtorders с cldocsdate).


Да вообще выкинул ради пробы
Пошел в новый index, результат абсолютно точно такой же с которого начинался пост, но печальночто нет связи с площадками

QUERY: (OPTIMIZATION TIMESTAMP: 05-13-2011 17:30:06)
------
select
min(cliringdate), min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders
where
portfolioid = 13936
and marketplaceid = 26 --in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
and cliringdate >= "01.01.2010"
and s_vstatusid = 30
and checkinid = 0
and signkind = 0;



перепишите как

select
min(cliringdate), min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders
where
portfolioid = 13936
and marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid = 10002 and s.marketplaceid = rtorders.marketplaceid )
and cliringdate >= "01.01.2010"
and s_vstatusid = 30
and checkinid = 0
and signkind = 0;
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37260307
alexey_mas1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
также
Код: plaintext
1.
and marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid =  10002 )

заменить на
Код: plaintext
 and exists (select  1  from printfolder s where s.cldocsid= 10002  and s.marketplace=rtorders.marketplace)
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37260416
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Дениселы, как дети.

ясен пень такой запрос может выполнится за 4 наносекунды на любом компе.

только индекс нужен (portfolioid, marketplaceid, cliringdate)

cliringdate должен быть в конце, для того что бы найти min(cliringdate) из индекса.


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

and checkinid = 0 and signkind = 0;

поэтому дата тут вообще возможно не нужна

я не понял как идентифицируется клиент, парой portfolioid, marketplaceid или бывают запросы только отдельно portfolioid, поэтому индекс должен быть или

portfolioid, checkinid, signkind, marketplaceid
или
portfolioid, marketplaceid, checkinid, signkind
для конкретно этого запроса разницы конечно нет.

Если записей portfolioid=, marketplaceid=, checkinid=0, signkind=0 больше ста то тогда я бы у себя сделал индекс
portfolioid, marketplaceid, checkinid, signkind, cliringdate


И я бы соединил checkinid, signkind в один аттрибут status
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37260573
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dishonestПопробывал след запрос, виден в плане, скорость даже смотреть не буду, стоимости уже хватило.. чота дето у меня в косерватории
QUERY: (OPTIMIZATION TIMESTAMP: 05-13-2011 17:41:00)
------
select
min(cliringdate), min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders, printfolder
where
portfolioid = 13936
and rtorders.marketplaceid = printfolder.marketplaceid
and printfolder.cldocsid = 10002
and cliringdate >= "01.01.2010"
and s_vstatusid = 30
and checkinid = 0
and signkind = 0;

Estimated Cost: 2723151
Estimated # of Rows Returned: 1

1) paveld.printfolder: INDEX PATH

(1) Index Name: paveld.i_cm_printfolder
Index Keys: cldocsid marketplaceid (Key-Only) (Serial, fragments: ALL)
Lower Index Filter: paveld.printfolder.cldocsid = 10002

2) dimam.rtorders: INDEX PATH

Filters: (((dimam.rtorders.checkinid = 0 AND dimam.rtorders.signkind = 0 ) AND dimam.rtorders.s_vstatusid = 30 ) AND dimam.rtorders.cliringdate >= 01/01/2010 )

(1) Index Name: informix.tmp_idx
Index Keys: marketplaceid portfolioid (Serial, fragments: ALL)
Lower Index Filter: (dimam.rtorders.marketplaceid = paveld.printfolder.marketplaceid AND dimam.rtorders.portfolioid = 13936 )
NESTED LOOP JOIN



Стоимость выполнения запроса измеряеится в попугаях, причём это ОЦЕНОЧНАЯ стоимость, типа прогноза погоды :).
1) +1 к предыдущим - и время таки проверить стоит, и дисковые операциию.
2) таки реально попробуйте простой запрос - с обращением только к одной таблице и константами. Если он Вас устроит по скорости - только тогда постепенно добавляйте новые условия и проверяйие план запроса и реальное поведение сервера (время, чтения дисков).
При отклонениях от ожидаемого поведения - много думайте, пишите сюда :)
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37262269
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья, в общем и так и этак попробовал. Остановился на следующем варианте.
Создал себе индекс
CREATE INDEX "paveld".i_pchmd_rtorders ON "dimam".rtorders(portfolioid,checkinid,marketplaceid,cliringdate);

Далее план двух нужных мне запросов

QUERY: (OPTIMIZATION TIMESTAMP: 05-16-2011 11:18:58)
------
select
min(cliringdate), min(cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid = 10002)
from rtorders
where
portfolioid = 13936
and checkinid = 0
and marketplaceid = 26 -- in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
and cliringdate >= "01.01.2010"
and s_vstatusid = 30
and signkind = 0;

Estimated Cost: 3
Estimated # of Rows Returned: 1

1) dimam.rtorders: INDEX PATH

Filters: (dimam.rtorders.signkind = 0 AND dimam.rtorders.s_vstatusid = 30 )

(1) Index Name: paveld.i_pchmd_rtorders
Index Keys: portfolioid checkinid marketplaceid cliringdate (Aggregate) (Serial, fragments: ALL)
Lower Index Filter: (((dimam.rtorders.checkinid = 0 AND dimam.rtorders.marketplaceid = 26 ) AND dimam.rtorders.portfolioid = 13936 ) AND dimam.rtorders.cliringdate >= 01/01/2010 )


QUERY: (OPTIMIZATION TIMESTAMP: 05-16-2011 11:19:16)
------
SELECT
count(*)
FROM rtorders rt
WHERE
rt.portfolioid = 13936
and rt.checkinid = 0 --не принадлежат документу
and rt.marketplaceid in (select s.marketplaceid from printfolder s where s.cldocsid = 10002)
and rt.cliringdate >= "04.05.2010"
and rt.cliringdate <= date('04.05.2010')+10
and rt.s_vstatusid = 30 --готовы к обработке
and rt.signkind = 0 --признак ЭЦП подписи Квика

Estimated Cost: 20314
Estimated # of Rows Returned: 1

1) paveld.rt: INDEX PATH

Filters: (paveld.rt.signkind = 0 AND paveld.rt.s_vstatusid = 30 )

(1) Index Name: paveld.i_pchmd_rtorders
Index Keys: portfolioid checkinid marketplaceid cliringdate (Serial, fragments: ALL)
Lower Index Filter: (((paveld.rt.checkinid = 0 AND paveld.rt.portfolioid = 13936 ) AND paveld.rt.cliringdate >= 04/05/2010 ) AND paveld.rt.marketplaceid = ANY <subquery> )
Upper Index Filter: paveld.rt.cliringdate <= 14/05/2010

Subquery:
---------
Estimated Cost: 1
Estimated # of Rows Returned: 4

1) paveld.s: INDEX PATH

(1) Index Name: paveld.i_cm_printfolder
Index Keys: cldocsid marketplaceid (Key-Only) (Serial, fragments: ALL)
Lower Index Filter: paveld.s.cldocsid = 10002


В первом запросе выкинул конструкцию выборки площадок для печатаемого документа. Если использовать in или or или exists (константами либо селект), либо еще как либо пытаться их туда перечислить то первое на что мы натыкаемся это выборка все потому же индексу который я указал в самом начале поста. Далее все те же 20 и более секунд.
В общем я решил что раз уж эта беда зашита у меня в хранимой процедуре, использовать курсор для выборки площадок для документа, по нему выполнять запрос на получение минимальной даты. Ибо запросы в таком виде и под ваши комментарии с индексами на текущий момент работают действительно 4 наносекунды. Всем спасибо буду двигаться дальше.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37262400
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dishonestДалее все те же 20 и более секунд.
работают действительно 4 наносекунды.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37263371
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
старшие товарищи говорят я неправильную картинку положил. Попробую еще раз:
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37264561
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев ДенисdishonestДалее все те же 20 и более секунд.
работают действительно 4 наносекунды.
Я ничего не понял!

Чё непонятно-то?
Если в запросе для marketplaceid написано " = 26" - всё летает в 4 наносекунды (и использует "правильный" индекс)
Если в запросе для marketplaceid задачу усложнить (
1) marketplaceid in (select ..);
2) marketplaceid= x or marketplaceid = y;
3) exists (select from a where a.x = rtorders))

всё возвращается к исходному "плохому" индексу... Поскольку у ТС есть возможность поменять запрос, ТС не стал париться - и поменял его :)

ТС, ради интереса, попробуй просто JOIN! :


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select
   min(o.cliringdate), min(o.cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid =  10002 )
  from printfolder s, rtorders o
    where
        s.cldocsid =  10002 
        and o.portfolioid =  13936 
        and o.checkinid =  0 
        and o.marketplaceid = s.marketplaceid 
        and o.cliringdate >= "01.01.2010"
        and o.s_vstatusid =  30 
        and o.signkind =  0 ;
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37264783
dishonest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатоЛойЖуравлев Дениспропущено...

Я ничего не понял!

Чё непонятно-то?
Если в запросе для marketplaceid написано " = 26" - всё летает в 4 наносекунды (и использует "правильный" индекс)
Если в запросе для marketplaceid задачу усложнить (
1) marketplaceid in (select ..);
2) marketplaceid= x or marketplaceid = y;
3) exists (select from a where a.x = rtorders))

всё возвращается к исходному "плохому" индексу... Поскольку у ТС есть возможность поменять запрос, ТС не стал париться - и поменял его :)

ТС, ради интереса, попробуй просто JOIN! :


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select
   min(o.cliringdate), min(o.cliringdate) + (select d.countdate from cldocsdate d where d.cldocsid =  10002 )
  from printfolder s, rtorders o
    where
        s.cldocsid =  10002 
        and o.portfolioid =  13936 
        and o.checkinid =  0 
        and o.marketplaceid = s.marketplaceid 
        and o.cliringdate >= "01.01.2010"
        and o.s_vstatusid =  30 
        and o.signkind =  0 ;


Я уже выше же приводил пример с планом такого запроса.. указывал на стоимость(попугаи) да и скорость была удручающей...
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37264799
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а с хинтом +index план вашего запроса покажите?

а план вот такого запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select --+explain 
min(cliringdate)
from 
(select --+explain first_rows index (r,i_pchmd_rtorders)
 cliringdate,  (select distinct  1  from printfolder s where s.cldocsid =  10002  and s.marketplaceid=r.marketplaceid)  c
from rtorders r 
where
cliringdate >= '01.01.2010'
and portfolioid =  13936 
and s_vstatusid =  30 
and checkinid =  0 
and signkind =  0 
order by portfolioid, checkinid, marketplaceid, cliringdate)
where  c =  1 
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37265453
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Дениса с хинтом +index план вашего запроса покажите?

а план вот такого запроса:
...skipped...

с ума сойти можно...
Денис, это попытка разобраться в путях Господних оптимизатора, или реальное предложение к использованию в продуктиве?
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37265492
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛойЖуравлев Дениса с хинтом +index план вашего запроса покажите?

а план вот такого запроса:
...skipped...

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

Т.е.
select *
from t
where t.d = select max(t.d) from t

удобно заменять на:
select first 1 *
from t
order by t.d desc
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37265549
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев ДенисПросто интересно какой план будет. Ничего примечательного в запросе нет, в оракле у меня такой каждый второй.
Или я под конец дня туплю, или твой запрос не идентичен тому, что требуется ТС: в твоём запросе нет нужных ограничений по marketplaceid...
Разве что тебе интересен план запроса БЕЗ требования получить результат, который нужен ТСу..
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37265677
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛойЖуравлев ДенисПросто интересно какой план будет. Ничего примечательного в запросе нет, в оракле у меня такой каждый второй.
Или я под конец дня туплю, или твой запрос не идентичен тому, что требуется ТС: в твоём запросе нет нужных ограничений по marketplaceid...
Разве что тебе интересен план запроса БЕЗ требования получить результат, который нужен ТСу..он не идентичен, в том плане что я заменил in на "exists", там в секции селект коррелированным запросом выбирается 1 если на этой площадке торговали, а во внешнем запросе ограничивается c = 1.
...
Рейтинг: 0 / 0
Проблема поиска данных в большой таблице
    #37268211
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев ДенисАнатоЛойпропущено...

Или я под конец дня туплю, или твой запрос не идентичен тому, что требуется ТС: в твоём запросе нет нужных ограничений по marketplaceid...
Разве что тебе интересен план запроса БЕЗ требования получить результат, который нужен ТСу..он не идентичен, в том плане что я заменил in на "exists", там в секции селект коррелированным запросом выбирается 1 если на этой площадке торговали, а во внешнем запросе ограничивается c = 1.
ммм... только теперь проняло.

П.С.: DBMS это наше BDSM :)
...
Рейтинг: 0 / 0
47 сообщений из 47, показаны все 2 страниц
Форумы / Informix [игнор отключен] [закрыт для гостей] / Проблема поиска данных в большой таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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