在下面的查询中,在连接条件中使用的列上使用索引有什么好处?
select * from table_a
inner join table_b on
table_a.col1 = table_b.col1 and
table_a.col2 = table_b.col2
Run Code Online (Sandbox Code Playgroud)
在上面的join中,是否有利于索引表 table_a(col1,col2)
或表table_b(col1,col2)
中列的顺序是否影响性能?
如果假设有一个索引table_b(col1,col2)
。这是否意味着我们需要按如下方式更改查询?
select * from table_a
inner join table_b on
table_b.col1 = table_a.col1 and
table_b.col2 = table_a.col2
Run Code Online (Sandbox Code Playgroud) 我有一个查询如下:
SELECT @tenor_from =CONVERT(DATETIME,MIN(spc.maturity_date),103)
FROM source_price_curve spc
INNER JOIN #source_price_curve_list spcl
ON spc.source_curve_def_id = spcl.price_curve_id
WHERE spc.as_of_date >= @as_of_date_from
Run Code Online (Sandbox Code Playgroud)
运行需要将近 12 秒。从连接中删除临时表 #source_price_curve_list 会在不到 1 秒的时间内给出结果。
该source_price_curve
表有 1.3 亿条记录。临时表#source_price_curve_list
在输出中有一条记录(如下所示)。将来可能会包含更多数据
select * from #source_price_curve_list
rowID price_curve_id
1 1
Run Code Online (Sandbox Code Playgroud)
为什么与单记录临时表的内部连接会使查询花费更长的时间?我需要将查询运行时间减少到 1 秒以内。
以下链接提供了带有连接的查询的执行计划:
https://www.brentozar.com/pastetheplan/?id=BksaaWjSb
没有join to temp table的查询运行不到1秒,执行计划链接如下:
https://www.brentozar.com/pastetheplan/?id=BJ2_3boSZ
表 source_price_curve 创建如下:
CREATE TABLE [dbo].[source_price_curve](
[source_curve_def_id] [int] NOT NULL,
[as_of_date] [datetime] NOT NULL,
[Assessment_curve_type_value_id] [int] NOT NULL,
[curve_source_value_id] [int] NOT NULL,
[maturity_date] [datetime] NOT NULL,
[curve_value] [float] NOT …
Run Code Online (Sandbox Code Playgroud) 我有一个 1.5 TB 的数据库,之前只有 200 GB 的可用空间。由于性能问题,企业决定将 1 个月的数据保留政策减少到 1 周。由于这 3 周的数据被删除,现在它有 700 GB 的可用空间空间。
不再需要因数据删除而增加的 500 GB 可用空间,并且没有机会再次增长数据以占用这 500 GB 空间。
我计划收缩数据库(使用收缩文件命令)并运行索引优化过程来重建索引,如果碎片大于 30%。释放的空间不会被其他系统使用,但是可以在不久的将来有效地用于日志文件和临时数据库的增长。
除了空间释放之外,通过减小数据库的大小是否对性能有任何好处?
以前与缩小(在堆栈交换中)相关的问题没有正确回答我的查询。
预先感谢您的友好回复!!!