powered by simpleCommunicator - 2.0.47     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помогите с запросом со временем
18 сообщений из 18, страница 1 из 1
Помогите с запросом со временем
    #39591544
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы не плодить темы - спрошу здесь.
Мне надо отобрать из таблицы записи, время создание которых больше 7 вечера текущего дня.
Собственно пробовал

Код: sql
1.
where CONVERT(DATE,поле_с_датой,104) = CONVERT(DATE,getdate(),104) and datepart(hour,поле_с_датой) >= 19 



- запрос выполняется по-моему вечно, останавливал после 10 минут выполнения.

P.S. Adaptive Server Enterprise 15.7
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39591575
GroMoZeKazzz,

применение функции к полю таблицы делает аргумент с её использование NON SARG, что препятствует использованию индекса по этому полю (даже если он есть). Нужно переписать условие запроса так, что бы предикат стал SARG-ом. Для этого нужно исходное поле таблицы, без каких-либо модификаций над ним, сравнивать с нужной тебе датой-временем (19 часов текущего дня)...

поле_с_датой >= <а тут нужно на основе GETDATE как-то собрать значение, соответствующее 19 часам текущего дня>
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39591582
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх... поле_с_датой >= <а тут нужно на основе GETDATE как-то собрать значение, соответствующее 19 часам текущего дня>
Ок, попробую собрать.
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39591873
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собрал конструкцию dateadd(hour, 12, convert(datetime, convert(date, getdate()))) - легче не стало. Тестирую на данных с 50 записями, отвечающими временному параметру - запрос выполняется уже 5 минут...
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39591950
Sergey Orlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А всегда так будет долго выполняться, вам надо процедурку писать, в которой сначала вычисляться значение даты и лишь затем делаться селект, в ASA я могу еще посоветовать сделать внешнюю процедуру в виде подключаемой библиотеки на вычисление условия, но не знаю можно это сотворить в ASE
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39592567
GroMoZeKazzz,

показывай структуру таблицы, схему индексирования, состав и распределение данных, количество строк в таблице, текст запроса и план его выполнения.
Без этой информации любые рекомендации будут из разряды "пальцем в небо"...
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39592731
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх, количество записей в таблице больше 400 миллионов, но этой таблице уже ооооочень много лет. Интересующих записей за день бывает не больше 20-30 штук.
Текст запроса:
Код: sql
1.
select * from pay p where p.DTran > dateadd(hour, 10, convert(datetime, convert(date, getdate())))


Код создания таблицы:
Код: 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.
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.
IF OBJECT_ID('Pay') IS NOT NULL
BEGIN
    DROP TABLE Pay
    IF OBJECT_ID('Pay') IS NOT NULL
        PRINT '<<< FAILED DROPPING TABLE Pay >>>'
    ELSE
        PRINT '<<< DROPPED TABLE Pay >>>'
END
go
CREATE TABLE dbo.Pay
(
  idTran           numeric(12)   IDENTITY,
  NDog            int           NULL,
  idBlank          numeric(12)   NULL,
  idTerminal       varchar(30)   NULL,
  Summa            numeric(18,2) DEFAULT  0 NULL,
  DTran        datetime      DEFAULT  getdate() NULL,
  DSum         datetime      NULL,
  DConfirm     datetime      DEFAULT  '1801-01-01' NULL,
  DExport      datetime      DEFAULT  '1801-01-01' NULL,
  idTran_Confirm   numeric(12)   NULL,
  NDog_Confirm    int           NULL,
  Summa_Confirm    numeric(18,2) NULL,
  IdStatus         int           NULL,
  Ref_number       numeric(12)   NULL,
  CONSTRAINT Pay_17628703662
    PRIMARY KEY NONCLUSTERED(idTran ASC)
    ON indseg
)
lock DataRows
with identity_gap=10000
go
IF OBJECT_ID('Pay') IS NOT NULL
    PRINT '<<< CREATED TABLE Pay >>>'
ELSE
    PRINT '<<< FAILED CREATING TABLE Pay >>>'
go
IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_idBlank')
BEGIN
    DROP INDEX Pay.Pay_idBlank
    IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_idBlank')
        PRINT '<<< FAILED DROPPING INDEX Pay.Pay_idBlank >>>'
    ELSE
        PRINT '<<< DROPPED INDEX Pay.Pay_idBlank >>>'
END
go
CREATE NONCLUSTERED INDEX Pay_idBlank
 ON Pay(idBlank ASC)
 ON indseg
go
IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_idBlank')
    PRINT '<<< CREATED INDEX Pay.Pay_idBlank >>>'
ELSE
    PRINT '<<< FAILED CREATING INDEX Pay.Pay_idBlank >>>'
go
IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_4Export')
BEGIN
    DROP INDEX Pay.Pay_4Export
    IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_4Export')
        PRINT '<<< FAILED DROPPING INDEX Pay.Pay_4Export >>>'
    ELSE
        PRINT '<<< DROPPED INDEX Pay.Pay_4Export >>>'
END
go
CREATE NONCLUSTERED INDEX Pay_4Export
 ON Pay(DExport ASC,DConfirm ASC)
 ON indseg
go
IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_4Export')
    PRINT '<<< CREATED INDEX Pay.Pay_4Export >>>'
ELSE
    PRINT '<<< FAILED CREATING INDEX Pay.Pay_4Export >>>'
go
IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_idTran_Confirm')
BEGIN
    DROP INDEX Pay.Pay_idTran_Confirm
    IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_idTran_Confirm')
        PRINT '<<< FAILED DROPPING INDEX Pay.Pay_idTran_Confirm >>>'
    ELSE
        PRINT '<<< DROPPED INDEX Pay.Pay_idTran_Confirm >>>'
END
go
CREATE NONCLUSTERED INDEX Pay_idTran_Confirm
 ON Pay(idTran_Confirm ASC)
 ON indseg
go
IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_idTran_Confirm')
    PRINT '<<< CREATED INDEX Pay.Pay_idTran_Confirm >>>'
ELSE
    PRINT '<<< FAILED CREATING INDEX Pay.Pay_idTran_Confirm >>>'
go
IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_idTran_IdStatus')
BEGIN
    DROP INDEX Pay.Pay_idTran_IdStatus
    IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_idTran_IdStatus')
        PRINT '<<< FAILED DROPPING INDEX Pay.Pay_idTran_IdStatus >>>'
    ELSE
        PRINT '<<< DROPPED INDEX Pay.Pay_idTran_IdStatus >>>'
END
go
CREATE NONCLUSTERED INDEX Pay_idTran_IdStatus
 ON Pay(idTran ASC,IdStatus ASC)
 ON indseg
go
IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_idTran_IdStatus')
    PRINT '<<< CREATED INDEX Pay.Pay_idTran_IdStatus >>>'
ELSE
    PRINT '<<< FAILED CREATING INDEX Pay.Pay_idTran_IdStatus >>>'
go
IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_Ref_num')
BEGIN
    DROP INDEX Pay.Pay_Ref_num
    IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_Ref_num')
        PRINT '<<< FAILED DROPPING INDEX Pay.Pay_Ref_num >>>'
    ELSE
        PRINT '<<< DROPPED INDEX Pay.Pay_Ref_num >>>'
END
go
CREATE NONCLUSTERED INDEX Pay_Ref_num
 ON Pay(Ref_number ASC)
 ON indseg
go
IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.Pay') AND name='Pay_Ref_num')
    PRINT '<<< CREATED INDEX Pay.Pay_Ref_num >>>'
ELSE
    PRINT '<<< FAILED CREATING INDEX Pay.Pay_Ref_num >>>'
go


Работаю с каким-то самописным клиентом для базы, он выдает вот такой план выполнения:
Print
|ROOT:EMIT Operator (VA = 2)
|
| |RESTRICT Operator (VA = 1)(11)(0)(0)(0)(0)
| |
| | |SCAN Operator (VA = 0)
| | | FROM TABLE
| | | pay
| | | p
| | | Table Scan.
| | | Forward Scan.
| | | Positioning at start of table.
| | | Using I/O Size 64 Kbytes for data pages.
| | | With MRU Buffer Replacement Strategy for data pages.
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39592734
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
29.01.2018 12:50, GroMoZeKazzz пишет:

> количество записей в таблице больше 400 миллионов

Солидно :).

> Код создания таблицы:

Нет бы вместо этой мусорки просто перечислить индексы. Кстати, индекса
по DTran я не увидел ;).

> |ROOT:EMIT Operator (VA = 2)
> |
> | |RESTRICT Operator (VA = 1)(11)(0)(0)(0)(0)
> | |
> | | |SCAN Operator (VA = 0)
> | | | FROM TABLE
> | | | pay
> | | | p
> | | | Table Scan.

Нет индекса, поэтому фуллскан всех 400 мегазаписей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39592752
Dim2000,

+1

Индекса по полю DTran нет - читай таблицу полностью... А на 400 млн. записей - это будет не быстро...
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39592814
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - ЭхDim2000,

+1

Индекса по полю DTran нет - читай таблицу полностью... А на 400 млн. записей - это будет не быстро...
Так я в запросе и DConfirm подставлял - на нем то индекс есть... И все так же бесконечно долго.
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39592836
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Потрясу хозяев ресурса - может повесят индекс :)
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39592844
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
29.01.2018 14:47, GroMoZeKazzz пишет:

> Так я в запросе и DConfirm подставлял - на нем то индекс есть... И все
> так же бесконечно долго.

Если ты имеешь в виду индекс

CREATE NONCLUSTERED INDEX Pay_4Export
ON Pay(DExport ASC,DConfirm ASC)

то его использовать для выборки _только_ по DConfirm нельзя - составной
индекс можно использовать для поиска только по его первым полям.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39592850
Sergey Orlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GroMoZeKazzzПотрясу хозяев ресурса - может повесят индекс :)
А вы не смотрели сколько времени идет запрос, в котором вместо вычисляемых значений будет константа?
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39592939
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Orlov, когда в параметрах запроса константа, то выполняется за приемлемое время.
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39592972
Sergey Orlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GroMoZeKazzzSergey Orlov, когда в параметрах запроса константа, то выполняется за приемлемое время.
Наличие индекса не поможет, у вас банально берется строка, из нее поле date, рассчитываются условие через вызовы функций convert, dateadd, getdate и после этого принимается решение включить ее в селект или нет, отсюда и идет фул скан таблицы. Поэтому я и предложил:
1. создания процедуры, в которой сначала высчитывается константа и лишь селект
либо
2. создать внешнюю процедуру на с, которая будет рассчитsвать константу гораздо быстрее нежели средствами ASE, пусть и для каждой строки

Давно было, по-моему тогда юэал asa5.5, я забирал данные из dbf в кодировке cp866, а база уже тогда была в cp1251, так сначала я конвертировал средствами sql-сревера. но на мой взгляд было очень долго, а после ее написания на с и оформления в виде dll, конвертация таблицы по времени стала как простой запрос...

А так есть индекс, нет индекса все по барабану...
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39593339
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey OrlovА всегда так будет долго выполняться, вам надо процедурку писать, в которой сначала вычисляться значение даты и лишь затем делаться селект, в ASA я могу еще посоветовать сделать внешнюю процедуру в виде подключаемой библиотеки на вычисление условия, но не знаю можно это сотворить в ASE

Нет, нельзя.
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39593475
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Orlov...Поэтому я и предложил:
1. создания процедуры, в которой сначала высчитывается константа и лишь селект
либо
2. создать внешнюю процедуру на с, которая будет рассчитsвать константу гораздо быстрее нежели средствами ASE, пусть и для каждой строки

Дяденька, я не настоящий сварщик (с) :)
Sybase подкрадывается ко мне редко, так что писать процедуру нет ни времени, не желания.
А с С так я вообще не знаком.

Всем +100 в карму за советы!
...
Рейтинг: 0 / 0
Помогите с запросом со временем
    #39628032
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторP.S. Adaptive Server Enterprise 15.7


select * from p ay p where p.DTran > dateadd(hour, 10, convert(datetime, convert(date, getdate())))

Код создания таблицы:
CREATE TABLE dbo. P ay
...............................................
Работаю с каким-то самописным клиентом для базы, он выдает вот такой план в
| | |SCAN Operator (VA = 0)
| | | FROM TABLE
| | | p ay



ASE всегда был Case Sensitive.
Декларится один объект а в селектах пользуется другой :(
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помогите с запросом со временем
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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