我有一张桌子:
CREATE TABLE [dbo].[Realty](
[Id] [int] IDENTITY(1,1) NOT NULL,
[RankingBonus] [int] NOT NULL,
[Ranking] AS ([Id]+[RankingBonus]) PERSISTED NOT NULL
....
)
Run Code Online (Sandbox Code Playgroud)
还有一个观点:
CREATE View [dbo].[FilteredRealty] AS
SELECT
realty.Id as realtyId,
...
COALESCE(realty.Wgs84X, ruian_cobce.Wgs84X, ruian_obec.Wgs84X) as Wgs84X,
COALESCE(realty.Wgs84Y, ruian_cobce.Wgs84Y, ruian_obec.Wgs84Y) as Wgs84Y,
realty.Ranking,
...
FROM realty
JOIN Category ON realty.CategoryId = Category.Id
LEFT JOIN ruian_cobce ON realty.cobceId = ruian_cobce.cobce_kod
LEFT JOIN ruian_obec ON realty.obecId = ruian_obec.obec_kod
LEFT JOIN okres ON realty.okresId = okres.okres_kod
LEFT JOIN ExternFile ON realty.Id = ExternFile.ForeignId AND …
Run Code Online (Sandbox Code Playgroud) 在 SQL Server 2012 中,我有一个表值函数,它连接到另一个表,我需要计算这个“表值函数”的行数。当我检查执行计划时,我可以看到左连接表。为什么?左连接表如何影响返回的行数?我希望数据库引擎不需要在 SELECT count(..) 查询中评估左联合表。
Select count(realtyId) FROM [dbo].[GetFilteredRealtyFulltext]('"praha"')
Run Code Online (Sandbox Code Playgroud)
执行计划:
表值函数:
CREATE FUNCTION [dbo].[GetFilteredRealtyFulltext]
(@criteria nvarchar(4000))
RETURNS TABLE
AS
RETURN (SELECT
realty.Id AS realtyId,
realty.OwnerId,
realty.Caption AS realtyCaption,
realty.BusinessCategory,
realty.Created,
realty.LastChanged,
realty.LastChangedType,
realty.Price,
realty.Pricing,
realty.PriceCurrency,
realty.PriceNote,
realty.PricePlus,
realty.OfferState,
realty.OrderCode,
realty.PublishAddress,
realty.PublishMap,
realty.AreaLand,
realty.AreaCover,
realty.AreaFloor,
realty.Views,
realty.TopPoints,
realty.Radius,
COALESCE(realty.Wgs84X, ruian_cobce.Wgs84X, ruian_obec.Wgs84X) as Wgs84X,
COALESCE(realty.Wgs84Y, ruian_cobce.Wgs84Y, ruian_obec.Wgs84Y) as Wgs84Y,
realty.krajId,
realty.okresId,
realty.obecId,
realty.cobceId,
IsNull(CONVERT(int,realty.Ranking),0) as Ranking,
realty.energy_efficiency_rating,
realty.energy_performance_attachment,
realty.energy_performance_certificate,
realty.energy_performance_summary,
Category.Id AS CategoryId,
Category.ParentCategoryId,
Category.WholeName,
okres.nazev AS …
Run Code Online (Sandbox Code Playgroud) 过去,我选择创建的datetime
列作为表中不合适的聚集索引。
现在我得出结论(基于执行计划)选择 ID身份主键作为聚集键会更好,因为它经常被作为外键引用。
我想删除当前的聚集键并创建一个新的,但我不能删除主键,因为full-text
索引依赖于该主键。
我可以将主键切换为聚集索引还是需要删除主键和所有依赖对象的链?
下面你会找到表定义和聚集索引定义。
CREATE TABLE [dbo].[Realty](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Created] [datetime] NOT NULL,
....
CONSTRAINT [PK_Realty] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
...
CREATE CLUSTERED INDEX [Created] ON [dbo].[Realty]
(
[Created] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE …
Run Code Online (Sandbox Code Playgroud) foreign-key sql-server primary-key clustered-index full-text-search
我了解单索引列在 SQL Server 中是如何工作的,以及它是如何使用平衡树实现的。YouTube上有很多关于这个主题的有趣视频。但是,如果索引基于多列,我不明白它是如何工作的。例如:
CREATE NONCLUSTERED INDEX idxItemsCatState
ON Items (Category,OfferState)
INCLUDE ([Id],[Ranking])
Run Code Online (Sandbox Code Playgroud)
以及它如何加速查询,例如
SELECT ID, Ranking FROM Items where Category = 1 AND OfferState < 3
Run Code Online (Sandbox Code Playgroud)
它仍然作为 B-Tree 实现?它如何评估值的组合?此类功能有何限制?