powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Неиндексное чтение
19 сообщений из 19, страница 1 из 1
Неиндексное чтение
    #35657089
User44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Adaptive Server Enterprise 12.5.2

Есть большая таблица, миллионы записей
в ней есть ID и дата записи
и по ID и дате есть индексы
требуется найти максимальный ID, где дата записи меньше определённой даты

Код: plaintext
1.
2.
select @maxID = max(ID)
from Table1
where DateID < @Date

Выполняется очень медленно, неиндексное чтение
Как можно ускорить процесс?
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35657163
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
User44Adaptive Server Enterprise 12.5.2

Есть большая таблица, миллионы записей
в ней есть ID и дата записи
и по ID и дате есть индексы
требуется найти максимальный ID, где дата записи меньше определённой даты

Код: plaintext
1.
2.
select @maxID = max(ID)
from Table1
where DateID < @Date

Выполняется очень медленно, неиндексное чтение
Как можно ускорить процесс?

поставьте хинт

Код: plaintext
1.
2.
select @maxID = max(ID)
from Table1 (index index_date)
where DateID < @Date

А так план смотреть надо!
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35657166
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажите, плз, результат этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
exec sp_help appl_user
go
set showplan on
go
dbcc traceon( 3604 , 302 )
go
declare @Date datetime
select @Date=...
select max(ID)
from Table1
where DateID < @Date
go
dbcc traceoff( 3604 , 302 )
go
set showplan off
go
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35657210
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
User44 пишет:

А сколько примерно записей у вас вернёт запрос :

select count(*) from Table1 where DateID < @Date

(можно не выполнять, а сказать примерно, можно
в процентах от объёма таблицы).

Кроме того, ДВА ОТДЕЛЬНЫХ индекса тут не очень помогут.
Подошёл бы один составной, типа

create index date_id on Table1 (date ASC, id DESC)

Но насколько он нужен для других запросов - вам виднее.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35657310
User44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komradпокажите, плз, результат этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
exec sp_help appl_user
go
set showplan on
go
dbcc traceon( 3604 , 302 )
go
declare @Date datetime
select @Date=...
select max(ID)
from Table1
where DateID < @Date
go
dbcc traceoff( 3604 , 302 )
go
set showplan off
go

Запустил, вот:
Код: 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.
QUERY PLAN FOR STATEMENT  1  (at line  1 ). 




    STEP  1  
        The type of query is DBCC. 


DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role. 




******************************* 
Beginning selection of qualifying indexes for table 'Table1', 
varno =  0 , objectid  1068530840 . 
   The table (Datarows) has  246068455  rows,  12605623  pages, 
   The table's Data Page Cluster Ratio 0.999990 
   The table has 4 partitions. 
   The largest partition has 4162181 pages. 
   The partition skew is 1.301858. 


Table scan cost is 246068455 rows, 12788432 pages, 
   using no data prefetch (size 2K I/O), 
   in data cache 'default data cache' (cacheid 0) with MRU replacement 




Selecting best index for the SEARCH CLAUSE: 
	Table1.DateID < unknown-value 


SARG is a local variable or the result of a function or an expression, 
using the default range selectivity to estimate selectivity. 


Estimated selectivity for DateID, 
   selectivity = 0.330000. 


Estimating selectivity of index 'DateID_FK', indid 5 
   scan selectivity 0.330000, filter selectivity 0.330000  
   81202590 rows, 4443950 pages, index height 5, 
   Data Row Cluster Ratio 0.999990, 
   Index Page Cluster Ratio 0.624928, 
   Data Page Cluster Ratio 0.000486 




The best qualifying  index is 'PK_Table1' (indid 2) 
   costing 6 pages, 
   with an estimate of 3 rows to be returned per scan of the table, 
   using no index prefetch (size 2K I/O) on leaf pages, 
   in index cache 'default data cache' (cacheid 0) with LRU replacement 
   using no data prefetch (size 2K I/O), 
   in data cache 'default data cache' (cacheid  0 ) with LRU replacement 
Search argument selectivity is  0 . 000000 . 


******************************* 


QUERY PLAN FOR STATEMENT  1  (at line  1 ). 




    STEP  1  
        The type of query is DECLARE. 




QUERY PLAN FOR STATEMENT  2  (at line  2 ). 




    STEP  1  
        The type of query is SELECT. 




QUERY PLAN FOR STATEMENT  3  (at line  3 ). 




    STEP  1  
        The type of query is SELECT. 
        Evaluate Ungrouped MAXIMUM AGGREGATE. 


        FROM TABLE 
            Table1 
        Nested iteration. 
        Using Clustered Index. 
        Index : PK_Table1 
        Backward scan. 
        Positioning at index end. 
        Scanning only up to the first qualifying row. 
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35657327
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще вот это:

Код: plaintext
sp_help Table1
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35657348
konstantines
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
User44Adaptive Server Enterprise 12.5.2

Есть большая таблица, миллионы записей
в ней есть ID и дата записи
и по ID и дате есть индексы
требуется найти максимальный ID, где дата записи меньше определённой даты

Код: plaintext
1.
2.
select @maxID = max(ID)
from Table1
where DateID < @Date

Выполняется очень медленно, неиндексное чтение
Как можно ускорить процесс?

Насколько я помню ASE, будет как-то так

set rowcount 1;
select @maxID = ID
from Table1
where DateID<@Date
order by DateID desc;
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35657376
konstantines
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
konstantinesUser44Adaptive Server Enterprise 12.5.2

Есть большая таблица, миллионы записей
в ней есть ID и дата записи
и по ID и дате есть индексы
требуется найти максимальный ID, где дата записи меньше определённой даты

Код: plaintext
1.
2.
select @maxID = max(ID)
from Table1
where DateID < @Date

Выполняется очень медленно, неиндексное чтение
Как можно ускорить процесс?

Насколько я помню ASE, будет как-то так

set rowcount 1;
select @maxID = ID
from Table1
where DateID<@Date
order by DateID desc;

Пардон, обманул :)
order by id desc;
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35657397
User44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
konstantines
Пардон, обманул :)
order by id desc;
Одинаково бесполезно
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35657466
User44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот так получилось намнооого быстрее :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @DateID datetime

select @DateID = max(DateID)
from Table1 (index DateID_FK)
where DateID < @Date

select @maxID = max(ID)
from Table1 (index DateID_FK)
where DateID = @DateID

Всем спасибо!
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35657496
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
либо так, либо статистику обновить, либо индексы перестроить...
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35658687
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad пишет:

> declare @Date datetime
> select @Date=...
> select max(ID)
> from Table1
> where DateID < @Date

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

Так вот надо :

select max(ID) from Table1 where DateID < '20080701'

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35658693
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
User44 пишет:

> declare @DateID datetime
>
> select @DateID = max(DateID)
> from Table1 (index DateID_FK)
> where DateID < @Date
>
> select @maxID = max(ID)
> from Table1 (index DateID_FK)
> where DateID = @DateID

Да не в этом дело, а в том, чтобы заставить оптимизатор использовать
индекс.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35658759
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу ошибаться, так как азешку давненько ковырял. У нее ведь планы формируются на этапе компиляции запроса и являются статичными? Поэтому она и не может учитывать значение вычисленной переменной в плане завпроса. Итого остается либо хинтовать, либо исполнять динамически.
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35658839
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
komrad пишет:

> declare @Date datetime
> select @Date=...
> select max(ID)
> from Table1
> where DateID < @Date

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

Так вот надо :

select max(ID) from Table1 where DateID < '20080701'


это я оставил на сообразительность автора...
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35659255
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_old пишет:
> Могу ошибаться, так как азешку давненько ковырял. У нее ведь планы
> формируются на этапе компиляции запроса и являются статичными?
Поэтому
> она и не может учитывать значение вычисленной переменной в плане
> завпроса. Итого остается либо хинтовать, либо исполнять динамически.

да.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35659823
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это кстати один из фактров, почему ASE проигрывает на корпоративном секторе.
Даже, вроде-бы более легковесная аса и та, все вопросы обрабатывет динамически и учитывает вычисленные выражения.

Why CORBA is DEAD?
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35661590
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_old пишет:

> Это кстати один из фактров, почему ASE проигрывает на корпоративном секторе.
> Даже, вроде-бы более легковесная аса и та, все вопросы обрабатывет
> динамически и учитывает вычисленные выражения.

Это далеко не так. Не только ASE так ведёт себя со значениями и оптимизацией.
То же наблюдается и в Oracle, и в MSSQL, и думаю во многих других СУБД.
И, в общем-то, это -- не самая большая проблема.

ASE ничего не проигрывает ни на каком корпоративном секторе,
она вполне себе тягаться может с любой СУБД enterprise-класса.
Просто она меньше распространена, причём это и причина, и следствие
одновременно, и вырваться из этого порочного круга сложно.
И опять-таки не только Sybase ASE.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Неиндексное чтение
    #35661789
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
User44А вот так получилось намнооого быстрее :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @DateID datetime

select @DateID = max(DateID)
from Table1 (index DateID_FK)
where DateID < @Date

select @maxID = max(ID)
from Table1 (index DateID_FK)
where DateID = @DateID

Всем спасибо!

В общем случае этот код может давать неверный результат, так как ID на максимальную дату не обязательно максимален на всем диапозоне дат до даты @Date. Только если вы об этом знаете заранее. Но это знание может в какой-то момент подвести, так что я бы не рекомендовал так делать.

Если же вам надо получить максимальный ID от даты максимально близкой к @date, тогда исходный код в первом посте неверен.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Неиндексное чтение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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