Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Informix Новый топик    Ответить
 Index для поля date is null  [new]
potkin
Member

Откуда: Ungvar
Сообщений: 937
Есть поле типа Date.
В SQL-запросе есть проверка date IS NULL
Вопрос: Стоит ли для этого поля создавать индекс?

Заранее спасибо за ответ!
26 сен 17, 23:01    [20825317]     Ответить | Цитировать Сообщить модератору
 Re: Index для поля date is null  [new]
bk0010
Member

Откуда:
Сообщений: 3411
Для принятия решения информации совершенно недостаточно.
27 сен 17, 00:03    [20825445]     Ответить | Цитировать Сообщить модератору
 Re: Index для поля date is null  [new]
potkin
Member

Откуда: Ungvar
Сообщений: 937
bk0010
bk0010
Для принятия решения информации совершенно недостаточно.

А так достаточно?

Таблица:
--It's only test. Many features are not implemented yet.

DROP TABLE "informix".payments;

CREATE TABLE "informix".payments(
   id INTEGER NOT NULL,
   indexvz VARCHAR(6),
   operatorfio VARCHAR(50),
   oper_wnd_number INTEGER,
   payment_code VARCHAR(20),
   payment_sum FLOAT,
   comission_sum FLOAT,
   bonus_sum FLOAT,
   status_id INTEGER default 21107 NOT NULL,
   receiverid INTEGER NOT NULL,
   receiveredrpou VARCHAR(10),
   receivername VARCHAR(50),
   receiveracc VARCHAR(20),
   receivermfo VARCHAR(10),
   receiverbnkname VARCHAR(50),
   senderacc VARCHAR(100),
   senderfio VARCHAR(100),
   senderadress VARCHAR(100),
   senderpass VARCHAR(20),
   sendertel VARCHAR(255),
   contractnumber VARCHAR(100),
   date_ DATE,
   period INTEGER default 0 NOT NULL,
   ks INTEGER default 0,
   previous_ DECIMAL(16),
   current_ DECIMAL(16),
   date_start DATE,
   date_end DATE,
   jek VARCHAR(50),
   service_name VARCHAR(50),
   barcode VARCHAR(100),
   operatorid INTEGER,
   namevz VARCHAR(50),
   sessionid VARCHAR(50),
   nomenklature VARCHAR(20),
   paymenttype INTEGER,
   export_date DATE,
   export_login VARCHAR(20),
   exp_date_to_file DATE,
   exp_to_file_login VARCHAR(20),
   date_service DATETIME YEAR to SECOND,
   offlineimportdate DATE,
   receipt VARCHAR(30),
   plat_num INTEGER default 0 NOT NULL,
   sendercity VARCHAR(255),
   senderbuilding VARCHAR(255),
   senderkorpus VARCHAR(255),
   senderapartment VARCHAR(255),
   resend_sum FLOAT,
   resend_type INTEGER,
   payment_type "informix".boolean default f NOT NULL,
   debt FLOAT,
   addsum FLOAT,
   edit_date DATETIME YEAR to SECOND,
   edit_login NVARCHAR(100),
   additionally NVARCHAR(50),
   cpzimport "informix".boolean default f,
   mdaddvalueid INTEGER,
   senderid INTEGER,
   identifier NVARCHAR(30),
   receivergroup VARCHAR(10),
   fileid INTEGER default 0,
   service_purpose NVARCHAR(255) default '',
   subsidies FLOAT,
   plat_date DATE,
   counter_code VARCHAR(40),
   service_code VARCHAR(10),
   sendercityid DECIMAL(20,0),
   group_sign INTEGER,
   plat_edrpou VARCHAR(12),
   plat_mfo VARCHAR(12),
   plat_acc VARCHAR(20))
EXTENT SIZE 16 NEXT SIZE 16 LOCK MODE ROW;

CREATE INDEX "informix".idx_payments_z1 ON "informix".payments(period, status_id, receiverid);

CREATE INDEX "informix".payments_receiverid ON "informix".payments(receiverid);

CREATE INDEX "informix".payments_receivername ON "informix".payments(receivername);

CREATE INDEX "informix".payments ON "informix".payments(sessionid, indexvz);

CREATE INDEX "informix".payments_date_service_ind ON "informix".payments(date_service);

CREATE INDEX "informix".payments_indexvz ON "informix".payments(indexvz);

CREATE INDEX "informix".payments_iscanceled ON "informix".payments(status_id);

CREATE INDEX "informix".payments_period ON "informix".payments(period, senderpass);

CREATE INDEX "informix".payments_plat_num ON "informix".payments(plat_num, receiverid, status_id, date_service, indexvz);

ALTER TABLE "informix".payments ADD CONSTRAINT PRIMARY KEY 
   (id, indexvz, sessionid) CONSTRAINT "informix".paymentspk;

GRANT select, update, insert, delete, index ON payments TO public AS informix;


SQL-запрос:
SELECT COUNT(*) AS count_column FROM payments  WHERE receiverid = 1073858
    AND status_id = 21107 AND period = 0 AND export_date IS NULL AND
    payments.indexvz in       (       select i.indexvalue       from
    user_to_index  uti       inner join  indexes i  on i.id = uti.index_id
      and   user_pkid = 'cd537660-de2b-4c2c-bc29-a9e278e8729e')
27 сен 17, 08:56    [20825692]     Ответить | Цитировать Сообщить модератору
 Re: Index для поля date is null  [new]
cpr
Member

Откуда: Rostov-on-Don
Сообщений: 717
potkin,

возможно стоит запилить составной индекс по всем полям , которые в условии where.
Отдельно индекс по export_date смысла скорее всего не имеет.

Для осознанного выбора надо еще видеть селективность по фильтру и понимать сколько строк мы получим в результирующем наборе.

И как вы сами понимаете это напоминает ощупывание слона вслепую. Т.к. этот запрос скорее всего не исчерпывает всех особенностей системы.
27 сен 17, 09:27    [20825745]     Ответить | Цитировать Сообщить модератору
 Re: Index для поля date is null  [new]
bk0010
Member

Откуда:
Сообщений: 3411
Маловато, но уже лучше. Хорошо бы еще знать кол-во записей в таблице, их прирост, распределение и т.д. Для вашего запроса есть хороший индекс idx_payments_z1. Если записей с одинаковыми receiverid, status_id и period и разным export_date меньше 1000, то об индексировании export_date даже задумываться не надо. Рекомендую ознакомиться с командами set explain to ..., set explain on (перед запросом) и set explain off (после запроса). Они покажут вам, как сервер оценивает (и собирается выполнять) ваш запрос. Еще рекомендую посмотреть команду update statistics - прочищает мозги серверу. У вас очень много индексов, если таблица будет большой, то может начать тормозить добавление записей.
27 сен 17, 21:23    [20827753]     Ответить | Цитировать Сообщить модератору
 Re: Index для поля date is null  [new]
potkin
Member

Откуда: Ungvar
Сообщений: 937
автор
кол-во записей в таблице

~ 2 000 000 записей (постоянно увеличивается)
Результат запроса ~5 000 записей
1 окт 17, 10:55    [20834199]     Ответить | Цитировать Сообщить модератору
 Re: Index для поля date is null  [new]
АнатоЛой
Member

Откуда: Киев, Украина
Сообщений: 2896
Блог
1. Какая разница в количестве записей с дейт из нал и с дейт из нот нал?
2. Для эксперимента создайте индекс как з1 и добавьте к нему поле с датой. После обновления статистики посмотрите в эксплейне, какой из двух индексов используется. Возможно, вместо з1 и вас останется новый индекс.
3. Ваше приложение точно вызывает запрос, вставляя константы? Не используются параметры, на которые оптимизатор может реагировать совсем по другому?
4. Сделайте тестовую таблицу и сравните скорость вставки и обновления данных с индексом и без.
4 окт 17, 06:18    [20840729]     Ответить | Цитировать Сообщить модератору
Все форумы / Informix Ответить