Sql server SQL Server:多连接查询优化

Sql server SQL Server:多连接查询优化,sql-server,Sql Server,我刚刚开始使用Microsoft SQL Server,我面临一个问题,我认为这是一个SQL优化问题。你能看一下(见下文)并给我你的反馈吗 我有两个表,定义如下: floatTable (DateAndTime datetime2(7), TagIndex smallint, Val float) stringTable (DateAndTime datetime2(7), TagIndex smallint,

我刚刚开始使用Microsoft SQL Server,我面临一个问题,我认为这是一个SQL优化问题。你能看一下(见下文)并给我你的反馈吗

我有两个表,定义如下:

floatTable (DateAndTime datetime2(7),
            TagIndex smallint,
            Val float)

stringTable (DateAndTime datetime2(7),
            TagIndex smallint,
            Val float)
我用来得到结果的SQL查询是(不要笑):

问题:最大的问题是,即使我得到了正确的结果,对于大量数据,查询速度也会非常慢。我很确定还有另一种方法来编写查询,但目前我没有任何其他想法

你能给我一个提示吗?感谢你方的任何帮助

先谢谢你


@基里尔和帕特里克

使用您的提示和想法,我使用pivot表重新编写了原始查询。 不幸的是,我仍然必须使用内部联接,因为stringTable中的值(Val)是字符串,而floatTable中的值(Val)是浮点。老实说,我必须对这两个查询执行更多的测试,因为我看不到真正的改进(时间方面),使用pivot表;除了查询的长度之外。最后一件事,我已经将查询嵌入到存储过程中。请查看以下“最终”代码:


再次感谢您的指导

开始将
DateAndTime
TagIndex
放入索引中。那会有所不同

另一方面,如果不需要重复的内部联接,查询速度可能会快得多

您能否将
不同的
替换为单个
组,并使用
min
max

另一个选项是使用透视表

像这样:

select *
from   FloatTable
pivot (min(DateAndTime) x, min(Val) y in ([1],[2],[3], ...))

我认为使用透视表会更有效:

DECLARE @startDate DATETIME, @endDate DATETIME
SET @startDate = '20130312 9:00:00'
SET @endDate = '20130313 9:00:00'


SELECT st.DateAndTime
      , pvt.0 AS Winch_1
      , pvt.1 AS Winch_2
      , pvt.2 AS Winch_3
      , pvt.3 AS Winch_4
      , pvt.4 AS Winch_5
      , pvt.5 AS Winch_6
      , pvt.6 AS Winch_7
      , pvt.7 AS Winch_8
      , pvt.8 AS Latitude
      , pvt.9 AS Longitude
FROM StringTable st
INNER JOIN FloatTable ft on st.DateandTime=ft.DateandTime
pivot 
 ( MAX(Val) for [TagIndex] in ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9])
 order by [st.DateAndTime]
 )pvt

我还没有测试过它,所以你可能需要稍微调整一下,才能让它工作。

好的。另一个想法:为什么不使用透视表呢?谢谢你的及时回复。我想补充更多的澄清。我忘了提到DateAndTime列已经被集群索引,这确实改进了查询。我还想补充一点,此查询的目的是将时间范围内的数据(最多1天记录)报告到.csv文件中。时间范围从趋势图中选取,有开始日期和结束日期。我不确定这是否会有帮助…我应该提到,表和格式不是由我处理的,而是由第三方应用程序处理的。不幸的是,我还没有使用透视表的经验。无论如何,谢谢你的主意。非常感谢你的时间。我将对你的例子做一些研究。干杯@Kiril。我想我现在明白了。非常感谢你们所有人。
select *
from   FloatTable
pivot (min(DateAndTime) x, min(Val) y in ([1],[2],[3], ...))
DECLARE @startDate DATETIME, @endDate DATETIME
SET @startDate = '20130312 9:00:00'
SET @endDate = '20130313 9:00:00'


SELECT st.DateAndTime
      , pvt.0 AS Winch_1
      , pvt.1 AS Winch_2
      , pvt.2 AS Winch_3
      , pvt.3 AS Winch_4
      , pvt.4 AS Winch_5
      , pvt.5 AS Winch_6
      , pvt.6 AS Winch_7
      , pvt.7 AS Winch_8
      , pvt.8 AS Latitude
      , pvt.9 AS Longitude
FROM StringTable st
INNER JOIN FloatTable ft on st.DateandTime=ft.DateandTime
pivot 
 ( MAX(Val) for [TagIndex] in ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9])
 order by [st.DateAndTime]
 )pvt