小编Tom*_*bes的帖子

为什么 NOT NULL 计算列在视图中被认为可以为空?

我有一张桌子:

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)

null sql-server view computed-column

17
推荐指数
2
解决办法
8741
查看次数

为什么 SELECT COUNT() 查询执行计划包括左连接表?

在 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)

sql-server execution-plan count

9
推荐指数
1
解决办法
604
查看次数

在不删除主键的情况下更改聚集索引

过去,我选择创建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

6
推荐指数
1
解决办法
2万
查看次数

SQL Server中如何实现组合索引

我了解单索引列在 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 实现?它如何评估值的组合?此类功能有何限制?

index sql-server btree

4
推荐指数
1
解决办法
1458
查看次数