|
|
|
Оптимизация хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
В общем существует хранимая процедура выбирающая значения в нескольких табличках по условию(по ФИО или по адресу). Можно ли заменить условие, т.е. всё включая where, на переменную, а это переменную я буду уже писать в программе. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. Используются SQL Server2005 и клиентское приложение на C#.NET(VS2005) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2007, 01:13 |
|
||
|
Оптимизация хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Ybxt yt gjyzk/ declare @s nvarchar(1000) select @s = "select * from Table1" select @s = @s + " where " select @s = @s + @condition exec(@s) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2007, 06:53 |
|
||
|
Оптимизация хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
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 и уже кидать на сервер. А это ой как не хочеться... :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2007, 11:14 |
|
||
|
Оптимизация хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
mozartexec(@s)Лучше использовать sp_executesql. Это позволит передавать параметры, благодаря которым не будет строиться отдельный план выполнения для каждого значения фильтра. cosmo_vkда боюсь на первой строчке и запнется. В табличках Sobstv и FizLico в каждой около 200000 записей.Необязательно. Всё зависит от плана выполнения запроса. Добавьте необходимые индексы, постройте правильно запрос и всё "полетит". cosmo_vkЕсли не прокатит, придеться в программе писать этот select и уже кидать на серверЕсли не прокатит вариант с генерацией динамического SQL в хранимой процедуре, то его генерация на клиенте не прокатит тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2007, 15:42 |
|
||
|
Оптимизация хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Я не понял вопрос про синтаксис или про оптимизацию? Про синтаксис я ответил, хотя навеное лучше sp_executesql. Для убыстрения поиска нужны индексы. Если условий всего два (по ФИО или по адресу), то лучше написать процедуру с двумя параметрами: Proc( @p1, @p2 ) Begin Select <pppppp> from <pppppp> where X = @p1 and Y = @p2 End Другой случай, если параметров много и их число переменно. А это означает, что всех комбинаций параметров не предусмотришь. Тогда у себя в базе я формировал строку условия. Можно в клиенте, можно в сервере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2007, 16:47 |
|
||
|
Оптимизация хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
клиентское приложение на C#.NET(VS2005) Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2007, 09:23 |
|
||
|
Оптимизация хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
tsaritsin Код: plaintext 1. вообще вот так: Код: plaintext На счет предыдущих постов, попробуй сделать как вы мне посоветовали. Спасибо за советы! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2007, 20:09 |
|
||
|
Оптимизация хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2007, 16:04 |
|
||
|
Оптимизация хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Т. е. совет про sp_executesql вы проигнорировали. Зря... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2007, 16:48 |
|
||
|
Оптимизация хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Алексей КТ. е. совет про sp_executesql вы проигнорировали. Зря...да нет, просто начал разбираться и сначала делал по верхнему примеру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2007, 16:58 |
|
||
|
Оптимизация хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
В SQL Server для строк кавычки одинарные вот такие : ' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2007, 17:22 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=34770547&tid=1352638]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
130ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 223ms |
| total: | 454ms |

| 0 / 0 |
