Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Index для поля date is null / 7 сообщений из 7, страница 1 из 1
26.09.2017, 23:01
    #39526783
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Index для поля date is null
Есть поле типа Date .
В SQL-запросе есть проверка date IS NULL
Вопрос: Стоит ли для этого поля создавать индекс?

Заранее спасибо за ответ!
...
Рейтинг: 0 / 0
27.09.2017, 00:03
    #39526801
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Index для поля date is null
Для принятия решения информации совершенно недостаточно.
...
Рейтинг: 0 / 0
27.09.2017, 08:56
    #39526860
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Index для поля date is null
bk0010
bk0010Для принятия решения информации совершенно недостаточно.
А так достаточно?

Таблица:
Код: 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.
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.
--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-запрос:
Код: sql
1.
2.
3.
4.
5.
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')
...
Рейтинг: 0 / 0
27.09.2017, 09:27
    #39526881
cpr
cpr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Index для поля date is null
potkin,

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

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

И как вы сами понимаете это напоминает ощупывание слона вслепую. Т.к. этот запрос скорее всего не исчерпывает всех особенностей системы.
...
Рейтинг: 0 / 0
27.09.2017, 21:23
    #39527312
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Index для поля date is null
Маловато, но уже лучше. Хорошо бы еще знать кол-во записей в таблице, их прирост, распределение и т.д. Для вашего запроса есть хороший индекс idx_payments_z1. Если записей с одинаковыми receiverid, status_id и period и разным export_date меньше 1000, то об индексировании export_date даже задумываться не надо. Рекомендую ознакомиться с командами set explain to ..., set explain on (перед запросом) и set explain off (после запроса). Они покажут вам, как сервер оценивает (и собирается выполнять) ваш запрос. Еще рекомендую посмотреть команду update statistics - прочищает мозги серверу. У вас очень много индексов, если таблица будет большой, то может начать тормозить добавление записей.
...
Рейтинг: 0 / 0
01.10.2017, 10:55
    #39528952
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Index для поля date is null
авторкол-во записей в таблице
~ 2 000 000 записей (постоянно увеличивается)
Результат запроса ~5 000 записей
...
Рейтинг: 0 / 0
04.10.2017, 06:18
    #39530556
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Index для поля date is null
1. Какая разница в количестве записей с дейт из нал и с дейт из нот нал?
2. Для эксперимента создайте индекс как з1 и добавьте к нему поле с датой. После обновления статистики посмотрите в эксплейне, какой из двух индексов используется. Возможно, вместо з1 и вас останется новый индекс.
3. Ваше приложение точно вызывает запрос, вставляя константы? Не используются параметры, на которые оптимизатор может реагировать совсем по другому?
4. Сделайте тестовую таблицу и сравните скорость вставки и обновления данных с индексом и без.
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Index для поля date is null / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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