Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
C...R...a...S...H Member Откуда: Сообщений: 188 |
Народ подскажите, может я чего-то не понимаю У меня есть хранимка в которой по переданному ей условию выполняется тот или иной запрос. При выполнении этой хранимки Execution plan показывает будто бы он выполняет все возможные запросы в этой хранимки из-за этого время выполнения просто зашкаливает!!! Как от этого избавиться |
30 янв 06, 11:09 [2299701] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
План строится ДО выполнениия. И т.к. значения параметров на данный момент неизвестны, то план строится для всех команд процедуры. |
||
30 янв 06, 11:10 [2299712] Ответить | Цитировать Сообщить модератору |
Павел Воронцов Member Откуда: Новосибирск Сообщений: 2387 Блог |
Текст процедуры - в студию. Можно без излишних подробностей (навороченных селектов, комметнариев и пр.), только структуру. |
||
30 янв 06, 11:12 [2299719] Ответить | Цитировать Сообщить модератору |
Павел Воронцов Member Откуда: Новосибирск Сообщений: 2387 Блог |
Это точно так? А то помнится мне пример из БОЛ, в котором предлагалось разносить разные запросы по процедурам и вызывать уже их в зависимости от входных параметров. Именно под тем флагом, что каждому запросу по плану! |
||
30 янв 06, 11:14 [2299731] Ответить | Цитировать Сообщить модератору |
C...R...a...S...H Member Откуда: Сообщений: 188 |
ALTER PROCEDURE dbo.Select_tblContract @IDContract int=-1, @IDClient int=-1 AS SET CONCAT_NULL_YIELDS_NULL OFF if @IDContract<>-1 and @IDClient<>-1 SELECT tblContract_1.IDContract, tblContract_1.IDClient, tblContract_1.IDProject, tblContract_1.IDCycleDocument, tblContract_1.DateBeginCycle, tblContract_1.NumberContract, tblContract_1.IDClientFirma, tblContract_1.IDTitleDocument, tblContract_1.IDClientPay, tblContract_1.DateContract, tblContract_1.DateBegin, tblContract_1.DateEnd, tblContract_1.IDContractNext, tblContract_1.NumberStage, tblContract_1.DateBeginStage, tblContract_1.DateEndStage, tblContract_1.Closed, tblContract_1.ForNDS, tblContract_1.NoMoney, tblContract_1.CodeBuh, tblContract_1.NumberContractBuh, tblContract_1.Comment, tblContract_1.CommentPlus, tblContract_1.IDKindPay, tblContract_1.Cash, tblContract_1.IDEmployeeCom, tblContract_1.CommentAccount, tblContract_1.PathContract, tblContract_1.NameService, tblClient_1.Title AS Client, sprProject.Title AS Project, sprCycleDocument.Title AS CycleDocument, tblClient.Title AS ClientPay, tblClient_2.Title AS ClientFirma, sprTitleDocument.Title AS TitleDocument, tblContract.NumberContract AS ContractNext, sprKindPay.Title AS KindPay, tblEmployee.SurName + ' ' + tblEmployee.Title + ' ' + tblEmployee.Patronymic AS EmployeeCom FROM tblClient AS tblClient_2 RIGHT OUTER JOIN tblClient RIGHT OUTER JOIN tblContract AS tblContract_1 LEFT OUTER JOIN sprKindPay ON tblContract_1.IDKindPay = sprKindPay.IDKindPay LEFT OUTER JOIN tblContract ON tblContract_1.IDContractNext = tblContract.IDContract LEFT OUTER JOIN sprTitleDocument ON tblContract_1.IDTitleDocument = sprTitleDocument.IDTitleDocument ON tblClient.IDClient = tblContract_1.IDClientPay LEFT OUTER JOIN tblClient AS tblClient_1 ON tblContract_1.IDClient = tblClient_1.IDClient LEFT OUTER JOIN sprProject ON tblContract_1.IDProject = sprProject.IDProject ON tblClient_2.IDClient = tblContract_1.IDClientFirma LEFT OUTER JOIN sprCycleDocument ON tblContract_1.IDCycleDocument = sprCycleDocument.IDCycleDocument LEFT OUTER JOIN tblEmployee INNER JOIN tblEmployeeClient ON tblEmployee.IDEmployee = tblEmployeeClient.IDEmployee AND tblEmployee.IDEmployee = tblEmployeeClient.IDEmployee ON tblContract_1.IDEmployeeCom = tblEmployeeClient.IDEmployeeClient WHERE (tblContract_1.IDContract <> @IDContract) AND (tblContract_1.IDClient = @IDClient) ORDER BY tblContract_1.DateEnd DESC else if @IDContract<>-1 SELECT tblContract_1.IDContract, tblContract_1.IDClient, tblContract_1.IDProject, tblContract_1.IDCycleDocument, tblContract_1.DateBeginCycle, tblContract_1.NumberContract, tblContract_1.IDClientFirma, tblContract_1.IDTitleDocument, tblContract_1.IDClientPay, tblContract_1.DateContract, tblContract_1.DateBegin, tblContract_1.DateEnd, tblContract_1.IDContractNext, tblContract_1.NumberStage, tblContract_1.DateBeginStage, tblContract_1.DateEndStage, tblContract_1.Closed, tblContract_1.ForNDS, tblContract_1.NoMoney, tblContract_1.CodeBuh, tblContract_1.NumberContractBuh, tblContract_1.Comment, tblContract_1.CommentPlus, tblContract_1.IDKindPay, tblContract_1.Cash, tblContract_1.IDEmployeeCom, tblContract_1.CommentAccount, tblContract_1.PathContract, tblContract_1.NameService, tblClient_1.Title AS Client, sprProject.Title AS Project, sprCycleDocument.Title AS CycleDocument, tblClient.Title AS ClientPay, tblClient_2.Title AS ClientFirma, sprTitleDocument.Title AS TitleDocument, tblContract.NumberContract AS ContractNext, sprKindPay.Title AS KindPay, tblEmployee.SurName + ' ' + tblEmployee.Title + ' ' + tblEmployee.Patronymic AS EmployeeCom FROM tblClient AS tblClient_2 RIGHT OUTER JOIN tblClient RIGHT OUTER JOIN tblContract AS tblContract_1 LEFT OUTER JOIN sprKindPay ON tblContract_1.IDKindPay = sprKindPay.IDKindPay LEFT OUTER JOIN tblContract ON tblContract_1.IDContractNext = tblContract.IDContract LEFT OUTER JOIN sprTitleDocument ON tblContract_1.IDTitleDocument = sprTitleDocument.IDTitleDocument ON tblClient.IDClient = tblContract_1.IDClientPay LEFT OUTER JOIN tblClient AS tblClient_1 ON tblContract_1.IDClient = tblClient_1.IDClient LEFT OUTER JOIN sprProject ON tblContract_1.IDProject = sprProject.IDProject ON tblClient_2.IDClient = tblContract_1.IDClientFirma LEFT OUTER JOIN sprCycleDocument ON tblContract_1.IDCycleDocument = sprCycleDocument.IDCycleDocument LEFT OUTER JOIN tblEmployee INNER JOIN tblEmployeeClient ON tblEmployee.IDEmployee = tblEmployeeClient.IDEmployee AND tblEmployee.IDEmployee = tblEmployeeClient.IDEmployee ON tblContract_1.IDEmployeeCom = tblEmployeeClient.IDEmployeeClient WHERE (tblContract_1.IDContract = @IDContract) ORDER BY tblContract_1.DateEnd DESC else if @IDClient<>-1 SELECT tblContract_1.IDContract, tblContract_1.IDClient, tblContract_1.IDProject, tblContract_1.IDCycleDocument, tblContract_1.DateBeginCycle, tblContract_1.NumberContract, tblContract_1.IDClientFirma, tblContract_1.IDTitleDocument, tblContract_1.IDClientPay, tblContract_1.DateContract, tblContract_1.DateBegin, tblContract_1.DateEnd, tblContract_1.IDContractNext, tblContract_1.NumberStage, tblContract_1.DateBeginStage, tblContract_1.DateEndStage, tblContract_1.Closed, tblContract_1.ForNDS, tblContract_1.NoMoney, tblContract_1.CodeBuh, tblContract_1.NumberContractBuh, tblContract_1.Comment, tblContract_1.CommentPlus, tblContract_1.IDKindPay, tblContract_1.Cash, tblContract_1.IDEmployeeCom, tblContract_1.CommentAccount, tblContract_1.PathContract, tblContract_1.NameService, tblClient_2.Title AS ClientFirma, tblEmployee.SurName + ' ' + tblEmployee.Title + ' ' + tblEmployee.Patronymic AS EmployeeCom FROM tblClient AS tblClient_2 RIGHT OUTER JOIN tblContract AS tblContract_1 ON tblClient_2.IDClient = tblContract_1.IDClientFirma LEFT OUTER JOIN tblEmployee INNER JOIN tblEmployeeClient ON tblEmployee.IDEmployee = tblEmployeeClient.IDEmployee AND tblEmployee.IDEmployee = tblEmployeeClient.IDEmployee ON tblContract_1.IDEmployeeCom = tblEmployeeClient.IDEmployeeClient WHERE (tblContract_1.IDClient = @IDClient) ORDER BY tblContract_1.DateEnd DESC /* SELECT tblContract_1.IDContract, tblContract_1.IDClient, tblContract_1.IDProject, tblContract_1.IDCycleDocument, tblContract_1.DateBeginCycle, tblContract_1.NumberContract, tblContract_1.IDClientFirma, tblContract_1.IDTitleDocument, tblContract_1.IDClientPay, tblContract_1.DateContract, tblContract_1.DateBegin, tblContract_1.DateEnd, tblContract_1.IDContractNext, tblContract_1.NumberStage, tblContract_1.DateBeginStage, tblContract_1.DateEndStage, tblContract_1.Closed, tblContract_1.ForNDS, tblContract_1.NoMoney, tblContract_1.CodeBuh, tblContract_1.NumberContractBuh, tblContract_1.Comment, tblContract_1.CommentPlus, tblContract_1.IDKindPay, tblContract_1.Cash, tblContract_1.IDEmployeeCom, tblContract_1.CommentAccount, tblContract_1.PathContract, tblContract_1.NameService, tblClient_1.Title AS Client, sprProject.Title AS Project, sprCycleDocument.Title AS CycleDocument, tblClient.Title AS ClientPay, tblClient_2.Title AS ClientFirma, sprTitleDocument.Title AS TitleDocument, tblContract.NumberContract AS ContractNext, sprKindPay.Title AS KindPay, tblEmployee.SurName+' ' + tblEmployee.Title +' '+ tblEmployee.Patronymic AS EmployeeCom FROM tblClient AS tblClient_2 RIGHT OUTER JOIN tblClient RIGHT OUTER JOIN tblContract AS tblContract_1 LEFT OUTER JOIN sprKindPay ON tblContract_1.IDKindPay = sprKindPay.IDKindPay LEFT OUTER JOIN tblContract ON tblContract_1.IDContractNext = tblContract.IDContract LEFT OUTER JOIN sprTitleDocument ON tblContract_1.IDTitleDocument = sprTitleDocument.IDTitleDocument ON tblClient.IDClient = tblContract_1.IDClientPay LEFT OUTER JOIN tblClient AS tblClient_1 ON tblContract_1.IDClient = tblClient_1.IDClient LEFT OUTER JOIN sprProject ON tblContract_1.IDProject = sprProject.IDProject ON tblClient_2.IDClient = tblContract_1.IDClientFirma LEFT OUTER JOIN sprCycleDocument ON tblContract_1.IDCycleDocument = sprCycleDocument.IDCycleDocument LEFT OUTER JOIN tblEmployee INNER JOIN tblEmployeeClient ON tblEmployee.IDEmployee = tblEmployeeClient.IDEmployee AND tblEmployee.IDEmployee = tblEmployeeClient.IDEmployee ON tblContract_1.IDEmployeeCom = tblEmployeeClient.IDEmployeeClient WHERE (tblContract_1.IDClient = @IDClient) ORDER BY tblContract_1.DateEnd DESC */ else SELECT tblContract_1.IDContract, tblContract_1.IDClient, tblContract_1.IDProject, tblContract_1.IDCycleDocument, tblContract_1.DateBeginCycle, tblContract_1.NumberContract, tblContract_1.IDClientFirma, tblContract_1.IDTitleDocument, tblContract_1.IDClientPay, tblContract_1.DateContract, tblContract_1.DateBegin, tblContract_1.DateEnd, tblContract_1.IDContractNext, tblContract_1.NumberStage, tblContract_1.DateBeginStage, tblContract_1.DateEndStage, tblContract_1.Closed, tblContract_1.ForNDS, tblContract_1.NoMoney, tblContract_1.CodeBuh, tblContract_1.NumberContractBuh, tblContract_1.Comment, tblContract_1.CommentPlus, tblContract_1.IDKindPay, tblContract_1.Cash, tblContract_1.IDEmployeeCom, tblContract_1.CommentAccount, tblContract_1.PathContract, tblContract_1.NameService, tblClient_1.Title AS Client, sprProject.Title AS Project, sprCycleDocument.Title AS CycleDocument, tblClient.Title AS ClientPay, tblClient_2.Title AS ClientFirma, sprTitleDocument.Title AS TitleDocument, tblContract.NumberContract AS ContractNext, sprKindPay.Title AS KindPay, tblEmployee.SurName+' ' + tblEmployee.Title +' '+ tblEmployee.Patronymic AS EmployeeCom FROM tblClient AS tblClient_2 RIGHT OUTER JOIN tblClient RIGHT OUTER JOIN tblContract AS tblContract_1 LEFT OUTER JOIN sprKindPay ON tblContract_1.IDKindPay = sprKindPay.IDKindPay LEFT OUTER JOIN tblContract ON tblContract_1.IDContractNext = tblContract.IDContract LEFT OUTER JOIN sprTitleDocument ON tblContract_1.IDTitleDocument = sprTitleDocument.IDTitleDocument ON tblClient.IDClient = tblContract_1.IDClientPay LEFT OUTER JOIN tblClient AS tblClient_1 ON tblContract_1.IDClient = tblClient_1.IDClient LEFT OUTER JOIN sprProject ON tblContract_1.IDProject = sprProject.IDProject ON tblClient_2.IDClient = tblContract_1.IDClientFirma LEFT OUTER JOIN sprCycleDocument ON tblContract_1.IDCycleDocument = sprCycleDocument.IDCycleDocument LEFT OUTER JOIN tblEmployee INNER JOIN tblEmployeeClient ON tblEmployee.IDEmployee = tblEmployeeClient.IDEmployee AND tblEmployee.IDEmployee = tblEmployeeClient.IDEmployee ON tblContract_1.IDEmployeeCom = tblEmployeeClient.IDEmployeeClient ORDER BY tblContract_1.DateEnd DESC SET CONCAT_NULL_YIELDS_NULL ON Вот такой код Когда просто выполняю запрос где WHERE @IDClient то DURATION 1000, когда выполняю хранимке 4000. ЧТО ДЕЛАТЬ |
30 янв 06, 11:16 [2299742] Ответить | Цитировать Сообщить модератору |
tpg Member Откуда: Novosibirsk Сообщений: 23902 |
Можно вот так попробовать переписать начало процедуры
|
|
30 янв 06, 11:20 [2299760] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ну так потому и предлагалось, чтобы по ходу выполнениния не происходила перекомпиляции процедура. Из-за того, что при конкретных значениях параметров построенный прежде план становится не валидным. |
||||
30 янв 06, 11:20 [2299761] Ответить | Цитировать Сообщить модератору |
Павел Воронцов Member Откуда: Новосибирск Сообщений: 2387 Блог |
Впрочем, это я к частностям придираюсь и наверняка что-то как-то не так понял. Но сомнения остались. |
||
30 янв 06, 11:24 [2299783] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Речь идет не о парамиетрах, которые используются непосредственно в запросах. Речь идет о параметрах, из-за которых в процедуре появляется множество IF-ов. Как раз эти IF-и на этапе построения плана не могут быть учтены. Т.к. значения переменных на данный момент неизвестны. |
||||
30 янв 06, 11:30 [2299812] Ответить | Цитировать Сообщить модератору |
C...R...a...S...H Member Откуда: Сообщений: 188 |
Разницы ни какой!!!! |
|||
30 янв 06, 11:32 [2299818] Ответить | Цитировать Сообщить модератору |
C...R...a...S...H Member Откуда: Сообщений: 188 |
ВОПРОС ТО НЕ ПРО ПЛАН(ПЛАН ЭТО НЕ ТО) ВОПРОС В ТОМ ЧТО САМА ХРАНИМКА ВЫПОЛНЯЕТСЯ ДОЛГО!!! |
||||||
30 янв 06, 11:33 [2299828] Ответить | Цитировать Сообщить модератору |
tpg Member Откуда: Novosibirsk Сообщений: 23902 |
|
||
30 янв 06, 11:35 [2299836] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ну так как раз анализ узких мест процедуры нужно начинать с плана ее выполнение ЗЫ И не недо, пожалуйста, кричать |
||
30 янв 06, 11:35 [2299837] Ответить | Цитировать Сообщить модератору |
C...R...a...S...H Member Откуда: Сообщений: 188 |
Так при чем тут план! У меня хранимка выполняется в 4 раза дольше чем просто один запрос, как будто SQL выпонятет все запросы в хранимке. Как это побороть! |
30 янв 06, 11:40 [2299865] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Выполните команду SET SLOWEXECUTION OFF |
||
30 янв 06, 11:41 [2299874] Ответить | Цитировать Сообщить модератору |
tpg Member Откуда: Novosibirsk Сообщений: 23902 |
|
||
30 янв 06, 11:44 [2299892] Ответить | Цитировать Сообщить модератору |
C...R...a...S...H Member Откуда: Сообщений: 188 |
Server: Msg 195, Level 15, State 5, Procedure Select_tblContract, Line 12 'SLOWEXECUTION' is not a recognized option. |
||||
30 янв 06, 11:47 [2299901] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ууупс, чуда не произошло Значит придется все таки проанализировать планы выполнения. И вообще все события, которые происходят на сервере в процессе выполнения процедуры. |
||||||
30 янв 06, 11:48 [2299908] Ответить | Цитировать Сообщить модератору |
tpg Member Откуда: Novosibirsk Сообщений: 23902 |
+10 ![]() ![]() ![]() |
||||
30 янв 06, 11:48 [2299914] Ответить | Цитировать Сообщить модератору |
C...R...a...S...H Member Откуда: Сообщений: 188 |
Ну что ни кто не подсобит? |
30 янв 06, 15:15 [2301233] Ответить | Цитировать Сообщить модератору |
GreenSunrise Member Откуда: Сообщений: 12310 |
|
||||
30 янв 06, 15:19 [2301274] Ответить | Цитировать Сообщить модератору |
C...R...a...S...H Member Откуда: Сообщений: 188 |
Я что-то не пойму, зачем необходимо анализировать планы, когда по ним и так видно что выполняются все запросы из хранимки. ВОПРОС ТО ЗАКЛЮЧАЕТСЯ В ТОМ ПОЧЕМУ ВСЕ ЗАПРОСЫ ВЫПОЛНЯЮТСЯ КОГДА ОПРЕДЕЛЕННЫЕ ЗНАЧЕНИЯ УКАЗАНЫ В ЗАПРОСЕ |
30 янв 06, 16:33 [2301908] Ответить | Цитировать Сообщить модератору |
злой шаман Member Откуда: Питер Сообщений: 1253 |
Эти четыре запроса отличаются чем-нибудь еще, кроме раздела WHERE? |
30 янв 06, 16:39 [2301951] Ответить | Цитировать Сообщить модератору |
C...R...a...S...H Member Откуда: Сообщений: 188 |
В том который по @IDClient, там меньше связанных полей. А в целом одинаковые. |
30 янв 06, 16:42 [2301990] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Во-первых, прекратите кричать Во-вторых, если вы не хотите делать то, что вам советуют, то это уже ваша проблема |
||
30 янв 06, 16:44 [2302010] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |