小编Sha*_*ehr的帖子

如何使用表值函数连接表?

我有一个用户定义的函数:

create function ut_FooFunc(@fooID bigint, @anotherParam tinyint)
returns @tbl Table (Field1 int, Field2 varchar(100))
as
begin
  -- blah blah
end
Run Code Online (Sandbox Code Playgroud)

现在我想在另一张桌子上加入这个,就像这样:

select f.ID, f.Desc, u.Field1, u.Field2
from Foo f 
join ut_FooFunc(f.ID, 1) u -- doesn't work
where f.SomeCriterion = 1
Run Code Online (Sandbox Code Playgroud)

换句话说,所有的Foo记录,其中SomeCriterion1,我想看到的Foo IDDesc,旁边的值Field1,并Field2认为从返回ut_FooFunc的的输入Foo.ID

这样做的语法是什么?

join sql-server syntax sql-server-2012 functions

66
推荐指数
1
解决办法
12万
查看次数

可以在一台 SQL Server 上放置的数据库数量是否有限制?

我正在建立一个 SaaS 系统,我们计划在其中为每个客户提供自己的数据库。系统已经设置好,如果负载变得太大,我们可以轻松地扩展到其他服务器;我们希望拥有数千甚至数万名客户。

问题

  • 在一个 SQL Server 上可以/应该拥有的微数据库数量是否有任何实际限制?
  • 它会影响服务器的性能吗?
  • 是拥有 10,000 个 100 MB 的数据库还是一个 1 TB 的数据库更好?

附加信息

当我说“微数据库”时,我的意思并不是“微”;我的意思是我们的目标是成千上万的客户,所以每个单独的数据库只会占总数据存储量的千分之一或更少。实际上,每个数据库都在 100MB 左右,具体取决于它的使用量。

使用 10,000 个数据库的主要原因是为了可扩展性。事实上,系统的 V1 有一个数据库,当数据库在负载下紧张时,我们有一些不舒服的时刻。

它使 CPU、内存、I/O 变得紧张 - 以上所有。尽管我们解决了这些问题,但它们让我们意识到,在某些时候,即使使用世界上最好的索引,如果我们像我们希望的那样成功,我们根本无法将所有数据放在一个大喇叭中' 数据库。因此,对于 V2,我们进行了分片,因此我们可以在多个数据库服务器之间分配负载。

去年我一直在开发这个分片解决方案。每台服务器一个许可证,但无论如何,因为我们在 Azure 上使用虚拟机,所以已经解决了这个问题。现在出现这个问题的原因是,以前我们只向大型机构提供服务,并自己建立每个机构。我们的下一个业务是自助服务模式,任何拥有浏览器的人都可以注册并创建自己的数据库。他们的数据库将比大型机构小得多,数量也多得多。

我们尝试了Azure SQL 数据库弹性池。性能非常令人失望,因此我们切换回常规 VM。

sql-server scalability azure-vm

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

在大表上创建聚集索引的无痛方法?

因此,我们有一个客户站点抱怨性能严重下降。我看了一眼,很明显问题是因为别人 (grrrr) 设计了一个表,其中包含大约 2000 万多条记录,而没有聚集索引。

现在我想在该表上创建一个聚集索引 - 但在我的测试环境中 create index命令已经运行了一个小时,但仍未完成。客户站点是一个 24/7 全天候工作的车间,在我创建索引时无法承受一个小时的停机时间。

是否有一些不那么强力的创建索引的方法可以快速完成工作,或者以某种不会在服务器繁忙时完全杀死服务器性能的聪明方式来完成?

我们正在使用 SQL Server 企业版。

index sql-server-2008 sql-server sql-server-2008-r2

22
推荐指数
3
解决办法
1万
查看次数

内存优化表 - 它们真的很难维护吗?

我正在研究从 MS SQL 2012 升级到 2014 的好处。SQL 2014 的一大卖点是内存优化表,这显然使查询速度超快。

我发现内存优化表有一些限制,例如:

  • 没有(max)大小的字段
  • 每行最大 ~1KB
  • timestamp字段
  • 没有计算列
  • 没有UNIQUE限制

这些都属于麻烦事,但如果我真的想解决这些问题以获得性能优势,我可以制定计划。

真正的问题是您无法运行ALTER TABLE语句,并且每次向索引列表添加字段时都必须经历这些繁琐INCLUDE的过程。此外,您似乎必须将用户拒之门外,才能对实时数据库上的 MO 表进行任何架构更改。

我觉得这简直太离谱了,以至于我实际上无法相信 Microsoft 会在此功能上投入如此多的开发资金,却让其维护起来如此不切实际。这使我得出结论,我一定是拿错了棍子的一端;我一定误解了内存优化表的某些内容,这让我相信维护它们比实际困难得多。

那么,我误解了什么?你用过MO表吗?是否有某种秘密开关或过程使它们易于使用和维护?

index sql-server alter-table sql-server-2014 memory-optimized-tables

18
推荐指数
2
解决办法
4402
查看次数

是否可以在存储过程中定义函数?

我有一个存储过程:

create proc sp_MyProc(@calcType tinyint) as
begin
    -- some stuff collating data into #MyTempTable

    if (@calcType = 1) -- sum
        select A, B, C, CalcField = sum(Amount) 
        from #MyTempTable t 
        join AnotherTable a on t.Field1 = a.Field1;
        group by A, B, C
    else if (@calcType = 2) -- average
        select A, B, C, CalcField = avg(Amount) 
        from #MyTempTable t 
        join AnotherTable a on t.Field1 = a.Field1;
        group by A, B, C
    else if (@calcType = 3) -- some other fancy …
Run Code Online (Sandbox Code Playgroud)

stored-procedures sql-server-2012 functions

9
推荐指数
2
解决办法
3万
查看次数

如何使联合视图更有效地执行?

我有一个大表(数千万到数亿条记录),出于性能原因,我们将其拆分为活动表和存档表,使用直接字段映射,并每晚运行存档过程。

在我们代码的几个地方,我们需要运行结合活动表和存档表的查询,几乎总是由一个或多个字段过滤(我们显然在两个表中都放置了索引)。为方便起见,有一个这样的视图是有意义的:

create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive
Run Code Online (Sandbox Code Playgroud)

但是如果我运行一个查询

select * from vMyTable_Combined where IndexedField = @val
Run Code Online (Sandbox Code Playgroud)

它将在过滤之前对Active 和 Store 中的所有内容进行联合@val,这会降低性能。

@val在创建联合之前,是否有任何巧妙的方法可以让联合的两个子查询查看每个过滤器?

或者,您可能会建议使用其他一些方法来实现我的目标,即一种简单有效的方法来获取由索引字段过滤的联合记录集?

编辑:这是执行计划(您可以在这里看到真实的表名):

执行计划

奇怪的是,活动表实际上使用了正确的索引(加上 RID 查找?)但存档表正在执行表扫描!

index sql-server view union

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

为什么 SQL Browser 服务被禁用?

我有一个安装我们产品的软件安装包(使用 InstallShield/InstallScript 编写)的间歇性问题。在安装过程中,我们重新启动 SQL Browser 服务。大多数时候这工作正常。但偶尔 - 我还没有想出如何以可预见的方式重现这一点 - 服务无法重新启动,我在“服务”管理器中发现服务状态设置为“已禁用”。

任何想法会导致服务被禁用,以及如何防止它发生?

sql-server-2008 sql-server sql-server-2008-r2

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

如何查找数据泵 dmp 文件的模式名称?

我获得了一个 DMP 数据泵导出文件,可以导入到我的本地 Oracle 实例中。我试过运行这个命令行:

impdp full=Y 目录=DATA_PUMP_DIR dumpfile=MyDumpFile.dmp logfile=import.log

我收到错误:

ORA-31655: 没有为作业选择数据或元数据对象

ORA-39154: 来自外部模式的对象已从导入中删除

并且不会导入任何数据。

从我在谷歌上搜索到的,一个可能的原因是我需要指定remap_schama. 但我不知道 dmp 文件中架构的名称是什么。有什么简单的方法可以查到吗?

编辑:我没有找到解决这个问题,但我没有找到一个解决办法......我就找到了谁做的DMP的家伙,并且了模式名出来了。remap_schema根据他的定义指定,Hey Presto!

oracle oracle-11g-r2 datapump impdp

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

在计算字段上创建索引:字符串或二进制数据将被截断

我有一个Foo包含以下字段的表:

ID bigint not null identity(1,1),
SerializedValue nvarchar(max),
LongValue as TRY_CAST(SerializedValue as bigint)
Run Code Online (Sandbox Code Playgroud)

现在我想在 LongValue 上创建一个索引,以便我可以轻松查找表示数字的序列化值。

create nonclustered index IX_Foo on Foo(LongValue);
Run Code Online (Sandbox Code Playgroud)

其中向我吐出以下错误:

字符串或二进制数据将被截断。

是的,SerializedValue 中有现有数据。但是,祈祷,可以通过在计算字段上创建索引来截断什么?

sql-server sql-server-2012

8
推荐指数
1
解决办法
2922
查看次数

为什么 sqlcmd -Lc 不显示本地实例?

我有两台机器,每台机器都安装了 SQL Server 2008 的默认实例;每个都表现出不同的行为。

  • 在 PC1 上,当我运行 时sqlcmd -Lc,当 SQL 浏览器服务未运行时,我在本地网络上的 SQL 服务器列表中看不到 PC1。当我启动 SQL 浏览器服务时,PC1 出现在列表中。
  • 在 PC2 上,当我运行时sqlcmd -Lc,无论 SQL Browser 服务是否正在运行,我都会在列表中看到 PC2。如果 SQL Browser 服务正在运行,我还会看到 PC2\SQLEXPRESS。

为什么 PC1 的默认 SQL 实例没有显示在 SQL Server 列表中?

sql-server-2008 sql-server sqlcmd

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