Гость
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помогите с запросом со временем / 18 сообщений из 18, страница 1 из 1
26.01.2018, 12:24
    #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
26.01.2018, 12:57
    #39591575
Помогите с запросом со временем
GroMoZeKazzz,

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

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

показывай структуру таблицы, схему индексирования, состав и распределение данных, количество строк в таблице, текст запроса и план его выполнения.
Без этой информации любые рекомендации будут из разряды "пальцем в небо"...
...
Рейтинг: 0 / 0
29.01.2018, 12:50
    #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
29.01.2018, 12:55
    #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
29.01.2018, 13:14
    #39592752
Помогите с запросом со временем
Dim2000,

+1

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

+1

Индекса по полю DTran нет - читай таблицу полностью... А на 400 млн. записей - это будет не быстро...
Так я в запросе и DConfirm подставлял - на нем то индекс есть... И все так же бесконечно долго.
...
Рейтинг: 0 / 0
29.01.2018, 15:31
    #39592836
GroMoZeKazzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом со временем
Потрясу хозяев ресурса - может повесят индекс :)
...
Рейтинг: 0 / 0
29.01.2018, 16:11
    #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
29.01.2018, 16:24
    #39592850
Sergey Orlov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом со временем
GroMoZeKazzzПотрясу хозяев ресурса - может повесят индекс :)
А вы не смотрели сколько времени идет запрос, в котором вместо вычисляемых значений будет константа?
...
Рейтинг: 0 / 0
29.01.2018, 18:41
    #39592939
GroMoZeKazzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом со временем
Sergey Orlov, когда в параметрах запроса константа, то выполняется за приемлемое время.
...
Рейтинг: 0 / 0
29.01.2018, 19:49
    #39592972
Sergey Orlov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом со временем
GroMoZeKazzzSergey Orlov, когда в параметрах запроса константа, то выполняется за приемлемое время.
Наличие индекса не поможет, у вас банально берется строка, из нее поле date, рассчитываются условие через вызовы функций convert, dateadd, getdate и после этого принимается решение включить ее в селект или нет, отсюда и идет фул скан таблицы. Поэтому я и предложил:
1. создания процедуры, в которой сначала высчитывается константа и лишь селект
либо
2. создать внешнюю процедуру на с, которая будет рассчитsвать константу гораздо быстрее нежели средствами ASE, пусть и для каждой строки

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

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

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

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

Всем +100 в карму за советы!
...
Рейтинг: 0 / 0
10.04.2018, 16:42
    #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
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помогите с запросом со временем / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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