如果这不是正确的论坛,请让我知道并为我移动它。
我刚刚在标量函数的末尾有一堆这样的插入:
INSERT INTO [Raptor].[dbo].[UserRole]
([RoleId]
,[UserId])
VALUES
(3
,@NewUserID)
INSERT INTO [Raptor].[dbo].[UserRole]
([RoleId]
,[UserId])
VALUES
(5
,@NewUserID)
Run Code Online (Sandbox Code Playgroud) 对于目前只有很少(5-10)个设置但将来会有更多(最多100个)设置的应用程序,这将是更好的方法:
考虑到应用程序可能有数百万个实例(它们都在同一个数据库上运行并使用同一个表进行设置),数据库可能被分片。DB 是关系型的,即 MySQL 或 T-SQL。
作为开发人员,我更喜欢第二个变体,因此我可以在不更改数据库架构的情况下扩展应用程序并随意添加/删除设置。据我了解,如果索引聚集在应用程序实例上,那么在单个表中拥有几百万条记录应该不是问题。有什么我不知道的缺点吗?
那么第一个变体呢?有什么大的好处吗?那么列数呢:表可以包含的列数是否有任何理论限制?如果我有一个包含 1000 (10 000, 1000 000) 列的表会发生什么?那会不会很慢?
在 SQL Server 连接语法中,我们可以使用LEFT JOINorLEFT OUTER JOIN和查询结果,上面的每个连接都没有区别。这对我来说是一个更有用的问题。
我们有一个奇怪的系统,我们正在与之集成,它使用 XML,但它不理解自闭合标签,所以
<BOOKING>
<BOOKINGID>56812</BOOKINGID>
<PERSONCODE />
</BOOKING>
Run Code Online (Sandbox Code Playgroud)
超出了它的能力。
如果我拥有的是declare @x xml,我如何将其转换@x为字符串而没有自关闭标签:
<BOOKING>
<BOOKINGID>56812</BOOKINGID>
<PERSONCODE></PERSONCODE>
</BOOKING>
Run Code Online (Sandbox Code Playgroud) 我正在使用 T-SQL 自动重建和重新组织索引。我遇到了无法在线重建的索引问题。发生这种情况主要是因为包含 ntext/nvarchar 列。
有没有办法以编程方式将它们标识为该语句的一部分?对 WHERE 谓词的补充
SELECT
--TOP 20
OBJECT_NAME(IPS.OBJECT_ID) AS [TableName], avg_fragmentation_in_percent, SI.name [IndexName],
schema_name(ST.schema_id) AS [SchemaName], 0 AS IsProcessed
INTO #FramentedTableList
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL , NULL) IPS
JOIN sys.tables ST WITH (nolock) ON IPS.OBJECT_ID = ST.OBJECT_ID
JOIN sys.indexes SI WITH (nolock) ON IPS.OBJECT_ID = SI.OBJECT_ID AND IPS.index_id = SI.index_id
WHERE ST.is_ms_shipped = 0 AND SI.name IS NOT NULL
AND avg_fragmentation_in_percent >= CONVERT(DECIMAL, @FragmentationThresholdForReorganizeTableLowerLimit)
ORDER BY avg_fragmentation_in_percent DESC
Run Code Online (Sandbox Code Playgroud) 我有一个表值函数
CREATE FUNCTION [dbo].[DateRange]
(
@StartDate date,
@EndDate date,
@Location varchar(25),
@Device varchar(25)
)
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM MyTable
WHERE Date < @EndDate AND
Date > @StartDate AND
Location = @Location AND
Device = @Device
);
Run Code Online (Sandbox Code Playgroud)
现在我想让用户选择使用 NULL 作为位置参数和/或设备参数,以便他/她获取与位置和设备无关的所有数据
什么是最优雅和最有效的方式来做到这一点?
我正在尝试优化几个在其中一个WHERE子句上都使用类似模式的查询:
AND (DATEADD(DAY
, ISNULL(a.[due_days], 30) + 30
, [dbo].[CalcDate]([type], date1, date2, date3, date4, NULL))
) < GETDATE()
Run Code Online (Sandbox Code Playgroud)
CalcDate基于type字段值的udf进行一些比较并返回一个日期。然后将天数添加到该日期并与当前日期进行比较。为了能够使用现有的索引,due_days我想转换操作以将所有转换应用到GETDATE(),假设我想sargable在可能的情况下实现它。另外,如果有一些关于可以做些什么来更好地改进 udf 的使用的建议。
我正在为一个保存大量日志的系统设计一个表。我们正在查看每秒大约 200 个条目。
我们使用的是 SQL-Server 2012 企业版。
我有一个关于将一Datetime列分成两列的问题,Date并且Time.
我在问题背后的想法。我会说一旦数据存储在数据库中,大多数搜索将基于每天,给我今天/1 月 10 日的所有结果。
现在我仍然需要存储时间。因此,如果我将其存储为datetime,则在执行此查询时,sql 将不得不加载整个datetime字段,然后只查看一半的数据。
因此,通过可能将日期存储在其自己的字段中,它可以只查看它需要的内容。
但另一方面,如果您确实在查询中指定了时间,则它现在必须检查两列的值。
因此,我希望 SQL Gurus 提供关于哪个选项对大型数据库的查询具有更好的性能的输入。
据我所知datetime,可以高度优化并且是比分解更好的解决方案。
假设我有一张桌子,上面有一副牌,编号为 01-52。我可以返回顶部和底部的卡片,就好像我通过执行以下操作将联合选择查询的每一侧握在我的左手和右手上:
select top 26 * from DeckOfCards order by CardNumber desc
union all
select top 26 * from DeckOfCards order by CardNumber asc
Run Code Online (Sandbox Code Playgroud)
这将是平分秋色。
但是我怎么能让 SQL Server 将返回的结果交织在一起,就好像我已经拿走了那个联合的两个部分,一个在我的左手,另一个在我的右手,然后像一副纸牌一样洗牌一次?
IE:CardNumber 52,后跟 1,顺序如下:52, 1, 51, 2, 50, 3, 49, 4, etc...
这不是一个家庭作业问题,只是当我试图闭上眼睛时脑海中闪过的那些事情之一。:)
我知道重新编译是什么意思,我知道由于性能问题,没有 dmv 等,大多数时候不建议使用它。
有时在某些情况下它可能有所帮助,但OPTION(RECOMPILE)也可能有所帮助。
那么,什么时候最好使用With Recompileover OPTION(RECOMPILE)?
谢谢。
t-sql ×10
sql-server ×7
date ×1
datetime ×1
eav ×1
functions ×1
index ×1
join ×1
mysql ×1
optimization ×1
scalability ×1
xml ×1