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

Откуда: мяуский кот, родом из мая
Сообщений: 1299
На вход в процедуру поступает множество параметров для фильтрации с мультивыбором.
Это строки nvarchar(max), в которых через разделитель (запятую) перечислены GUIDы или int.
Например, набор типов, статусов, объектов, по которым надо отфильтровать результирующий набор.

Строчка разворачивается в столбец и "иннерджойнится" с той таблицей, которая подлежит фильтрации.

Наприммер, так:
		--------------- фильтр по конкретным субкорпусам с мультивыбором
		INNER JOIN
	    (
			SELECT CAST(Field as uniqueidentifier)  as Field 
			FROM [dbo].[pik_fn_GetTableFromParam](NULLIF(@new_bulk_multi, ''), ',')
		) bk
		on bk.Field = be.new_bulkId or @new_bulk_multi = ''


Варианты реализации функции pik_fn_GetTableFromParam, которая реализует разворачивает строку в столбец были испробованы разные, вплоть до встраивания запроса вовнутрь, без использования функции.

Но такой фильтр в любом случае заметно тормозит работу.
Чем больше значений в нём указано (через запятую), тем медленнее будет работать запрос.

Если таких фильтров задано много, то беда-беда!

Может есть более прогрессивные подходы решению к этой стандартной часто возникающей задачи?
9 апр 13, 16:59    [14157974]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
начинающий sql-гуру,

на вход процедуры можно сразу передать параметр табличного типа.
9 апр 13, 17:05    [14158019]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
Glory
Member

Откуда:
Сообщений: 104751
начинающий sql-гуру
Это строки nvarchar(max), в которых через разделитель (запятую) перечислены GUIDы или int.

И что формирует эти строки ?
9 апр 13, 17:07    [14158028]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
начинающий sql-гуру
Member

Откуда: мяуский кот, родом из мая
Сообщений: 1299
Shakill
начинающий sql-гуру,

на вход процедуры можно сразу передать параметр табличного типа.

Это с клиентчиками ещё перетереть надо.
Насколько им трудоёмко будет перепилить это со своей стороны.
Но, наверное, профит того стоит.
9 апр 13, 17:08    [14158043]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
начинающий sql-гуру
Member

Откуда: мяуский кот, родом из мая
Сообщений: 1299
Glory
начинающий sql-гуру
Это строки nvarchar(max), в которых через разделитель (запятую) перечислены GUIDы или int.

И что формирует эти строки ?

Клиентское приложение.
В нём пользователь делает либо мультиселект в гриде, либо ставит несколько галочек в выпадающем списке.
Процедура вызывается с перечислением в строчку id выбранных пунктов.
9 апр 13, 17:16    [14158111]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
Glory
Member

Откуда:
Сообщений: 104751
начинающий sql-гуру
Клиентское приложение.
В нём пользователь делает либо мультиселект в гриде, либо ставит несколько галочек в выпадающем списке.

Почему бы клиентскому приложению не формировать на сервере таблицу вместо строк ?
Которые все равно парсятся в таблицу
9 апр 13, 17:20    [14158131]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Shakill
начинающий sql-гуру,

на вход процедуры можно сразу передать параметр табличного типа.

У меня это реализовано так:
-- входящий параметр
@city           varchar(MAX) = NULL --'<roots><fc><city>Москва</city></fc><fc><city>Самара</city></fc></roots>'

-- в коде
SELECT @xml = CONVERT(xml, @city)   
         
    CREATE TABLE #city  -- получение списка городов
    (
        city varchar(30) NULL
    )    
    INSERT INTO #city (city)
    SELECT 
        col.value('city[1]', 'varchar(30)')
    FROM @xml.nodes('roots/fc') AS FilterCity(col)  

...
WHERE city IN (SELECT city FROM #city) 
  

Или лучше всё же пользоваться параметрами табличного типа ? (ms sql 2012)
9 апр 13, 17:26    [14158163]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
trew,

смотрите сами. по быстродействию, удобству и т.д.
9 апр 13, 17:38    [14158227]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
начинающий sql-гуру
Member

Откуда: мяуский кот, родом из мая
Сообщений: 1299
Glory
начинающий sql-гуру
Клиентское приложение.
В нём пользователь делает либо мультиселект в гриде, либо ставит несколько галочек в выпадающем списке.

Почему бы клиентскому приложению не формировать на сервере таблицу вместо строк ?
Которые все равно парсятся в таблицу

Это как?
Перед запуском основной процедуры выполнить из клиентского кода запрос на создание нескольких таблиц, содержащих фильтры?
Причём с (пере)созданием отдельной таблицы для каждого пользователя, либо с записью информации опользователе и с текущей датой+временем воизбежание получения некорректных фильтров?

Или я что-то не так понимаю?
9 апр 13, 17:41    [14158255]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
начинающий sql-гуру
Member

Откуда: мяуский кот, родом из мая
Сообщений: 1299
Shakill
trew,
смотрите сами. по быстродействию, удобству и т.д.

Ну, если в 3,5 .NET-е есть способ приведения коллекций или DataTable к SQL-евскому типу табличной переменной, то это было бы здорово.
9 апр 13, 17:43    [14158266]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
Glory
Member

Откуда:
Сообщений: 104751
начинающий sql-гуру
Это как?
Перед запуском основной процедуры выполнить из клиентского кода запрос на создание нескольких таблиц, содержащих фильтры?

Хотя бы так
9 апр 13, 17:47    [14158285]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
Glory
начинающий sql-гуру
Это как?
Перед запуском основной процедуры выполнить из клиентского кода запрос на создание нескольких таблиц, содержащих фильтры?

Хотя бы так


таблицы-то наверное создавать не нужно, они будут предопределённые,
а приложение в них будет напихивать строчки с идентификатором своей сессии и значениями параметра.
10 апр 13, 01:16    [14159439]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
начинающий sql-гуру
Member

Откуда: мяуский кот, родом из мая
Сообщений: 1299
Выяснил, что в последнем .NET-е есть
SqlDbType.Structured - это как раз под передачу таблиц-переменных в процедуры (TVP).

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

Так что однофигственно, походу, что передавать: строку, xml или TVP.((
10 апр 13, 11:35    [14160698]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
начинающий sql-гуру,

но в табличной переменной можно сделать индексы.
Глядишь, полегчает.
10 апр 13, 11:40    [14160733]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
начинающий sql-гуру,

но в табличной переменной можно сделать индексы.
Глядишь, полегчает.
Хотя, при небольшом количестве записей ненамного
10 апр 13, 11:41    [14160743]     Ответить | Цитировать Сообщить модератору
 Re: Фильтры с мультиселектом. Как лучше реализовывать?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
начинающий sql-гуру
Так что однофигственно, походу, что передавать: строку, xml или TVP.((
Да, по быстродействию неважно.
Смотрите на удобство программирования, отладки, поддержки, защиты от взлома...
10 апр 13, 11:47    [14160790]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить