powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Оптимизация хранимой процедуры
12 сообщений из 12, страница 1 из 1
Оптимизация хранимой процедуры
    #34770547
cosmo_vk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем существует хранимая процедура выбирающая значения в нескольких табличках по условию(по ФИО или по адресу). Можно ли заменить условие, т.е. всё включая where, на переменную, а это переменную я буду уже писать в программе.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
PROCEDURE [dbo].[SelectZem]
           @FIO varchar( 50 ) = null,
	@Adress varchar( 50 ) = null
AS
select FizLico.N10 as [ФИО], FizLico.N103 as [Дата рождения],  address.FullAdress as [Адрес места нахождения собственности] FROM Sobstv
JOIN FizLico ON Sobstv.N1=FizLico.N1                               
                             left JOIN ZemelSob on Sobstv.D93 = ZemelSob.D93  
                             join address.FullAdress on FizLico.N31=address.N31
where  (FizLico.N10 like @FIO) or (address.FullAdress like @Adress)
 
на примерно такое:
Код: plaintext
1.
2.
3.
4.
5.
PROCEDURE [dbo].[SelectZem]
         @uslovie varchar( 200 )
.....
 join address.FullAdress on FizLico.N31=address.N31
(@uslovie)
 
Соотвественно это uslovie, я буду писать в программе. Попытался сделать через varchar, но в строке подстановки идет
Код: plaintext
1.
join address.FullAdress on FizLico.N31=address.N31 
'where address.FullAdress like 'Вишневая%' order by [ФИО]'
Т.е. добавляются ' '. Как это можно обойти?
Используются SQL Server2005 и клиентское приложение на C#.NET(VS2005)
...
Рейтинг: 0 / 0
Оптимизация хранимой процедуры
    #34770604
mozart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ybxt yt gjyzk/



declare @s nvarchar(1000)

select @s = "select * from Table1"
select @s = @s + " where "
select @s = @s + @condition

exec(@s)
...
Рейтинг: 0 / 0
Оптимизация хранимой процедуры
    #34771024
cosmo_vk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mozartYbxt yt gjyzk/
declare @s nvarchar(1000)

select @s = "select * from Table1"
select @s = @s + " where "
select @s = @s + @condition

exec(@s)да боюсь на первой строчке и запнется. В табличках Sobstv и FizLico в каждой около 200000 записей. То есть пока отберет, юзеры просто замучаются ждать или возможно вылетит в Exception по connect timeout, который сейчас составляет минуту. Но все равно спасибо, попробую этот вариант. Если не прокатит, придеться в программе писать этот select и уже кидать на сервер. А это ой как не хочеться... :(
...
Рейтинг: 0 / 0
Оптимизация хранимой процедуры
    #34772103
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozartexec(@s)Лучше использовать sp_executesql. Это позволит передавать параметры, благодаря которым не будет строиться отдельный план выполнения для каждого значения фильтра.
cosmo_vkда боюсь на первой строчке и запнется. В табличках Sobstv и FizLico в каждой около 200000 записей.Необязательно. Всё зависит от плана выполнения запроса. Добавьте необходимые индексы, постройте правильно запрос и всё "полетит".
cosmo_vkЕсли не прокатит, придеться в программе писать этот select и уже кидать на серверЕсли не прокатит вариант с генерацией динамического SQL в хранимой процедуре, то его генерация на клиенте не прокатит тоже.
...
Рейтинг: 0 / 0
Оптимизация хранимой процедуры
    #34772397
mozart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не понял вопрос про синтаксис или про оптимизацию?
Про синтаксис я ответил, хотя навеное лучше sp_executesql.

Для убыстрения поиска нужны индексы.

Если условий всего два (по ФИО или по адресу), то лучше написать процедуру с двумя параметрами:

Proc( @p1, @p2 )
Begin
Select <pppppp> from <pppppp> where X = @p1 and Y = @p2
End

Другой случай, если параметров много и их число переменно. А это означает, что всех комбинаций параметров не предусмотришь. Тогда у себя в базе я формировал строку условия. Можно в клиенте, можно в сервере.
...
Рейтинг: 0 / 0
Оптимизация хранимой процедуры
    #34773298
tsaritsin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
клиентское приложение на C#.NET(VS2005)

Код: plaintext
1.
private string _cmd = "select * from Table1 ..." + "where [ФИО] like 'Иванов%' "
SqlComand SqlCmd = new SqlComand(_cmd)
...
Рейтинг: 0 / 0
Оптимизация хранимой процедуры
    #34775852
cosmo_vk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tsaritsin
Код: plaintext
1.
private string _cmd = "select * from Table1 ..." + "where [ФИО] like 'Иванов%' "
SqlComand SqlCmd = new SqlComand(_cmd)
Это с самого начала было в программе, потом все селекты убрали в хранимки с входными параметрами. И "зашивать" отбор в программу как-то плохо, в дальнейшем это аукнеться. Да и на всех ресурсах советуют отделять "мух от котлет".

вообще вот так:
Код: plaintext
private string _cmd = "select * from Table1 ..." + moe_uslovie.ToString();
вот это условие и будет формировать в зависимости от того что нажали в программе и что ввели.

На счет предыдущих постов, попробуй сделать как вы мне посоветовали. Спасибо за советы! :)
...
Рейтинг: 0 / 0
Оптимизация хранимой процедуры
    #34778304
cosmo_vk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mozartЯ не понял вопрос про синтаксис или про оптимизацию?
Про синтаксис я ответил, хотя навеное лучше sp_executesql.

Для убыстрения поиска нужны индексы.
Если условий всего два (по ФИО или по адресу), то лучше написать процедуру с двумя параметрами:
Proc( @p1, @p2 )
Begin
Select <pppppp> from <pppppp> where X = @p1 and Y = @p2
End
Другой случай, если параметров много и их число переменно. А это означает, что всех комбинаций параметров не предусмотришь. Тогда у себя в базе я формировал строку условия. Можно в клиенте, можно в сервере.
Параметров будет больше, чем два - из-за этого и делается эта переделка

P.S. кстати куда вставляется declare @s nvarchar(1000), внутри процедуры ругается на превышение количества символов(больше 128)("The identifier that starts with 'select ...' is too long. Maximum length is 128). Я сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ALTER PROCEDURE [dbo].[SelectImush]
	@uslovie nvarchar( 300 )
AS
declare @smain nvarchar( 2000 );
-- используется Select из базы
select @smain = "select FizLico.N10 as [ФИО], FizLico.N103 as [Дата рождения],  address.FullAdress as [Адрес места нахождения собственности] FROM Sobstv
JOIN FizLico ON Sobstv.N1=FizLico.N1                               
                             left JOIN ZemelSob on Sobstv.D93 = ZemelSob.D93  
                             join address.FullAdress on FizLico.N31=address.N31 "
select @smain = @smain + "where "
select @smain = @smain + @uslovie
select @smain = @smain + " order by [ФИО]"

exec(@smain)
...
Рейтинг: 0 / 0
Оптимизация хранимой процедуры
    #34778523
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т. е. совет про sp_executesql вы проигнорировали. Зря...
...
Рейтинг: 0 / 0
Оптимизация хранимой процедуры
    #34778590
cosmo_vk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КТ. е. совет про sp_executesql вы проигнорировали. Зря...да нет, просто начал разбираться и сначала делал по верхнему примеру.
...
Рейтинг: 0 / 0
Оптимизация хранимой процедуры
    #34778713
mozart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В SQL Server для строк кавычки одинарные вот такие : '
...
Рейтинг: 0 / 0
Оптимизация хранимой процедуры
    #34778901
cosmo_vk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mozartВ SQL Server для строк кавычки одинарные вот такие : 'спасибо, поправил. проверку проходит, процедура изменилась и выдает то что надо.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Оптимизация хранимой процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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