Sql server SQL Server:多连接查询优化
我刚刚开始使用Microsoft SQL Server,我面临一个问题,我认为这是一个SQL优化问题。你能看一下(见下文)并给我你的反馈吗 我有两个表,定义如下: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,
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