我有一个包含4个参数的SSRS报告,其中两个参数是SQL Server 2008 R2中使用@material
数据类型的多值参数(@color
和VARCHAR(MAX)
)。我使用split函数以逗号分隔返回值:
SELECT *
FROM MyView
WHERE height > 200
AND width > 100
AND (
material IN (SELECT Item FROM [dbo].[MySplitFunction] (@material, ',')) OR
color IN (SELECT Item FROM [dbo].[MySplitFunction] (@color, ','))
)
(上面的代码将返回50条记录)
这种方法的问题在于这两个多值参数具有大约1,500种不同的颜色和材料,并且降低了性能。有时,返回结果需要40多分钟(视图中的行数大约为600,000)。
我尝试了一种不同的方法,我使用临时表并在JOIN
而不是WHERE
子句中使用它:
SELECT Item
INTO #TempTable
FROM [dbo].[MySplitFunction] (@material, ',')
SELECT *
FROM MyView
INNER JOIN ON MyView.Item = #TempTable.Item
WHERE height > 200
AND width > 100
AND material IN (SELECT Item FROM [dbo].[MySplitFunction] (@material, ','))
(上面的代码只返回7条记录,但性能要好得多) 我的问题是如何通过添加另一个@color参数并允许OR条件,使用第二种方法返回相同数量的记录(50行)?因此,在SSRS报告中,用户可以多选这两个参数,查询将返回@material = values OR @color = Values。 只要加速查询并允许两个多值参数(@material,@ color)的OR条件,我对任何其他方法都持开放态度。
谢谢!
答案 0 :(得分:1)
以下内容可能会起作用。我不确定我的语法是否正确,它需要进一步的测试和分析,如果没有适当的结构和数据我就无法做到......
SELECT
from MyVeiew
where height > 200
and width > 100
and (exists (select Item
from dbo.MySplitFunction(@material, ',')
where Item = material)
or exists (select Item
from dbo.MySplitFunction(@color, ',')
where Item = color)
)
这将在嵌套函数调用上执行两个相关的子查询。在这些情况下,Exists
检查通常比in
查询更快。令我担心的语法位是"和(存在"位 - 这是OR子句的括号,并且与存在相结合它看起来有点不稳定。
我认为它应该做你想要的,但绝对需要进行测试。
我不信任or
条款。要摆脱它,试试这个,看看会发生什么:
SELECT * -- Better with specific columns
from MyView
where height > 200
and width > 100
and exists (select Item
from dbo.MySplitFunction(@material, ',')
where Item = material)
UNION select *
from MyView
where height > 200
and width > 100
and exists (select Item
from dbo.MySplitFunction(@color, ',')
where Item = color)
这会运行并组合两个查询,删除所有重复项 - 与OR子句几乎相同。
接下来要检查的是检查表大小和检查索引。您在(仅!)列高度,宽度,材质和颜色上过滤结果;如果表格很大,那么适当的索引会有所帮助。