powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неравенство в условии и индекс
25 сообщений из 25, страница 1 из 1
Неравенство в условии и индекс
    #38582724
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FB 2.5.3. Подскажите, граждане.
Запрос 1:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT
    T.ID
FROM
    IBE$LOG_TABLES T
WHERE
    T.ID = 1


Код: plaintext
1.
План
PLAN (T INDEX (RDB$PRIMARY1))

Запрос 2:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT
    T.ID
FROM
    IBE$LOG_TABLES T
WHERE
    T.ID <> 1


Код: plaintext
1.
План
PLAN (T NATURAL)

С каких пор неравенство не использует индекс? Или это хитрый выкрутас оптимизатора?
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38582730
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax,

если индекс уникальный, то его просто не выгодно использовать, т.к. все кроме одного значения будут выбраны.
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38582739
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMaxС каких пор неравенство не использует индекс?
строгое неравенство никогда не использовало индекс. Ни в одной СУБД, насколько я в курсе. Теоретически тут возможен полный индексный скан, но фуллскан таблицы будет быстрее.
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38582746
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для неуникального ровно та же ситуация.
Единственный случай, когда индекс имеет смысл использовать, это в случае выполнения двух условий:
- большинство записей в таблице ID = 1
- индекс имеет гистограмму значений, чтобы это определить
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38582763
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эвон как. Буду знать.
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38583440
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryЕдинственный случай, когда индекс имеет смысл использовать, это в случае выполнения двух условий:
- большинство записей в таблице ID = 1
- индекс имеет гистограмму значений, чтобы это определитьЕсть подозрение, что сканирование индекса начинает выигрывать у фулл-скана, когда надо выбрать уже 97% (девяносто семь процентов) записей, ну и тем паче - когда меньше этого порога.
иллюстрация: 10 млн записей, селективность = 0.001, равномерное распределение int-значений
Код: plaintext
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.
SQL> show database;
Database: localhost/3333:/var/db/fb30/scantest.fdb
        Owner: SYSDBA
PAGE_SIZE  16384
 Number of DB pages allocated = 36674
Sweep interval = 20000
Forced Writes are OFF
Transaction - oldest = 16
Transaction - oldest active = 17
Transaction - oldest snapshot = 17
Transaction - Next = 20
ODS = 12.0
Default Character set: NONE

SQL> create table t(x int);
SQL> create index t_x on t(x);
SQL> commit;
SQL> set term ^;
SQL> execute block as
CON> declare n int = 10000000;
CON> begin
CON> while(n>0) do insert into t values( rand()* 1000 ) returning :n-1 into n;
CON> end^ set term ;^ 
SQL> commit;
SQL> set statistics index t_x;
SQL> commit;
SQL> set list on;
SQL> select * from rdb$indices where rdb$index_name='T_X';

RDB$INDEX_NAME                  T_X                                                                           
RDB$RELATION_NAME               T                                                                             
<. . .>
RDB$STATISTICS                  0.0009990009712055326

Test:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SQL> select count(*) from t where x+0<475 or x+0>500;

COUNT                           9739278

SQL> select count(*) from t where x<475 or x>500;

COUNT                           9739278

Trace:
Код: plaintext
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.
2014-03-11T23:15:38.0690 (2796:0x7f7414132b00) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest.fdb (ATT_13, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:22314
                (TRA_22, CONCURRENCY | WAIT | READ_WRITE)

Statement 60:
-------------------------------------------------------------------------------
select count(*) from t where x+0<475 or x+0>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 PLAN (T NATURAL) 
1 records fetched
    8516 ms, 20061173 fetch(es) 

Table                             Natural     Index    Update    Insert    Delete
e
*********************************************************************************
*
T                                10000000                                        

2014-03-11T23:16:23.2670 (2796:0x7f7414132b00) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest.fdb (ATT_13, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:22314
                (TRA_22, CONCURRENCY | WAIT | READ_WRITE)

Statement 61:
-------------------------------------------------------------------------------
select count(*) from t where x<475 or x>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 PLAN (T INDEX (T_X, T_X)) 
1 records fetched
    8291 ms, 19484294 fetch(es) 

Table                             Natural     Index    Update    Insert    Delete 
e
**********************************************************************************
*
T                                           9739278                               
PS. LI-T3.0.0.30889
Похожий результат, только с uuid_to_char-значениями, был показан тут , на FB 2.5 RC2.
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38583450
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЕсть подозрение
есть подозрение, что людей долбит склероз, или иная болезнь. Чтобы CyberMax "не знал", что field <> value не использует индекс - это какой то пендец.
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38583542
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

а если на сборке с экстентами проверить?
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38583669
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

вывод gstat покажи
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38583769
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrgstat покажи
Код: plaintext
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.
Database "/var/db/fb30/scantest.fdb"
Database header page information:
        Flags                   0
        Generation              30
        System Change Number    0
        Page size               16384
        ODS version             12.0
        Oldest transaction      21
        Oldest active           22
        Oldest snapshot         22
        Next transaction        25
        Sequence number         0
        Next attachment ID      14
        Implementation          HW=AMD/Intel/x64 little-endian OS=Linux CC=gcc
        Shadow count            0
        Page buffers            0
        Next header page        0
        Database dialect        3
        Creation date           Mar 11, 2014 22:13:14
        Attributes

    Variable header data:
        *END*


Database file sequence:
File /var/db/fb30/scantest.fdb is the only file

Analyzing database pages ...
T (128)
    Primary pointer page: 155, Index root page: 156
    Total formats: 1, used formats: 1
    Average record length: 9.00, total records: 10000000
    Average version length: 0.00, total versions: 0, max versions: 0
    Average fragment length: 0.00, total fragments: 0, max fragments: 0
    Average unpacked length: 8.00, compression ratio: 0.89
    Pointer pages: 9, data page slots: 30582
    Data pages: 30582, average fill: 52%
    Primary pages: 30582, full pages: 30581, swept pages: 0
    Fill distribution:
         0 - 19% = 1
        20 - 39% = 0
        40 - 59% = 30581
        60 - 79% = 0
        80 - 99% = 0

    Index T_X (0)
        Root page: 17150, depth: 3, leaf buckets: 5879, nodes: 10000000
        Average node length: 4.98, total dup: 9998999, max dup: 10348
        Average key length: 2.00, compression ratio: 1.44
        Average prefix length: 2.89, average data length: 0.00
        Clustering factor: 8535696, ratio: 0.85
        Fill distribution:
             0 - 19% = 0
            20 - 39% = 0
            40 - 59% = 5441
            60 - 79% = 284
            80 - 99% = 154
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38583822
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениса если на сборке с экстентами проверить?то же самое.
Код: plaintext
1.
2.
3.
4.
5.
SQL> out /dev/null;
SQL> select count(*) from t where x+0<475 or x+0>500; -- 1a
SQL> select count(*) from t where x+0<475 or x+0>500; -- 1b
SQL> select count(*) from t where x<475 or x>500; -- 2a
SQL> select count(*) from t where x<475 or x>500; -- 2b
Trace 1a, 1b:
Код: plaintext
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.
2014-03-12T12:13:48.0520 (2759:0x7fb5b214c920) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest_ext.fdb (ATT_11, SYSDBA:NONE, NONE, TCPv4:127.0.0.1
        /opt/fb30/bin/isql:4793
                (TRA_21, CONCURRENCY | WAIT | READ_WRITE)

Statement 53:
-------------------------------------------------------------------------------
select count(*) from t where x+0<475 or x+0>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T NATURAL)
1 records fetched
    8563 ms, 20061174 fetch(es) 

Table                             Natural     Index    Update    Insert    Delete
*********************************************************************************
T                                10000000       

2014-03-12T12:14:36.0430 (2759:0x7fb5b214c920) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest_ext.fdb (ATT_11, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30/bin/isql:4793
                (TRA_21, CONCURRENCY | WAIT | READ_WRITE)

Statement 54:
-------------------------------------------------------------------------------
select count(*) from t where x+0<475 or x+0>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T NATURAL)
1 records fetched
    8560 ms, 20061174 fetch(es) 

Table                             Natural     Index    Update    Insert    Delete 
**********************************************************************************
T                                10000000
Trace 2a, 2b:
Код: plaintext
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.
2014-03-12T12:15:27.1740 (2759:0x7fb5b214c920) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest_ext.fdb (ATT_11, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30/bin/isql:4793
                (TRA_21, CONCURRENCY | WAIT | READ_WRITE)

Statement 55:
-------------------------------------------------------------------------------
select count(*) from t where x<475 or x>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T INDEX (T_X, T_X))
1 records fetched
    8168 ms, 19485910 fetch(es) 

Table                             Natural     Index    Update    Insert    Delete 
**********************************************************************************
T                                           9740089

2014-03-12T12:16:00.3710 (2759:0x7fb5b214c920) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest_ext.fdb (ATT_11, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30/bin/isql:4793
                (TRA_21, CONCURRENCY | WAIT | READ_WRITE)

Statement 56:
-------------------------------------------------------------------------------
select count(*) from t where x<475 or x>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T INDEX (T_X, T_X))
1 records fetched
    8160 ms, 19485910 fetch(es) 

Table                             Natural     Index    Update    Insert    Delete 
**********************************************************************************
T                                           9740089


ЗЫ. show:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SQL> show version;
ISQL Version: LI-T3.0.0.30813 Firebird 3.0 Extents
Server version:
Firebird/Linux/AMD/Intel/x64 (access method), version "LI-T3.0.0.30813 Firebird 3.0  Extents "
Firebird/Linux/AMD/Intel/x64 (remote server), version "LI-T3.0.0.30813 Firebird 3.0 Extents/tcp (oel64)/P13"
Firebird/Linux/AMD/Intel/x64 (remote interface), version "LI-T3.0.0.30813 Firebird 3.0 Extents/tcp (oel64)/P13"
SQL> show database;
Database: localhost/3330:/var/db/fb30/scantest_ext.fdb
        Owner: SYSDBA
PAGE_SIZE 16384
Number of DB pages allocated = 36674
Sweep interval = 20000
Forced Writes are OFF
Transaction - oldest = 20
Transaction - oldest active = 21
Transaction - oldest snapshot = 21
Transaction - Next = 30
ODS = 12.0
Default Character set: NONE
gstat:
Код: plaintext
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.
Database "/var/db/fb30/scantest_ext.fdb"
Database header page information:
        Flags                   0
        Generation              35
        System Change Number    0
        Page size               16384
        ODS version             12.0
        Oldest transaction      20
        Oldest active           21
        Oldest snapshot         21
        Next transaction        30
        Sequence number         0
        Next attachment ID      12
        Implementation          HW=AMD/Intel/x64 little-endian OS=Linux CC=gcc
        Shadow count            0
        Page buffers            0
        Next header page        0
        Database dialect        3
        Creation date           Mar 12, 2014 11:47:48
        Attributes

    Variable header data:
        *END*


Database file sequence:
File /var/db/fb30/scantest_ext.fdb is the only file

Analyzing database pages ...
T (128)
    Primary pointer page: 155, Index root page: 156
    Total formats: 1, used formats: 1
    Average record length: 9.00, total records: 10000000
    Average version length: 0.00, total versions: 0, max versions: 0
    Average fragment length: 0.00, total fragments: 0, max fragments: 0
    Average unpacked length: 8.00, compression ratio: 0.89
    Pointer pages: 10, data page slots: 30584
    Data pages: 30584, average fill: 52%
    Primary pages: 30584, secondary pages: 0, swept pages: 0
    Empty pages: 2, full pages: 30581
    Fill distribution:
         0 - 19% = 3
        20 - 39% = 0
        40 - 59% = 30581
        60 - 79% = 0
        80 - 99% = 0

    Index T_X (0)
        Root page: 17150, depth: 3, leaf buckets: 5869, nodes: 10000000
        Average node length: 4.98, total dup: 9998999, max dup: 10314
        Average key length: 2.00, compression ratio: 1.44
        Average prefix length: 2.89, average data length: 0.00
        Clustering factor: 8534059, ratio: 0.85
        Fill distribution:
             0 - 19% = 2
            20 - 39% = 0
            40 - 59% = 5397
            60 - 79% = 284
            80 - 99% = 186
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38583841
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS. статистика natural-скана из isql, для сборки с extent'ами =vs= без экстентов, вторые запуски по каждой (дабы исключить вариант "разогревания" базы и reads >0):
LI-T3.0.0.30813 Firebird 3.0 Extents
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> select count(*) from t where x+0<475 or x+0>500;

                COUNT
=====================
              9740089

Current memory = 8893221080
Delta memory = 0
Max memory = 8893302408
Elapsed time= 8.54 sec
Cpu = 0.00 sec
Buffers = 524288
Reads = 0
Writes = 0
Fetches = 20061175

LI-T3.0.0.30889 Firebird 3.0 Alpha 2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> select count(*) from t where x+0<475 or x+0>500;

                COUNT
=====================
              9739278

Current memory = 8894437392
Delta memory = 0
Max memory = 8898071392
Elapsed time= 8.503 sec
Cpu = 0.000 sec
Buffers = 524288
Reads = 0
Writes = 0
Fetches = 20061192

Если экстенты как-то и влияют на скорость выборки, то в упор не вижу здесь, как именно.

Изменённые параметры конфигов:
LI-T3.0.0.30813 Firebird 3.0 Extents :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
AuthClient = Legacy_Auth,Srp,Win_Sspi
AuthServer = Legacy_Auth,Srp
BugcheckAbort = 1
DefaultDbCachePages = 512K
ExternalFileAccess = Restrict /var/db/fb30
FileSystemCacheThreshold = 1024K
LockHashSlots = 20063
LockMemSize = 10M
RemoteServicePort = 3330
TempBlockSize = 100M
TempCacheLimit = 1024M
TempDirectories = /dev/shm;/tmp
UserManager = Legacy_UserManager
WireCrypt = Disabled
LI-T3.0.0.30889 Firebird 3.0 Alpha 2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
AuthClient = Legacy_Auth,Srp,Win_Sspi
AuthServer = Legacy_Auth,Srp
BugcheckAbort = 1
DefaultDbCachePages = 512K
ExternalFileAccess = Restrict /var/db/fb30
FileSystemCacheThreshold = 65536K
MaxUserTraceLogSize = 99999
RemoteServicePort = 3333
TempBlockSize = 100M
TempCacheLimit = 1024M
TempDirectories = /dev/shm;/tmp
UserManager = Legacy_UserManager
WireCrypt = Disabled
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38584111
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЕсть подозрение, что сканирование индекса начинает выигрывать у фулл-скана, когда надо выбрать уже 97% (девяносто семь процентов) записей
т.е. чтение 35000 страниц быстрее, чем чтение 30000 страниц? Чудно как-то.
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38584203
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrЧудно как-то.и тем не менее, это так. И при page_size = 4096 - то же.
isql
Код: plaintext
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.
102.
103.
104.
SQL> show database;
Database: localhost/3333:/var/db/fb30/scantest_04k.fdb
        Owner: SYSDBA
 PAGE_SIZE 4096 
Number of DB pages allocated =  145344 
Sweep interval = 20000
Forced Writes are OFF
Transaction - oldest = 16
Transaction - oldest active = 17
Transaction - oldest snapshot = 17
Transaction - Next = 20
ODS = 12.0
Default Character set: NONE
SQL> set stat on;

 ---------------------  N A T U R A L   --------------------- 

SQL> select count(*) from t where x+0<475 or x+0>500;

COUNT                           9739692


Current memory = 2462980144
Delta memory = 0
Max memory = 2468029864
Elapsed time= 8.637 sec
Cpu = 0.000 sec
Buffers = 524288
Reads = 0
Writes = 0
Fetches = 20247189
SQL> select count(*) from t where x+0<475 or x+0>500;

COUNT                           9739692


Current memory = 2462980144
Delta memory = 0
Max memory = 2468029864
Elapsed time= 8.637 sec
Cpu = 0.000 sec
Buffers = 524288
Reads = 0
Writes = 0
Fetches = 20247189
SQL> select count(*) from t where x+0<475 or x+0>500;

COUNT                           9739692


Current memory = 2462980144
Delta memory = 0
Max memory = 2468029864
Elapsed time= 8.640 sec
Cpu = 0.000 sec
Buffers = 524288
Reads = 0
Writes = 0
Fetches = 20247189

 ---------------------  I N D E X   --------------------- 

SQL> select count(*) from t where x<475 or x>500;

COUNT                           9739692


Current memory = 2469704776
Delta memory = 6724632
Max memory = 2469705008
Elapsed time= 8.473 sec
Cpu = 0.000 sec
Buffers = 524288
Reads = 0
Writes = 0
Fetches = 19500272
SQL> select count(*) from t where x<475 or x>500;

COUNT                           9739692


Current memory = 2469704776
Delta memory = 0
Max memory = 2469705008
Elapsed time= 8.489 sec
Cpu = 0.000 sec
Buffers = 524288
Reads = 0
Writes = 0
Fetches = 19500272
SQL> select count(*) from t where x<475 or x>500;

COUNT                           9739692


Current memory = 2469704776
Delta memory = 0
Max memory = 2469705008
Elapsed time= 8.479 sec
Cpu = 0.000 sec
Buffers = 524288
Reads = 0
Writes = 0
Fetches = 19500272
trace
Код: plaintext
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.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
2014-03-12T16:01:13.7930 (2796:0x7f741409f088) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest_04k.fdb (ATT_8, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:9789
                (TRA_17, CONCURRENCY | WAIT | READ_WRITE)

Statement 83:
-------------------------------------------------------------------------------
select count(*) from t where x+0<475 or x+0>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T NATURAL)
1 records fetched
   8635 ms, 20247051 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
T                                10000000

2014-03-12T16:01:40.8280 (2796:0x7f741409f088) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest_04k.fdb (ATT_8, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:9789
                (TRA_17, CONCURRENCY | WAIT | READ_WRITE)

Statement 87:
-------------------------------------------------------------------------------
select count(*) from t where x+0<475 or x+0>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T NATURAL)
1 records fetched
   8636 ms, 20247051 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
T                                10000000


2014-03-12T16:01:50.6150 (2796:0x7f741409f088) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest_04k.fdb (ATT_8, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:9789
                (TRA_17, CONCURRENCY | WAIT | READ_WRITE)

Statement 88:
-------------------------------------------------------------------------------
select count(*) from t where x+0<475 or x+0>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T NATURAL)
1 records fetched
   8635 ms, 20247051 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
T                                10000000


2014-03-12T16:02:02.3080 (2796:0x7f741409f088) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest_04k.fdb (ATT_8, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:9789
                (TRA_17, CONCURRENCY | WAIT | READ_WRITE)

Statement 89:
-------------------------------------------------------------------------------
select count(*) from t where x+0<475 or x+0>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T NATURAL)
1 records fetched
   8637 ms, 20247051 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
T                                10000000

2014-03-12T16:02:24.8990 (2796:0x7f741409f088) PREPARE_STATEMENT
        /var/db/fb30/scantest_04k.fdb (ATT_8, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:9789
                (TRA_18, READ_COMMITTED | NO_REC_VERSION | WAIT | READ_WRITE)

Statement 90:
-------------------------------------------------------------------------------
select count(*) from t where x<475 or x>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T INDEX (T_X, T_X))
      0 ms

2014-03-12T16:02:33.3710 (2796:0x7f741409f088) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest_04k.fdb (ATT_8, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:9789
                (TRA_17, CONCURRENCY | WAIT | READ_WRITE)

Statement 90:
-------------------------------------------------------------------------------
select count(*) from t where x<475 or x>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T INDEX (T_X, T_X))
1 records fetched
   8471 ms, 19500126 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
T                                           9739692

2014-03-12T16:02:44.9290 (2796:0x7f741409f088) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest_04k.fdb (ATT_8, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:9789
                (TRA_17, CONCURRENCY | WAIT | READ_WRITE)

Statement 91:
-------------------------------------------------------------------------------
select count(*) from t where x<475 or x>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T INDEX (T_X, T_X))
1 records fetched
   8486 ms, 19500126 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
T                                           9739692


2014-03-12T16:02:58.4420 (2796:0x7f741409f088) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest_04k.fdb (ATT_8, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:9789
                (TRA_17, CONCURRENCY | WAIT | READ_WRITE)

Statement 92:
-------------------------------------------------------------------------------
select count(*) from t where x<475 or x>500
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T INDEX (T_X, T_X))
1 records fetched
   8476 ms, 19500126 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
T                                           9739692
gstat -r:
Код: plaintext
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.
Database "/var/db/fb30/scantest_04k.fdb"
Database header page information:
        Flags                   0
        Generation              25
        System Change Number    0
        Page size               4096
        ODS version             12.0
        Oldest transaction      16
        Oldest active           17
        Oldest snapshot         17
        Next transaction        20
        Sequence number         0
        Next attachment ID      9
        Implementation          HW=AMD/Intel/x64 little-endian OS=Linux CC=gcc
        Shadow count            0
        Page buffers            0
        Next header page        0
        Database dialect        3
        Creation date           Mar 12, 2014 15:56:03
        Attributes

    Variable header data:
        *END*


Database file sequence:
File /var/db/fb30/scantest_04k.fdb is the only file

Analyzing database pages ...
T (128)
    Primary pointer page: 200, Index root page: 201
    Total formats: 1, used formats: 1
    Average record length: 9.00, total records: 10000000
    Average version length: 0.00, total versions: 0, max versions: 0
    Average fragment length: 0.00, total fragments: 0, max fragments: 0
    Average unpacked length: 8.00, compression ratio: 0.89
    Pointer pages: 137, data page slots: 123457
    Data pages: 123457, average fill: 52%
    Primary pages: 123457, full pages:  123456 , swept pages: 0
    Fill distribution:
         0 - 19% = 0
        20 - 39% = 0
        40 - 59% = 123457
        60 - 79% = 0
        80 - 99% = 0

    Index T_X (0)
        Root page: 4779, depth: 3, leaf buckets: 21268, nodes: 10000000
        Average node length: 4.99, total dup: 9998999, max dup: 10296
        Average key length: 2.01, compression ratio: 1.44
        Average prefix length: 2.88, average data length: 0.01
        Clustering factor: 9609705, ratio: 0.96
        Fill distribution:
             0 - 19% = 4
            20 - 39% = 4
            40 - 59% = 20428
            60 - 79% = 314
            80 - 99% = 518
123456 страниц при просмотре только таблицы =vs= 123456 + 4 + 4 +20428 +314 +518 = 144724 страницы при индексном сканировании.
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38584258
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще подумалось (вдруг), что это при большом кеше такое. Вернул кеш в дефолтный, но всё так и осталось:
Код: plaintext
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.
SQL> set stat on;
SQL> set list on; --select count(*) from t where x+0<475 or x+0>500;

SQL> -------------------- natural --------------------

SQL> select count(*) from t where x+0<475 or x+0>500;

COUNT                           9739692


Current memory = 10802616
Delta memory = 503528
Max memory = 10871656
Elapsed time= 8.940 sec
Cpu = 0.000 sec
Buffers = 2048
Reads = 123754
Writes = 0
Fetches = 20247373
SQL> select count(*) from t where x+0<475 or x+0>500;

COUNT                           9739692


Current memory = 10802616
Delta memory = 0
Max memory = 10871656
Elapsed time= 8.937 sec
Cpu = 0.000 sec
Buffers = 2048
Reads = 123726
Writes = 0
Fetches = 20247189
SQL> select count(*) from t where x+0<475 or x+0>500;

COUNT                           9739692


Current memory = 10802616
Delta memory = 0
Max memory = 10871656
Elapsed time= 8.938 sec
Cpu = 0.000 sec
Buffers = 2048
Reads = 123726
Writes = 0
Fetches = 20247189

SQL> --------------------- index -------------

SQL> select count(*) from t where x<475 or x>500;

COUNT                           9739692


Current memory = 17544064
Delta memory = 6741448
Max memory = 17544296
Elapsed time= 8.755 sec
Cpu = 0.000 sec
Buffers = 2048
Reads = 144474
Writes = 0
Fetches = 19500274
SQL> select count(*) from t where x<475 or x>500;

COUNT                           9739692


Current memory = 17544064
Delta memory = 0
Max memory = 17544296
Elapsed time= 8.736 sec
Cpu = 0.000 sec
Buffers = 2048
Reads = 144474
Writes = 0
Fetches = 19500272
SQL> select count(*) from t where x<475 or x>500;

COUNT                           9739692


Current memory = 17544064
Delta memory = 0
Max memory = 17544296
Elapsed time= 8.736 sec
Cpu = 0.000 sec
Buffers = 2048
Reads = 144474
Writes = 0
Fetches = 19500272
SQL> commit;

А затем подумкалось, что это из-за вычисления выражения ("x+0") могло быть.
Добавил поле y int, заполнил его значениями из поля `x`. Повторил запросы - всё тоже самое, кроме ПЕРВОГО запроса:
Код: plaintext
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.
SQL> set stat off; alter table t add y int;
SQL> commit;
SQL> update t set y=x; commit;

 -- NB: этот запрос длился 2.5 минуты и собирал какой-то мусор! 
SQL> set stat on;
SQL> select count(*) from t where y<475 or y>500;

COUNT                           9739692


Current memory = 12191656
Delta memory = 98096
Max memory = 17544296
 Elapsed time= 161.945 sec
 Cpu = 0.000 sec
Buffers = 2048
Reads = 166456
 Writes = 164352 
Fetches = 123607568

-------------------------------------

SQL> select count(*) from t where y<475 or y>500;

COUNT                           9739692


Current memory = 12175248
Delta memory = 0
Max memory = 17544296
Elapsed time= 8.185 sec
Cpu = 0.000 sec
Buffers = 2048
Reads = 166403
Writes = 0
Fetches = 22958335
SQL> select count(*) from t where y<475 or y>500;

COUNT                           9739692


Current memory = 12175248
Delta memory = 0
Max memory = 17544296
Elapsed time= 8.187 sec
Cpu = 0.000 sec
Buffers = 2048
Reads = 166404
Writes = 0
Fetches = 22958335


Объясните, плз: что за мусор собирал первый запрос, который был сразу после начального апдейта поля `y` ? Если он удалял "старые" версии записей, в которых в поле `y` были NULL'ы, то... как ФБ мог так быстро записать эти 10 млн null'ов при alter table + commit, если трейс этого ДДЛ показывает вот это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
2014-03-12T16:30:34.1320 (10793:0x7fcdb14d2030) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/scantest_04k.fdb (ATT_14, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:10812
                (TRA_25, READ_COMMITTED | NO_REC_VERSION | WAIT | READ_WRITE)

-------------------------------------------------------------------------------
alter table t add y int
0 records fetched
      0 ms

2014-03-12T16:30:34.1340 (10793:0x7fcdb14d2030) COMMIT_TRANSACTION
        /var/db/fb30/scantest_04k.fdb (ATT_14, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:10812
                (TRA_25, READ_COMMITTED | NO_REC_VERSION | WAIT | READ_WRITE)
      1 ms, 16 read(s), 19 write(s), 96 fetch(es), 8 mark(s)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
RDB$FIELDS                                        2
RDB$INDICES                                       1
RDB$RELATION_FIELDS                               2         1
RDB$RELATIONS                                     1         1
RDB$SECURITY_CLASSES                                                  1
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38584280
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидкак ФБ мог так быстро записать эти 10 млн null'ов при alter table + commit

он их не добавлял. Просто добавил поле в заголовке таблицы и увеличил номер формата. При чтении потом просто старые записи преобразуются к новому формату на лету. Есть подозрения что при большом количестве форматов должно быть существенное замедление.
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38584289
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисувеличил номер формата. <...> при большом количестве форматов должно быть существенное замедление.что такое "номер формата" ? и как можно нагади достичь большего кол-ва форматов ?
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38584300
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

http://www.ibase.ru/devinfo/metaver.htm

достичь легко достаточно много раз сделать
Код: sql
1.
2.
ALTER TABLE ADD Y INT; 
ALTER TABLE DROP Y; 



количество таких модификаций ограничено числом 255. Неужели ты этого не знаешь?
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38584306
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисколичество таких модификаций ограничено числом 255

поправлюсь для каждой таблицы, потом только б/р
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38584340
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисколичество таких модификаций ограничено числом 255. Неужели ты этого не знаешь?не, это я знаю, конечно же (ИБЭ же заботливо показывает, что "NNN ... left" :)).
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38585845
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

В голове отложилось, что все операции сравнения используют индекс. А тут случайно наткнулся на неравенство и натуральный перебор в плане и как-то удивился. Кстати, про этот нюанс написано где-нибудь в твоих статьях?
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38586058
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax,

нет, не написано. мне казалось, это настолько очевидно и общеизвестно, что не требует упоминания. У меня этого нет даже в "курсовой" статье.
Это как "вот гравитация, вот дорога, вот машина, у нее внизу колеса, колеса крутятся". Поэтому вопроса, может ли машина ездить на крыше, не возникает :-)
Перечитай статью dimitr про методы доступа, про индексный поиск.
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38586260
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvвот гравитацияда, но хотелось бы еще и причины антигравитации узнать. А именно: почему индексный поиск начинает обгонять натурал при 97% выбранных записей (тесты см выше).
Проверь у себя - может, другие результаты будут ?
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38586501
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
позанубствую... неравенства вида
Код: sql
1.
where FIELD>:SOME_VALUE

Код: sql
1.
where FIELD<:SOME_VALUE

тоже не используют индекс по столбцу FIELD?
...
Рейтинг: 0 / 0
Неравенство в условии и индекс
    #38586514
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00chпозанубствую... неравенства вида
Код: sql
1.
where FIELD>:SOME_VALUE


Код: sql
1.
where FIELD<:SOME_VALUE


тоже не используют индекс по столбцу FIELD?Всем нынешним и будущим нечитателям посвящается ...
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неравенство в условии и индекс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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