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

Откуда:
Сообщений: 367
Скажите пожалуйста, как можно оптимизировать сл. функцию потому что она тормозит простой селект
SELECT DISTINCT TR.PropCode, #adr.propaddr, dbo.getFIO(tr.propcode),dbo.GetPropDOCTax(tr.propcode)
FROM T_Property TR inner join #ADR on TR.propcode=#ADR.propcode


create FUNCTION dbo.GetPropDOCTax(@id bigint)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @Result VARCHAR(1000)
SET @Result = ''
SELECT
@Result= @Result + ' '+ ISNULL(S_doctypes.DOCNAME,'')+',№ '+ isnull(T_documents.DocNum,'')+' от '
+cast( isnull(T_documents.DocDate,'') as varchar(20)) +' ' +isnull(T_documents.Organ,'')
FROM T_ownerprop INNER JOIN T_property ON T_ownerprop .propcode = T_property.propcode
Left join T_documents on T_ownerprop .propcode=T_documents.propcode
left join S_doctypes on T_documents.DocType=S_doctypes.code
where T_property.propcode = @id
RETURN '' + RTRIM(@Result) + ', '
END
8 сен 09, 07:47    [7629533]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
убрать функцию, ибо.
8 сен 09, 08:08    [7629553]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Mari-Salt
Member

Откуда:
Сообщений: 367
без этих данных не могу(функции)
8 сен 09, 08:16    [7629564]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Вы понимает , что функция вызывается для каждой строки резалтсета ?
только не надо , спрашивать - что делать, ответ очевиден.
8 сен 09, 08:19    [7629566]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Mari-Salt
Member

Откуда:
Сообщений: 367
т.е. это нормально да?
8 сен 09, 08:24    [7629572]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 629
Можно попробовать как-то так

create FUNCTION dbo.GetPropDOCTax(@id bigint)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @Result VARCHAR(1000)
SET @Result = ''

SELECT 
@Result= @Result + ' '+ ISNULL(S_doctypes.DOCNAME,'')+',№ '+ isnull(T_documents.DocNum,'')+' от '
+cast( isnull(T_documents.DocDate,'') as varchar(20)) +' ' +isnull(T_documents.Organ,'')
FROM 
(Select * from T_property where T_property.propcode = @id) as T_ownerprop
  INNER JOIN 
(Select * from T_ownerprop where T_ownerprop.propcode = @id) T_ownerprop
                       ON T_ownerprop.propcode = T_property.propcode
  Left join 
(Select * from T_documents where T_documents.propcode = @id) T_documents
                       ON T_ownerprop.propcode=T_documents.propcode 
  left join S_doctypes on T_documents.DocType=S_doctypes.code

RETURN '' + RTRIM(@Result) + ', '
END


Еще один вариант будет более быстрым на мой взгляд:
у вас известен параметр @ID по которому из трех таблиц идет выборка - можно из этих таблиц выдернуть необходимые данные (по условию propcode = @id) сначала в темповые таблицы, а потом уже джойнить темповые таблицы. Оптимизатор, особенно если нет индексов, не всегда корректно срабатывает на "сложных" запросах - очень часто сталкивался с ситуацией, когда проще разложить сложный запрос на несколько простых с использованием темповых таблиц и быстродействие увеличивается.
8 сен 09, 08:28    [7629577]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 629
Выше в посте окопипастился:


FROM 
(Select * from T_property where T_property.propcode = @id) as T_property
  INNER JOIN 

и далее по тексту
8 сен 09, 08:29    [7629578]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
нормально будет- развернуть две функции и сделать вьюшку из вашего монстра, кроме того на клиенте формировать текстовое представление из ваших нескольких полей.
8 сен 09, 08:32    [7629582]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Mari-Salt
Member

Откуда:
Сообщений: 367
Засекла время
Ваш вариант запроса занял 10 минут -32 секунд, мой вариант запроса - 8 мин 59 сек.
8 сен 09, 09:32    [7629734]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Нектотам
Guest
Mari-Salt
Засекла время
Ваш вариант запроса занял 10 минут -32 секунд, мой вариант запроса - 8 мин 59 сек.

А индексы вообще есть? и в особенности по #ADR.propcode, T_ownerprop .propcode, T_Property.propcode, T_documents.propcode?
8 сен 09, 09:53    [7629816]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 629
Mari-Salt
Засекла время
Ваш вариант запроса занял 10 минут -32 секунд, мой вариант запроса - 8 мин 59 сек.


Хм... Интересно вышло - обычно время запроса не больше. Какие объемы данных у вас?
остается один вариант - смотреть план запросов, рулить индексами... Временные таблицы в функции не работают...
8 сен 09, 09:59    [7629841]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Mari-Salt
Member

Откуда:
Сообщений: 367
Да, у меня база больше 1 Гб . Индексы у меня propcode
8 сен 09, 10:01    [7629852]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Mari-Salt,

откройте для себя план выполнения запросов.
8 сен 09, 10:03    [7629864]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Без функции это будет примерно так выглядеть, также нужно убрать и вторую функцию тогда скорость вырастет в разы (если конечно индексы на месте).

SELECT DISTINCT
TR.PropCode,
#adr.propaddr,
dbo.getFIO(tr.propcode),
GetProp.GetPropDOCTax
FROM
T_Property TR
join #ADR on TR.propcode=#ADR.propcode
left JOIN (SELECT T_property.propcode,
' '+
ISNULL(S_doctypes.DOCNAME,'')+',№ '+ isnull(T_documents.DocNum,'')+' от '
+cast( isnull(T_documents.DocDate,'') as varchar(20)) +' ' +isnull(T_documents.Organ,'') + ', ' GetPropDOCTax
FROM
T_ownerprop
JOIN T_property ON T_ownerprop.propcode = T_property.propcode
Left join T_documents on T_ownerprop .propcode=T_documents.propcode
left join S_doctypes on T_documents.DocType=S_doctypes.code) GetProp ON GetProp.propcode = tr.propcode
8 сен 09, 11:36    [7630487]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Mari-Salt
Member

Откуда:
Сообщений: 367
Cкажите пожалуйста, результат выражения cast( isnull(T_documents.DocDate,'') as varchar(15)) выводит вот в таком формате: Aug 16 2007 12 можно ли отобразить в формате 16.08.2007
8 сен 09, 11:51    [7630619]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Справку откройте, в конце концов и посмотрите CONVERT.
8 сен 09, 11:53    [7630631]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mari-Salt
Cкажите пожалуйста, результат выражения cast( isnull(T_documents.DocDate,'') as varchar(15)) выводит вот в таком формате: Aug 16 2007 12 можно ли отобразить в формате 16.08.2007

Если прочитаете про функцию CONVERT, то сможите
8 сен 09, 11:53    [7630634]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Mari-Salt
Member

Откуда:
Сообщений: 367
WarAnt,
в результате выходит только 1 документ, а функция предназначалась чтобы собрать все документв в одно поле
8 сен 09, 11:58    [7630660]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mari-Salt
WarAnt,
в результате выходит только 1 документ, а функция предназначалась чтобы собрать все документв в одно поле

Зачем ?
8 сен 09, 11:59    [7630676]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Mari-Salt
Member

Откуда:
Сообщений: 367
так надо, потому что в одной сроке должна бытьвся информация по недвижимости, и адрес и правообладатели и правоустанавливающие документы, назначение и многое другое, если так напишу тогда запрос будет не очень корректным
8 сен 09, 12:10    [7630740]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mari-Salt
так надо,

Кому надо ? Тетеньке-бухгалтеру ?
Она не любит листать списки и хочет все видеть в одном столбце ?
8 сен 09, 12:15    [7630777]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Mari-Salt
Member

Откуда:
Сообщений: 367
Glory,
Скажите пожалуйста вот в этой функции cast( isnull(T_documents.DocDate,'') as nvarchar)

дата формата datetime (16.08.2004) отображает как Aug 16 2004

Посмотрела в хелпе, да там есть но по результатам не собирается поля потому что там +
8 сен 09, 12:18    [7630801]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mari-Salt
Glory,
Скажите пожалуйста вот в этой функции cast( isnull(T_documents.DocDate,'') as nvarchar)

дата формата datetime (16.08.2004) отображает как Aug 16 2004

Посмотрела в хелпе, да там есть но по результатам не собирается поля потому что там +

Вы увидели, что вам надо читать про функцию CONVERT ?
8 сен 09, 12:20    [7630820]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Mari-Salt,

Чтото я по функции этого не заметил:)
8 сен 09, 13:50    [7631567]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
WarAnt
Mari-Salt,

Чтото я по функции этого не заметил:)


Сори, совсем забыл про эту "особенность" функций, не люблю их по причине указанной в топике:)

тогда надо будет вам еще одну табличку временную сваять и закинуть туда весь все эти списки а потом её приджойнивать к запросу.
8 сен 09, 13:57    [7631629]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить