Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Можно ли оптимизировать запрос  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
Коллеги, подскажите вариант оптимизации подобного запроса.

В некоторых случая запрос выполняется непозволительно долго, и система не дожидается ответа.

select top 30 a.image_id,a.patient_id,a.updated_date,a.updated_time,lab.dbo.RmDateToDT(a.updated_date,a.updated_time) as upd_date,a.image_date,
        a.image_time,a.image_type,a.image_subtype,a.image_format,b.string_value,c.external_id 
        from Romexis_db.dbo.RIM_Image_Info a(nolock) 
        left join Romexis_db.dbo.RIM_Image_Attrib b(nolock) on (b.image_id = a.image_id) and (b.attrib_type=171) 
        left join Romexis_db.dbo.RRM_Person c(nolock)  on (c.person_id = a.patient_id) 
        where (a.image_id>=11111) and (a.image_id not in (select seq from lab.dbo.tbImgInfo where (seq=a.image_id))) 
        and ((b.string_value IS NULL) OR (b.string_value not in (select ExaminationID from lab.dbo.tbImgInfo where (ExaminationID IS NOT NULL))))
        order by a.image_id


Вносить изменения в структуру нельзя, добавлять индексы нельзя.
20 май 14, 17:37    [16044142]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
and (a.image_id not in (select seq from lab.dbo.tbImgInfo where (seq=a.image_id)))
это правда работает?
20 май 14, 17:42    [16044179]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
Challenger
В некоторых случая запрос выполняется непозволительно долго
Тогда почему вы решили, что проблема в запросе?
20 май 14, 17:44    [16044194]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
Shakill,
Это работает.
20 май 14, 17:48    [16044215]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Shakill
and (a.image_id not in (select seq from lab.dbo.tbImgInfo where (seq=a.image_id)))
это правда работает?
простите, был напуган.
но структуру хотя бы показать можно. с имеющимися индексами и прочим
20 май 14, 17:48    [16044219]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
invm
Challenger
В некоторых случая запрос выполняется непозволительно долго
Тогда почему вы решили, что проблема в запросе?


Я тешу себя надеждой, что его можно заменить на что-то работающее быстрее.
20 май 14, 17:48    [16044222]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Challenger
Вносить изменения в структуру нельзя, добавлять индексы нельзя.

Купить процессоры, память, диски можно ?
20 май 14, 17:49    [16044225]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
Вот структура, раз спрашиваете,

CREATE TABLE [dbo].[RIM_Image_Info](
	[image_id] [int] IDENTITY(1,1) NOT NULL,
	[history_id] [int] NOT NULL,
	[patient_id] [int] NOT NULL,
	[status] [int] NOT NULL,
	[updated_by] [int] NOT NULL,
	[updated_date] [int] NOT NULL,
	[updated_time] [int] NOT NULL,
	[doctor_id] [int] NULL,
	[image_size] [int] NOT NULL,
	[image_date] [int] NOT NULL,
	[image_time] [int] NOT NULL,
	[image_source] [int] NOT NULL,
	[image_type] [int] NOT NULL,
	[image_subtype] [int] NOT NULL,
	[image_format] [nvarchar](4) NULL,
	[bit_depth] [int] NOT NULL,
	[pixel_size] [int] NULL,
	[rotation_angle] [int] NULL,
	[is_mirrored] [int] NULL,
	[tooth_mask] [int] NULL,
	[tooth_mask_child] [int] NULL,
	[operator_id] [int] NULL,
 CONSTRAINT [PK_RIM_IMAGE_INFO] PRIMARY KEY CLUSTERED 
(
	[image_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[RIM_Image_Info]  WITH CHECK ADD  CONSTRAINT [FK_RIM_IMAGE_INFO_1] FOREIGN KEY([patient_id])
REFERENCES [dbo].[RRM_Person] ([person_id])
GO

ALTER TABLE [dbo].[RIM_Image_Info] CHECK CONSTRAINT [FK_RIM_IMAGE_INFO_1]
GO


CREATE TABLE [dbo].[RIM_Image_Attrib](
	[attrib_id] [int] IDENTITY(1,1) NOT NULL,
	[history_id] [int] NOT NULL,
	[image_id] [int] NOT NULL,
	[status] [int] NOT NULL,
	[updated_by] [int] NOT NULL,
	[updated_date] [int] NOT NULL,
	[updated_time] [int] NOT NULL,
	[attrib_type] [int] NOT NULL,
	[int_value] [int] NOT NULL,
	[string_value] [nvarchar](2000) NULL,
	[double_value] [float] NULL,
 CONSTRAINT [PK_RIM_IMAGE_ATTRIB] PRIMARY KEY CLUSTERED 
(
	[attrib_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[RIM_Image_Attrib]  WITH CHECK ADD  CONSTRAINT [FK_RIM_IMAGE_ATTRIB_1] FOREIGN KEY([image_id])
REFERENCES [dbo].[RIM_Image_Info] ([image_id])
GO

ALTER TABLE [dbo].[RIM_Image_Attrib] CHECK CONSTRAINT [FK_RIM_IMAGE_ATTRIB_1]
GO



CREATE TABLE [dbo].[RRM_Person](
	[person_id] [int] IDENTITY(1,1) NOT NULL,
	[history_id] [int] NOT NULL,
	[external_id] [nvarchar](64) NULL,
	[system_id] [nvarchar](32) NULL,
	[other_id] [nvarchar](64) NULL,
	[status] [int] NOT NULL,
	[updated_by] [int] NOT NULL,
	[updated_date] [int] NOT NULL,
	[updated_time] [int] NOT NULL,
	[title] [nvarchar](20) NULL,
	[first_name] [nvarchar](64) NULL,
	[second_name] [nvarchar](64) NULL,
	[third_name] [nvarchar](64) NULL,
	[last_name] [nvarchar](64) NULL,
	[maiden_name] [nvarchar](64) NULL,
	[nickname] [nvarchar](64) NULL,
	[name_suffix] [nvarchar](10) NULL,
	[initials] [nvarchar](10) NULL,
	[date_of_birth] [int] NULL,
	[date_of_death] [int] NULL,
	[gender] [nchar](1) NULL,
	[marital_status] [nchar](1) NULL,
	[nationality] [nchar](3) NULL,
	[language_id] [nchar](2) NULL,
	[occupation] [nvarchar](50) NULL,
 CONSTRAINT [PK_RRM_PERSON] PRIMARY KEY CLUSTERED 
(
	[person_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


/****** Object:  Table [dbo].[tbImgInfo]    Script Date: 05/20/2014 17:54:08 ******/

CREATE TABLE [dbo].[tbImgInfo](
	[seq] [int] NOT NULL,
	[CreateDate] [datetime] NOT NULL,
	[uploadUrl] [varchar](256) NULL,
	[ExaminationID] [varchar](128) NULL,
	[IsMinicopySended] [bit] NOT NULL,
	[IsPatientSended] [bit] NOT NULL,
	[uploadExaminationID] [uniqueidentifier] NULL,
	[Width] [int] NULL,
	[Height] [int] NULL,
	[SendSizeCount] [int] NOT NULL,
	[C_Type] [int] NULL,
	[C_SubType] [int] NULL,
 CONSTRAINT [PK_ImgInfo] PRIMARY KEY CLUSTERED 
(
	[seq] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[tbImgInfo] ADD  CONSTRAINT [DF_ImgInfo_CreateDate]  DEFAULT (getdate()) FOR [CreateDate]
GO

ALTER TABLE [dbo].[tbImgInfo] ADD  CONSTRAINT [DF_tbImgInfo_IsMinicopySended]  DEFAULT ((0)) FOR [IsMinicopySended]
GO

ALTER TABLE [dbo].[tbImgInfo] ADD  CONSTRAINT [DF_tbImgInfo_IsPatientSended]  DEFAULT ((0)) FOR [IsPatientSended]
GO

ALTER TABLE [dbo].[tbImgInfo] ADD  CONSTRAINT [DF_tbImgInfo_SizeSendCount]  DEFAULT ((0)) FOR [SendSizeCount]
GO
20 май 14, 17:54    [16044259]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Challenger
Вот структура, раз спрашиваете,

А про результат, который достигается этим запросом, тоже расскажите ?
Версию сервера покажите ? А может даже реальный план выполнения ?
20 май 14, 17:58    [16044291]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
vikkiv
Member

Откуда: EU
Сообщений: 3015
A таблица tbImgInfo случаем тоже не блокируется (в смысле туда добавить nolock или set transaction isolation level unrestricted)? Попробуй как быстро на сервере напрямую выполняется раз 10-20 .. частично для поиска тормозов можно пока условия упроистить (например исключив/заменив{на предопределённый список} where .. ..not in..(select..)and..not in(select..))
20 май 14, 18:31    [16044458]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9163
Измените запрос так, чтобы не было OR.
Во-вторых Ваше ТОП 30 с упорядочиванием приводит к сортировке, если в выборке несколько миллионов записей и больше - последствия будут катастрофичными.
21 май 14, 11:29    [16046960]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Exproment
Member

Откуда:
Сообщений: 418
Владислав Колосов
Ваше ТОП 30 с упорядочиванием приводит к сортировке, если в выборке несколько миллионов записей и больше - последствия будут катастрофичными.

С чего вы это взяли ? Вроде сортировка идет по полю image_id, которое является кючем кластеризованного индекса. Откуда там возник сортировка ?
21 май 14, 12:15    [16047508]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Exproment
Вроде сортировка идет по полю image_id, которое является кючем кластеризованного индекса. Откуда там возник сортировка ?


сортировки не будет в случае, если для выполнения будет выбрана стратегия сканирования индекса, совпадающего с сортировкой. и тогда, к слову, при неверной оценке для выполнения запрошенного TOP 30 может потребоваться высканить чуть ли не все! а в противном случае выборка будет организована по-другому, реализована полностью, отсортирована и вам вернется TOP 30, как и просили

короче, нет универсального ответа на ваш вопрос. точнее он есть, но он не особо поможет - ставьте критерии выборки такие, чтобы запрос "сразу" и "эффективно" отбирал "достаточно мало" данных, тогда они будут дальше отсортированы и сделано TOP 30. но это фантастика
21 май 14, 12:33    [16047633]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
aleks2
Guest
Shakill
and (a.image_id not in (select seq from lab.dbo.tbImgInfo where (seq=a.image_id)))
это правда работает?

Challenger
Shakill,
Это работает.


А сакральный смысл этого может кто-нибудь мне втолковать.
Или я совсем плох стал...
21 май 14, 13:40    [16048262]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
aleks2, можно убрать where и смысл останется тем же, т.к. поля not null
21 май 14, 13:59    [16048497]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
aleks2
А сакральный смысл этого может кто-нибудь мне втолковать.
Это альтернатива not exists. Для больших оригиналов
21 май 14, 14:02    [16048546]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
Пропадал я тут на некоторое время.

Сейчас вернулся - все перечитал внимательно, но так и не понял можно ли что-то сделать.
22 май 14, 16:42    [16056529]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9163
Можно, я же написал. Уберите OR.
22 май 14, 16:48    [16056605]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
Glory
А про результат, который достигается этим запросом, тоже расскажите ?
Версию сервера покажите ? А может даже реальный план выполнения ?


Glory,
версия SQL
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 6.1 (Build 7601: Service Pack 1)


План выполнения выложу чуть позже.

Glory
А про результат, который достигается этим запросом, тоже расскажите ?


Выбираются записи по определенному критерию, которые еще не обработаны. Те, которые обработаны - фиксировались в сторонней таблице tbImgInfo.
22 май 14, 16:57    [16056714]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Challenger
Выбираются записи по определенному критерию, которые еще не обработаны. Те, которые обработаны - фиксировались в сторонней таблице tbImgInfo.

И предложенный текст запроса является единственно возможным решением ?
22 май 14, 16:59    [16056730]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
Glory, конечно нет.

Я как раз и спрашиваю про альтернативу.
26 май 14, 17:40    [16075246]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Challenger
Я как раз и спрашиваю про альтернативу.

Т.е. вы предлагаете написать свободное сочинение на тему "Выбираются записи по определенному критерию, которые еще не обработаны. Те, которые обработаны - фиксировались в сторонней таблице tbImgInfo." ?
Т.е. самим придумать "определенные критерии" и "еще не обработаны" ?
26 май 14, 17:41    [16075256]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
Нет сочинения написать не предлагаю. Предлагаю просто подать идею как здесь изменить запрос.
26 май 14, 17:52    [16075301]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Challenger
Предлагаю просто подать идею как здесь изменить запрос.

Посмотреть на план.
Выявить самые дорогие шаги.
Переписать их.
26 май 14, 17:54    [16075319]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать запрос  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Challenger,

подумайте лучше над изменением "схемы данных". потому как если во главу угла ставить "моментальные" выборки - данные для них должны храниться "уже готовыми", то есть, как минимум, проиндексированными "под выборку". иначе (грубо! + уже писал же про это) у вас будет или (долгий?) скан с расчетами, пока не наберутся ваши TOP записей или полноценное выполнение запроса, чтобы после оставить ваши TOP записей. иногда, при определенном распределении данных, "достаточно" запинать оптимизатор так, чтобы он всегда работал по варианту "скан + расчет пока не наберется TOP"
26 май 14, 18:11    [16075404]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить