Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Прошу помощи с оптимизацией запроса  [new]
shaden
Member

Откуда: Башкортостан
Сообщений: 165
Здравствуйте.

Покоя не дает который день мне долго выполняющийся запрос. Помогите, пожалуйста, разобраться.

Вот запрос.

SELECT DISTINCT 
 FM_BILL.BILL_DATE,
(case when isnull( MEDECINS_6.MEDECINS_ID,0)<> 0 then  MEDECINS_6.NOM+' '+MEDECINS_6.PRENOM  else MEDECINS.NOM+' '+ MEDECINS.PRENOM end) FIO_doctor
,MEDECINS_6.SPECIALISATION MEDECINS_SPECIALISATION,FM_BILL.PATIENTS_ID,FM_INVOICE.FM_INVOICE_ID
FROM
 FM_ACCOUNT_TRAN FM_ACCOUNT_TRAN WITH(NOLOCK)
 LEFT OUTER JOIN FM_PAYMENTS FM_PAYMENTS WITH(NOLOCK)  ON FM_ACCOUNT_TRAN.FM_ACCOUNT_TRAN_ID = FM_PAYMENTS.FM_ACCOUNT_TRAN_ID 
 LEFT OUTER JOIN FM_INVOICE FM_INVOICE WITH(NOLOCK)  ON FM_INVOICE.FM_INVOICE_ID = FM_PAYMENTS.FM_INVOICE_ID 
 LEFT OUTER JOIN FM_BILLDET_PAY FM_BILLDET_PAY WITH(NOLOCK)  ON FM_INVOICE.FM_INVOICE_ID = FM_BILLDET_PAY.FM_INVOICE_ID 
 LEFT OUTER JOIN FM_BILLDET FM_BILLDET WITH(NOLOCK)  ON FM_BILLDET.FM_BILLDET_ID = FM_BILLDET_PAY.FM_BILLDET_ID 
 LEFT OUTER JOIN DIR_SERV DIR_SERV WITH(NOLOCK)  ON DIR_SERV.DIR_SERV_ID = FM_BILLDET.DIR_SERV_ID 
 LEFT OUTER JOIN PATDIREC PATDIREC WITH(NOLOCK)  ON PATDIREC.PATDIREC_ID = DIR_SERV.PATDIREC_ID 
 LEFT OUTER JOIN DATA_PATDIREC DATA_PATDIREC WITH(NOLOCK)  ON PATDIREC.PATDIREC_ID = DATA_PATDIREC.PATDIREC_ID 
 LEFT OUTER JOIN MEDECINS MEDECINS_1 WITH(NOLOCK)  ON MEDECINS_1.MEDECINS_ID = DATA_PATDIREC.MEDPERSONAL2 
 LEFT OUTER JOIN MEDECINS MEDECINS_3 WITH(NOLOCK)  ON MEDECINS_3.MEDECINS_ID = DATA_PATDIREC.MEDPERSONAL3 
 LEFT OUTER JOIN MEDECINS MEDECINS_4 WITH(NOLOCK)  ON MEDECINS_4.MEDECINS_ID = DATA_PATDIREC.MEDPERSONAL4 
 LEFT OUTER JOIN MEDECINS MEDECINS_5 WITH(NOLOCK)  ON MEDECINS_5.MEDECINS_ID = DATA_PATDIREC.MEDPERSONAL5 
 LEFT OUTER JOIN MEDECINS MEDECINS_6 WITH(NOLOCK)  ON MEDECINS_6.MEDECINS_ID = DATA_PATDIREC.OSNOVNOI_VRACH 
 LEFT OUTER JOIN MEDECINS MEDECINS_8 WITH(NOLOCK)  ON MEDECINS_8.MEDECINS_ID = FM_INVOICE.MEDECINS_ID  
 LEFT OUTER JOIN FM_BILL FM_BILL WITH(NOLOCK)  ON FM_BILL.FM_BILL_ID = FM_BILLDET.FM_BILL_ID 
 LEFT OUTER JOIN MEDECINS MEDECINS WITH(NOLOCK)  ON MEDECINS.MEDECINS_ID = FM_BILL.MEDECINS1_ID 
 LEFT OUTER JOIN FM_SERV FM_SERV WITH(NOLOCK)  ON FM_SERV.FM_SERV_ID = FM_BILLDET.FM_SERV_ID 
 
WHERE
FM_ACCOUNT_TRAN.TRAN_DATE between  '20120301 00:00:00.000' and '20120330 23:59:59.999' 
and FM_ACCOUNT_TRAN.TRAN_TYPE <>'Z'
AND isnull( FM_INVOICE.TOTAL_AMOUNT ,0)<>0 
and isnull( FM_INVOICE.FM_ORG_ID,0) <> 240 
and FM_INVOICE.FM_INVOICE_ID not in (431469,432555,424520,414371,419628,424905,432390,428454,406679,415549, 429617,428533,423462,423671,432914,420240,431213,426658,418559,431696, 426701,415486,430840,430538,415678,430046,418511,418411,431992,429515, 428337,431468,432555,428462,432590,423462,419217,433414,412008,413629, 432557,430541,418582,423671,418726,424573,432722,422010)   /*(397704,397749,399389, 399426,400112,400335,401130,404229,405563,405959, 407049,407924,408113,408135,408898,408948,411757, 413629,413630,413634,413647)*/
AND (not exists (SELECT PATIENTS_ID FROM TESTPATIENTS t where t.patients_id = FM_BILL.PATIENTS_ID ) )
AND (isnull(MEDECINS.SPECIALISATION_ID,0) not in (39,136,137,138,139,160,202,214,153)  )
AND (isnull(FM_SERV.FM_DEP_ID,0)<>54)
AND (not MEDECINS_8.MEDECINS_ID in (154))


Время выполнения данного запроса 11-16 секунд. (План во вложении: mainQueryWithoutHint)
Добавляю hint: OPTION (LOOP JOIN)
Время сокращается до 4-6 секунд. (План во вложении: mainQueryWithtHint)

Ладно, с этим можно жить. Добавляю функцию в запрос.

ALTER FUNCTION [dbo].[UslFROMTalon_new](
	@PATIENTS_ID int, 
	@FM_ACCOUNT_TRAN_ID int, 
	@date datetime, 
	@nom2 varchar(255),		
	@nom int, 
	@nom1 int, 
	@nom3 int, 
	@nom4 int, 
	@nom5 int)
returns NVARCHAR(4000)
as
begin
	DECLARE @Result NVARCHAR(4000)
	SET @Result = ''
	
	DECLARE @tableVar table(
		operation varchar(255)
    );

	insert into @tableVar
	SELECT distinct case when isnull(FM_SERV.short_label,'') = '' then FM_SERV.label else FM_SERV.short_label end
	from  FM_ACCOUNT_TRAN FM_ACCOUNT_TRAN1 (nolock)
		left  join FM_PAYMENTS FM_PAYMENTS1 (nolock) ON FM_ACCOUNT_TRAN1.FM_ACCOUNT_TRAN_ID = FM_PAYMENTS1.FM_ACCOUNT_TRAN_ID and FM_ACCOUNT_TRAN1.FM_ACCOUNT_TRAN_ID = @FM_ACCOUNT_TRAN_ID
		LEFT  JOIN FM_INVOICE FM_INVOICE1 (nolock) ON FM_INVOICE1.FM_INVOICE_ID = FM_PAYMENTS1.FM_INVOICE_ID 
		left  JOIN FM_BILLDET_PAY FM_BILLDET_PAY1 (nolock) ON FM_INVOICE1.FM_INVOICE_ID = FM_BILLDET_PAY1.FM_INVOICE_ID
		left  join FM_BILLDET FM_BILLDET1 (nolock) ON FM_BILLDET1.FM_BILLDET_ID = FM_BILLDET_PAY1.FM_BILLDET_ID 
		left  join FM_SERV (nolock) on FM_SERV.FM_SERV_ID = FM_BILLDET1.FM_SERV_ID
		left  join FM_BILL (nolock) on FM_BILL.fm_bill_id = FM_BILLDET1.fm_bill_id
		LEFT  JOIN DIR_SERV DIR_SERV (nolock) ON DIR_SERV.DIR_SERV_ID = FM_BILLDET1.DIR_SERV_ID 
		left  JOIN DATA_PATDIREC DATA_PATDIREC (nolock) ON DIR_SERV.PATDIREC_ID  = DATA_PATDIREC.PATDIREC_ID 
	where
		FM_ACCOUNT_TRAN1.FM_ACCOUNT_TRAN_ID = @FM_ACCOUNT_TRAN_ID 
		and FM_BILL.BILL_DATE = @date
		and FM_ACCOUNT_TRAN1.TRAN_TYPE <>'Z'
		and (isnull(DATA_PATDIREC.OSNOVNOI_VRACH,0)  = isnull(@nom,0) )
		and (isnull(DATA_PATDIREC.MEDPERSONAL2,0) = isnull(@nom1,0))
		and (isnull(DATA_PATDIREC.MEDPERSONAL3 ,0) = isnull(@nom3,0))
		and (isnull(DATA_PATDIREC.MEDPERSONAL4,0) = isnull(@nom4,0))
		and (isnull(DATA_PATDIREC.MEDPERSONAL5,0) = isnull(@nom5,0))

	SELECT @Result = @Result +','+ operation from @tableVar

	return @Result
end


Запрос с функцией.

SELECT DISTINCT 
 FM_BILL.BILL_DATE,
(case when isnull( MEDECINS_6.MEDECINS_ID,0)<> 0 then  MEDECINS_6.NOM+' '+MEDECINS_6.PRENOM  else MEDECINS.NOM+' '+ MEDECINS.PRENOM end) FIO_doctor
,(dbo.UslFROMTalon_new( FM_BILL.PATIENTS_ID ,  FM_ACCOUNT_TRAN.FM_ACCOUNT_TRAN_ID, FM_BILL.BILL_DATE , MEDECINS_8.NOM, MEDECINS_6.MEDECINS_ID   ,MEDECINS_1.MEDECINS_ID , MEDECINS_3.MEDECINS_ID , MEDECINS_4.MEDECINS_ID , MEDECINS_5.MEDECINS_ID   )) usl
,MEDECINS_6.SPECIALISATION MEDECINS_SPECIALISATION,FM_BILL.PATIENTS_ID,FM_INVOICE.FM_INVOICE_ID
FROM
 FM_ACCOUNT_TRAN FM_ACCOUNT_TRAN WITH(NOLOCK)
 LEFT OUTER JOIN FM_PAYMENTS FM_PAYMENTS WITH(NOLOCK)  ON FM_ACCOUNT_TRAN.FM_ACCOUNT_TRAN_ID = FM_PAYMENTS.FM_ACCOUNT_TRAN_ID 
 LEFT OUTER JOIN FM_INVOICE FM_INVOICE WITH(NOLOCK)  ON FM_INVOICE.FM_INVOICE_ID = FM_PAYMENTS.FM_INVOICE_ID 
 LEFT OUTER JOIN FM_BILLDET_PAY FM_BILLDET_PAY WITH(NOLOCK)  ON FM_INVOICE.FM_INVOICE_ID = FM_BILLDET_PAY.FM_INVOICE_ID 
 LEFT OUTER JOIN FM_BILLDET FM_BILLDET WITH(NOLOCK)  ON FM_BILLDET.FM_BILLDET_ID = FM_BILLDET_PAY.FM_BILLDET_ID 
 LEFT OUTER JOIN DIR_SERV DIR_SERV WITH(NOLOCK)  ON DIR_SERV.DIR_SERV_ID = FM_BILLDET.DIR_SERV_ID 
 LEFT OUTER JOIN PATDIREC PATDIREC WITH(NOLOCK)  ON PATDIREC.PATDIREC_ID = DIR_SERV.PATDIREC_ID 
 LEFT OUTER JOIN DATA_PATDIREC DATA_PATDIREC WITH(NOLOCK)  ON PATDIREC.PATDIREC_ID = DATA_PATDIREC.PATDIREC_ID 
 LEFT OUTER JOIN MEDECINS MEDECINS_1 WITH(NOLOCK)  ON MEDECINS_1.MEDECINS_ID = DATA_PATDIREC.MEDPERSONAL2 
 LEFT OUTER JOIN MEDECINS MEDECINS_3 WITH(NOLOCK)  ON MEDECINS_3.MEDECINS_ID = DATA_PATDIREC.MEDPERSONAL3 
 LEFT OUTER JOIN MEDECINS MEDECINS_4 WITH(NOLOCK)  ON MEDECINS_4.MEDECINS_ID = DATA_PATDIREC.MEDPERSONAL4 
 LEFT OUTER JOIN MEDECINS MEDECINS_5 WITH(NOLOCK)  ON MEDECINS_5.MEDECINS_ID = DATA_PATDIREC.MEDPERSONAL5 
 LEFT OUTER JOIN MEDECINS MEDECINS_6 WITH(NOLOCK)  ON MEDECINS_6.MEDECINS_ID = DATA_PATDIREC.OSNOVNOI_VRACH 
 LEFT OUTER JOIN MEDECINS MEDECINS_8 WITH(NOLOCK)  ON MEDECINS_8.MEDECINS_ID = FM_INVOICE.MEDECINS_ID  
 LEFT OUTER JOIN FM_BILL FM_BILL WITH(NOLOCK)  ON FM_BILL.FM_BILL_ID = FM_BILLDET.FM_BILL_ID 
 LEFT OUTER JOIN MEDECINS MEDECINS WITH(NOLOCK)  ON MEDECINS.MEDECINS_ID = FM_BILL.MEDECINS1_ID 
 LEFT OUTER JOIN FM_SERV FM_SERV WITH(NOLOCK)  ON FM_SERV.FM_SERV_ID = FM_BILLDET.FM_SERV_ID 
 
WHERE
FM_ACCOUNT_TRAN.TRAN_DATE between  '20120301 00:00:00.000' and '20120301 23:59:59.999' 
and FM_ACCOUNT_TRAN.TRAN_TYPE <>'Z'
AND isnull( FM_INVOICE.TOTAL_AMOUNT ,0)<>0 
and isnull( FM_INVOICE.FM_ORG_ID,0) <> 240 
and FM_INVOICE.FM_INVOICE_ID not in (431469,432555,424520,414371,419628,424905,432390,428454,406679,415549, 429617,428533,423462,423671,432914,420240,431213,426658,418559,431696, 426701,415486,430840,430538,415678,430046,418511,418411,431992,429515, 428337,431468,432555,428462,432590,423462,419217,433414,412008,413629, 432557,430541,418582,423671,418726,424573,432722,422010)   /*(397704,397749,399389, 399426,400112,400335,401130,404229,405563,405959, 407049,407924,408113,408135,408898,408948,411757, 413629,413630,413634,413647)*/
AND (not exists (SELECT PATIENTS_ID FROM TESTPATIENTS t where t.patients_id = FM_BILL.PATIENTS_ID ) )
AND (isnull(MEDECINS.SPECIALISATION_ID,0) not in (39,136,137,138,139,160,202,214,153)  )
AND (isnull(FM_SERV.FM_DEP_ID,0)<>54)
AND (not MEDECINS_8.MEDECINS_ID in (154))


И жить становится очень грустно, если не сказать, что невыносимо. Запрос, который выполнялся за 4-16 секунд временной промежуток данных 1 месяц, начал выполняться за 4 минуты за один день. За месяц он выполняется минут 50-70. И совершенно уже без разницы, есть ли hint или нет. (План во вложении: mainQueryWithoutHintWithUDF)

Скажу честно, я практически не умею читать планы, чтобы делать анализ по производительности запроса. Поэтому прошу вас, уважаемые гуру, подскажите, пожалуйста, можно ли что-то сделать с данным запросом?

Спасибо.

К сообщению приложен файл (Plans.rar - 36Kb) cкачать
8 апр 12, 11:55    [12382795]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с оптимизацией запроса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ваша функция - зло злое. Выполняется на каждую строку третьего запроса по одному разу.
8 апр 12, 12:16    [12382825]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с оптимизацией запроса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Еще distinct везде наталкивает на мысль о том, что или данные не так выбираете, или схема кривая, или пишете его "на всякий случай".

Условия виде (isnull(DATA_PATDIREC.OSNOVNOI_VRACH,0) тоже не способствуют ускорению.
8 апр 12, 12:17    [12382827]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с оптимизацией запроса  [new]
aleks2
Guest
-- начнем раздраконивать по-порядку
SELECT -- DISTINCT - ЭТО УЖАСНОЕ ЗЛО означающее группировку херовой кучи ваших таблиц
 FB.BILL_DATE -- пишем АЛИАСы - а то крыша съедет.

--(case when isnull( MEDECINS_6.MEDECINS_ID,0)<> 0 then  MEDECINS_6.NOM+' '+MEDECINS_6.PRENOM  else MEDECINS.NOM+' '+ MEDECINS.PRENOM end) FIO_doctor
-- конешно, тут ничо такого страшного нету, но что уж так-то?
,(case when M6.MEDECINS_ID is not null then  M6.NOM+' '+M6.PRENOM else M.NOM+' '+ M.PRENOM end) FIO_doctor
,M6.SPECIALISATION MEDECINS_SPECIALISATION
,FB.PATIENTS_ID
,FI.FM_INVOICE_ID
-- таким образом в запросе нужны данные всего из 4 (четырех!) таблиц, 
-- а у вас 17 таблиц в джойне. Спрашивается: нафега?
FROM
-- начнем причесывать вашего монстрика
 (select * FROM FM_ACCOUNT_TRAN 
    WHERE 
    TRAN_DATE between  '20120301 00:00:00.000' and '20120330 23:59:59.999'
    AND
    TRAN_TYPE <>'Z' -- <> очень неприятная операция, рекомендуется ЯВНЫЙ список для = во вспомогательной таблице
 ) FAT 
 -- далее идут левые соединения, причем из FM_ACCOUNT_TRAN НИЧЕГО в результатах запроса НЕТУ
 -- тогда вопрос: нахера тут левое соединение?
 -- НЕ НУЖНО ОНО. Запрос должон плясать от FM_BILL
 LEFT OUTER JOIN FM_PAYMENTS FP ON FAT.FM_ACCOUNT_TRAN_ID = FP.FM_ACCOUNT_TRAN_ID 
 LEFT OUTER JOIN FM_INVOICE FI WITH(NOLOCK)  ON FI.FM_INVOICE_ID = FM_PAYMENTS.FM_INVOICE_ID 
 LEFT OUTER JOIN FM_BILLDET_PAY FM_BILLDET_PAY WITH(NOLOCK)  ON FM_INVOICE.FM_INVOICE_ID = FM_BILLDET_PAY.FM_INVOICE_ID 
 LEFT OUTER JOIN FM_BILLDET FM_BILLDET WITH(NOLOCK)  ON FM_BILLDET.FM_BILLDET_ID = FM_BILLDET_PAY.FM_BILLDET_ID 
 LEFT OUTER JOIN DIR_SERV DIR_SERV WITH(NOLOCK)  ON DIR_SERV.DIR_SERV_ID = FM_BILLDET.DIR_SERV_ID 
 LEFT OUTER JOIN PATDIREC PATDIREC WITH(NOLOCK)  ON PATDIREC.PATDIREC_ID = DIR_SERV.PATDIREC_ID 
 LEFT OUTER JOIN DATA_PATDIREC DATA_PATDIREC WITH(NOLOCK)  ON PATDIREC.PATDIREC_ID = DATA_PATDIREC.PATDIREC_ID 
 LEFT OUTER JOIN MEDECINS MEDECINS_1 WITH(NOLOCK)  ON MEDECINS_1.MEDECINS_ID = DATA_PATDIREC.MEDPERSONAL2 
 LEFT OUTER JOIN MEDECINS MEDECINS_3 WITH(NOLOCK)  ON MEDECINS_3.MEDECINS_ID = DATA_PATDIREC.MEDPERSONAL3 
 LEFT OUTER JOIN MEDECINS MEDECINS_4 WITH(NOLOCK)  ON MEDECINS_4.MEDECINS_ID = DATA_PATDIREC.MEDPERSONAL4 
 LEFT OUTER JOIN MEDECINS MEDECINS_5 WITH(NOLOCK)  ON MEDECINS_5.MEDECINS_ID = DATA_PATDIREC.MEDPERSONAL5 
 LEFT OUTER JOIN MEDECINS M6 WITH(NOLOCK)  ON M6.MEDECINS_ID = DATA_PATDIREC.OSNOVNOI_VRACH 
 LEFT OUTER JOIN MEDECINS MEDECINS_8 WITH(NOLOCK)  ON MEDECINS_8.MEDECINS_ID = FM_INVOICE.MEDECINS_ID  
 LEFT OUTER JOIN FM_BILL FB WITH(NOLOCK)  ON FB.FM_BILL_ID = FM_BILLDET.FM_BILL_ID 
 LEFT OUTER JOIN MEDECINS M WITH(NOLOCK)  ON M.MEDECINS_ID = FB.MEDECINS1_ID 
 LEFT OUTER JOIN FM_SERV FM_SERV WITH(NOLOCK)  ON FM_SERV.FM_SERV_ID = FM_BILLDET.FM_SERV_ID 
 
WHERE
-- из вышесказанной критики левого соединения следует, что  isnull(..., 0) подлежат искоренеию тоже
isnull( FM_INVOICE.TOTAL_AMOUNT ,0)<>0 
and isnull( FM_INVOICE.FM_ORG_ID,0) <> 240 
and FM_INVOICE.FM_INVOICE_ID not in (431469,432555,424520,414371,419628,424905,432390,428454,406679,415549, 429617,428533,423462,423671,432914,420240,431213,426658,418559,431696, 426701,415486,430840,430538,415678,430046,418511,418411,431992,429515, 428337,431468,432555,428462,432590,423462,419217,433414,412008,413629, 432557,430541,418582,423671,418726,424573,432722,422010)   /*(397704,397749,399389, 399426,400112,400335,401130,404229,405563,405959, 407049,407924,408113,408135,408898,408948,411757, 413629,413630,413634,413647)*/
AND (not exists (SELECT PATIENTS_ID FROM TESTPATIENTS t where t.patients_id = FM_BILL.PATIENTS_ID ) )
AND (isnull(MEDECINS.SPECIALISATION_ID,0) not in (39,136,137,138,139,160,202,214,153)  )
AND (isnull(FM_SERV.FM_DEP_ID,0)<>54)
AND (not MEDECINS_8.MEDECINS_ID in (154))


Время выполнения данного запроса 11-16 секунд
8 апр 12, 14:13    [12383074]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с оптимизацией запроса  [new]
shaden
Member

Откуда: Башкортостан
Сообщений: 165
Спасибо всем!
О результатах отпишусь.
8 апр 12, 15:37    [12383247]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с оптимизацией запроса  [new]
shaden
Member

Откуда: Башкортостан
Сообщений: 165
aleks2,

Запрос выдал целую портянку однотипных ошибок :(

автор
Сообщение 4104, уровень 16, состояние 1, строка 1
The multi-part identifier "FM_PAYMENTS.FM_INVOICE_ID" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 1
The multi-part identifier "FM_INVOICE.FM_INVOICE_ID" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 1
The multi-part identifier "FM_INVOICE.MEDECINS_ID" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 1
The multi-part identifier "FM_INVOICE.TOTAL_AMOUNT" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 1
.... и т.д.
8 апр 12, 15:57    [12383279]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с оптимизацией запроса  [new]
shaden
Member

Откуда: Башкортостан
Сообщений: 165
Гавриленко Сергей Алексеевич,

Да это я уже понял. Правильно все делать в одном запросе?
8 апр 12, 16:06    [12383303]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с оптимизацией запроса  [new]
aleks2
Guest
shaden
aleks2,

Запрос выдал целую портянку однотипных ошибок :(

автор
Сообщение 4104, уровень 16, состояние 1, строка 1
The multi-part identifier "FM_PAYMENTS.FM_INVOICE_ID" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 1
The multi-part identifier "FM_INVOICE.FM_INVOICE_ID" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 1
The multi-part identifier "FM_INVOICE.MEDECINS_ID" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 1
The multi-part identifier "FM_INVOICE.TOTAL_AMOUNT" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 1
.... и т.д.

Я за вас фсе алиасы должон поправить?
8 апр 12, 16:08    [12383311]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с оптимизацией запроса  [new]
shaden
Member

Откуда: Башкортостан
Сообщений: 165
aleks2,

Ни в коем случае. Вы и так уже здорово помогли.
8 апр 12, 16:15    [12383328]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с оптимизацией запроса  [new]
shaden
Member

Откуда: Башкортостан
Сообщений: 165
aleks2,

Я был бы очень благодарен, если бы Вы разъяснили вот это "<> очень неприятная операция, рекомендуется ЯВНЫЙ список для = во вспомогательной таблице" - не понял, честно.
8 апр 12, 16:19    [12383336]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с оптимизацией запроса  [new]
aleks2
Guest
shaden
aleks2,

Я был бы очень благодарен, если бы Вы разъяснили вот это "<> очень неприятная операция, рекомендуется ЯВНЫЙ список для = во вспомогательной таблице" - не понял, честно.


<>чему-то_там
- означает гарантированный скан таблицы.
если же напрячься и перечислить фсе, окромя чегото-то_там, то есть шансы задействовать поиск по индексу.
Но перечислять тоже нада с умом, просто IN() - не годится.
8 апр 12, 16:35    [12383359]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с оптимизацией запроса  [new]
iljy
Member

Откуда:
Сообщений: 8711
aleks2
<>чему-то_там
- означает гарантированный скан таблицы.
если же напрячься и перечислить фсе, окромя чегото-то_там, то есть шансы задействовать поиск по индексу.
Но перечислять тоже нада с умом, просто IN() - не годится.

Вот нифига это не скан, а очень даже легко 2 поиска: < чего-то_там и >чего-то_там. А с перечислением поисков будет по числу элементов в списке, так что все очень сильно зависит от конкретной ситуации.
8 апр 12, 17:54    [12383658]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить