powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Помогите оптимизировать SQL запрос
25 сообщений из 62, страница 1 из 3
Помогите оптимизировать SQL запрос
    #38287234
vichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Я новичок в Cache.
Product: Cache 2008.2
Hardware: Microsoft Windows Server 2008.

Мне нужно оптимизировать запрос, написанный раннее.
Запрос сложный, я его упростила до минимума, пытаясь оптимизировать.

Две таблицы, обе индексированы: Client.ResponseArchive (Primary Key: MobileNumber||ResponseID, 10000 записей), Client.MessageArchive (Primary Key: MessageID, 850000 записей).

Сам запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT DISTINCT
        ResponseArchive.MobileNumber AS MobileNo,
        ResponseText AS Message
        FROM
        Client.ResponseArchive
                INNER JOIN Client.MessageArchive
                ON ResponseArchive.MobileNumber = MessageArchive.MobileNumber
        WHERE ResponseDate >= '2013-03-01'
        AND DateArchived >= '2013-03-01'
        AND DateArchived <= '2013-03-31'      
        AND ResponseArchive.MobileNumber Like '%'


Если запрос выполняется без последнего условия (ResponseArchive.MobileNumber Like '%')- за 2 секунды, с последним- за 1.5 минуты (посортироваы по MobileNumber).
Возвращает 539 записей.

Как его можно оптимизировать, чтобы он быстро работал и с последним условием?
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287280
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vichka ,

Как вариант:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select * from (
	SELECT DISTINCT
	        ResponseArchive.MobileNumber AS MobileNo,
	        ResponseText AS Message
	        FROM
	        Client.ResponseArchive
	                INNER JOIN Client.MessageArchive
	                ON ResponseArchive.MobileNumber = MessageArchive.MobileNumber
	        WHERE ResponseDate >= '2013-03-01'
	        AND DateArchived >= '2013-03-01'
	        AND DateArchived <= '2013-03-31'
) where MobileNo Like '%'


Но лучше Like '%' заменить на is not null :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT DISTINCT
        ResponseArchive.MobileNumber AS MobileNo,
        ResponseText AS Message
        FROM
        Client.ResponseArchive
                INNER JOIN Client.MessageArchive
                ON ResponseArchive.MobileNumber = MessageArchive.MobileNumber
        WHERE ResponseDate >= '2013-03-01'
        AND DateArchived between '2013-03-01' and '2013-03-31'      
        AND ResponseArchive.MobileNumber is not null


Надеюсь, индекс на MobileNumber есть, и в обеих таблицах?
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287331
vichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, сейчас попробую.
Да, обе таблицы проиндексированы по MobileNumber.
MobileNumber берется из textbox и может содержать часть номера только.
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287367
vichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запустила запрос. Выполнялся 1 мин. Все равно долго.
A PrimaryKey может влиять? Если он в таблице как MobileNumber||ResponseID (плюс проиндексировано отдельно по полям MobileNumber, ResponseID - это я уже сама добавила, изначально индекс был толко по ResponseDate).
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287368
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vichkaMobileNumber берется из textbox и может содержать часть номера только.Тогда должно быть Like '%что-то%'
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287371
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vichkaA PrimaryKey может влиять?Есть острая необходимость в отказе от стандартного (системного) первичного ключа?
В этом случае Вы лишаетесь в будущем возможности использовать bitmap-индексы.
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287372
vichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если textbox пустой и все номера должны быть выбраны, тогда как? - '%'?
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287376
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vichkaА если textbox пустой и все номера должны быть выбраны, тогда как? - '%'?is not null
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287389
vichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servitЕсть острая необходимость в отказе от стандартного (системного) первичного ключа?
Это когда он не задается в классе явно?
Все (классы) создано и работает несколько лет, только тормозить стало, жалуются клиенты.
И я не сильна в Cache, поэтому про индексы не знаю...
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287390
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vichkaMobileNumber берется из textbox и может содержать часть номера только.Или использовать предикат "[": Substring Predicates
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287400
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vichkaВсё создано и работает несколько летЯсно.
vichkaИ я не сильна в Cache, поэтому про индексы не знаюПланы запросов смотрели?
Попробуйте ещё подсказки SQL
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287411
vichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servitПланы запросов смотрели?
Да, смотрела. Только не знаю что делать (see .pdf file attached).
Написала в INTERSYSTEMS. Они предлагат переписать в dynamic SQL.
А там несколько сложных запросов. Это будет долго- переписывать + тестировать....

servitПопробуйте ещё подсказки SQL
Подсказки эти тоже уже знаю- не помогли пока, пробовала с разными OPTIOMIZING WORDS.
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287462
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vichkaservitПланы запросов смотрели?
Да, смотрела. Только не знаю что делать (see .pdf file attached).
план запроса весь бы увидеть, в представленном варианте не все видно
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287464
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vichkaДа, смотрела. Только не знаю что делать (see .pdf file attached).Я хотел бы увидеть планы и результаты моих трёх вариантов: подзапрос, is not null и [
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287480
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMorплан запроса весь бы увидеть, в представленном варианте не все видноРазве?
Во втором запросе нет модулей и, кстати, не используются индексы на даты.

vichka ,

Статистику по таблицам собирали?
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287710
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас проблема, что включается использование индекса по MobileNumber, каше считает его оптимальным, но ошибается.

Какие могут быть варианты:
1. использовать подсказку %Ignoreindices. Не факт, что получится, так как это часть первичного ключа.
2. использовать конструкцию
select from
( select ...
)
where MobileNumber ...
Тогда основной запрос не будет использовать индекс, а фильтрация будет уже в промежуточных результатах
3. Искорежить поле MobileNumber так, чтобы каше не поняла, что по нему можно использовать индекс
Типа
where string(MobileNumber) like '%..'

Пожалуй, самое простое - третий вариант.
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287741
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ранее как-то писалось, что такое

vichka
Код: sql
1.
2.
3.
        WHERE ResponseDate >= '2013-03-01'
        AND DateArchived >= '2013-03-01'
        AND DateArchived <= '2013-03-31'      


оптимальнее написать так
Код: sql
1.
2.
        WHERE ResponseDate >= '2013-03-01'
        AND DateArchived BETWEEN '2013-03-01' AND '2013-03-31'      


Причем даже местами поменять
Код: sql
1.
2.
3.
4.
        WHERE 
        DateArchived BETWEEN '2013-03-01' AND '2013-03-31'      
        AND 
        ResponseDate >= '2013-03-01'



А вот это
vichka
Код: sql
1.
        AND ResponseArchive.MobileNumber Like '%'



точно как
Код: sql
1.
        AND ResponseArchive.MobileNumber is not null
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38287743
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vichkaЕсли запрос выполняется без последнего условия
Код: sql
1.
ResponseArchive.MobileNumber Like '%'

- за 2 секунды, с последним- за 1.5 минуты (посортироваы по MobileNumber).
А сколько будет по времени работать
Код: sql
1.
ResponseArchive.MobileNumber Like '%'


и
Код: sql
1.
ResponseArchive.MobileNumber Like is not null
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38288362
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопросы к автору :
ResponseText берется из таблицы ResponseArchive? или MessageArchive? Если в селекте поля только из одной таблицы, то вот так можно поробовать:

Код: sql
1.
2.
3.
4.
SELECT MobileNumber AS MobileNo, ResponseText AS Message 
FROM Client.ResponseArchive 
WHERE DateArchived BETWEEN '2013-03-01' AND '2013-03-31' 
AND MobileNumber IN (SELECT MobileNumber FROM MessageArchive WHERE ResponseDate >= '2013-03-01' AND MobileNumber IS NOT NULL)


Like '%' - это использовать вообще не советую, жутко тормозная тема.

посмотрите раздел Query Optimization Options , в частности %NOFLATTEN и использование этой опции в подзапросах
http://docs.intersystems.com/cache20081/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_from#RSQL_C22222
но опять же, при оптимизации всегда смотрите план, так будет проще понять в каком месте оптимизировать и помогают ли дополнительные опции

так же думаю что вам могут помочь в форуме по MS SQL Server
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38288366
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitЯ хотел бы увидеть планы и результаты моих трёх вариантов: подзапрос, is not null и
тогда, автор, и мне мой покажите план, %NOFLATTEN в позапросе можно попробовать указать, а иногда наоборот он тормозит запрос и лучше без него
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38288377
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аленочкатак же думаю что вам могут помочь в форуме по MS SQL ServerТС разве где-то упомянул про MS SQL Server ? Выше речь шла про Microsoft Windows Server 2008
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38288614
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit, читать умею) а sql-запросы оптимизируют не только в Cache, элементарно в форуме MS SQL Server больше народу и спецов по этой части ИМХО, может кто-то что-то умное подскажет, или по вашему если основная среда разработки Cache, то и спрашивать следует только в форуме по Cache
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38288672
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аленочка ,

Если там знают нюансы Caché, умеют оптимизировать специально под Caché, разбираются в подсказках его SQL и умеют читать его планы запросов - пусть обращается.
Но если там начнут предлагать фишки сугубо для MS SQL Server, то кого потом автору винить?
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38288906
vichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините за поздний ответ.
Как мне показать вам планы запросов? Скопировать и вставить здесь как текст или как?
Я прицепила ранее файл, кто-то сказал, что не все видно- это все что было, за исключением самих записей.
Как мне тогда вам их предоставить?
...
Рейтинг: 0 / 0
Помогите оптимизировать SQL запрос
    #38288919
vichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Маленько уточню запрос, опущенное может повлиять на скорость:

SELECT DISTINCT TOP 5000
ResponseArchive.ResponseID, ResponseArchive.MobileNumber AS MobileNo,
ResponseArchive.ResponseText AS Message,
ResponseArchive.ResponseDate
FROM
%NOTOPOPT
Client.ResponseArchive
INNER JOIN Client.MessageArchive
ON ResponseArchive.MobileNumber = MessageArchive.MobileNumber
WHERE ResponseArchive.ResponseDate >= '2013-03-01'
AND MessageArchive.DateArchived BETWEEN '2013-03-01' AND '2013-03-31'
AND ResponseArchive.MobileNumber Like '%'
order by ResponseArchive.MobileNumber, ResponseArchive.ResponseDate desc

%NOTOPOPT было рекомендовано раннее by Intersystems- Помогло, но в других запросах, где таблицы не JOIN по части от PrimaryKey, а по какому-нибудь ID.
...
Рейтинг: 0 / 0
25 сообщений из 62, страница 1 из 3
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Помогите оптимизировать SQL запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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