我正在尝试优化具有以下代码的过程:
CREATE TABLE #t1 (c1 int, c2 varchar(20), c3(varchar(50)...)
CREATE CLUSTERED INDEX ix_t1 ON #t1(c3) ON [PRIMARY]
我想通过将CLUSTERED索引移动到表声明(更多缓存友好)来改进它,但c3不是唯一的,所以这不起作用:
CREATE TABLE #t1 (c1 int, c2 varchar(20), c3 varchar(50)..., UNIQUE CLUSTERED (c3))
有没有办法声明一个在临时表声明中不唯一的聚簇?
答案 0 :(得分:2)
是的,可以在SQL Server 2014及更高版本中使用Create table on MSDN。 从2014年开始,您可以使用create table语句指定内联索引。
DB::select("SELECT t1.* FROM prd_data t1 WHERE t1.id = (SELECT t2.id
FROM prd_data t2
WHERE t2.sub_prd_id= t1.sub_prd_id
ORDER BY t2.created_at DESC
LIMIT 1)");
答案 1 :(得分:1)
否则没有...在表创建中将聚簇定义为选项的能力的存在是支持声明主键和唯一列约束,它们自己创建索引。换句话说,CLUSTERED
语句中的CREATE TABLE
指定UNIQUE
约束创建的索引是应该是聚簇还是非聚簇,这很重要,因为一个表只能有一个聚簇索引。
答案 2 :(得分:0)
可以通过添加identity
列来完成此操作,例如:
CREATE TABLE #t1 (rowID int not null identity(1,1),
c1 int, c2 varchar(20), c3 varchar(50),
UNIQUE CLUSTERED (c3,rowID)
)
在索引中包含rowID
将确保它是唯一的,即使c3
不是。
验证使用以下命令创建的索引:
EXEC tempdb.dbo.sp_helpindex '#t1'