SQL Server 用户使用术语“sargable”。我想知道“sargable”是否有一个客观的、与实现无关的永恒定义。
例如,WHERE foo LIKE '%bar%'很多人说它是不可 sargable 的,但一些 RDBMS能够在此类查询上使用索引。那么“不可以”是什么意思呢?
其他参考
select *
from A
where posted_date >= '2015-07-27 00:00:00.000'
and posted_date <= '2015-07-27 23:59:59.999'
Run Code Online (Sandbox Code Playgroud)
但是结果中包含了今天posted_date 的记录:2015-07-28。我的数据库服务器不在我的国家。问题是什么 ?
我们有一个 SQL 生成器,它通常为指定的字段发出 SQL 条件语句(为了讨论:我们将标记为myField)。
如果myField是类型的NVARCHAR,我们能做到说场对像这样的字符串的比较:myField = 'foo'。
但是,这不适用于类型为 的字段NTEXT。因此,我们必须与演员表进行比较: CAST(myField as NVARCHAR(MAX)) = 'foo'。如果myField是NVARCHAR或类型,这实际上会起作用NTEXT。
在已经是类型的字段上进行上述演员表的性能影响是什么NVARCHAR?我希望 SQL Server 足够聪明,可以动态识别myField已经是类型的NVARCHAR(有效地将其CAST转换为无操作)。
我有一个要加速的查询:
SELECT
sum(case when FlagDTD = 1 then Success else 0 end) as SuccessDTD
, sum(case when FlagDTD = 1 then [Error] else 0 end) as ErrorDTD
, round(sum(case when FlagDTD = 1 then Success else 0 end) * 100.0 / sum(FlagDTD),2)
as RateDTD
, sum(case when FlagYTD = 1 then Success else 0 end) as SuccessYTD
, sum(case when FlagYTD = 1 then [Error] else 0 end) as ErrorYTD
, round(sum(case when FlagYTD = 1 then Success else 0 …Run Code Online (Sandbox Code Playgroud) 在我的查询中,我比较了WHERE子句中的两个日期
一旦使用CONVERT:
CONVERT(day,InsertedOn) = CONVERT(day,GETDATE())
Run Code Online (Sandbox Code Playgroud)
另一个使用DATEDIFF:
DATEDIFF(day,InsertedOn,GETDATE()) = 0
Run Code Online (Sandbox Code Playgroud)
这是执行计划
的数据类型InsertedOn是datetime。
哪个更优化?
我有一个这样设置的表:
DB 有 10B 行。
CREATE TABLE [Tick].[X_H](
[utcDT] [datetime2](7) NOT NULL,
[Symbol] [nvarchar](50) NOT NULL,
[Bid] [float] NULL,
[Ask] [float] NULL,
[BidSize] [float] NULL,
[AskSize] [float] NULL
) ON [PRIMARY]
ALTER TABLE [Tick].[X_H] ADD CONSTRAINT [PK_Master] PRIMARY KEY CLUSTERED
(
[utcDT] ASC,
[Symbol] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
Run Code Online (Sandbox Code Playgroud)
我想为特定符号选择一天的数据。我在用:
SELECT *
FROM [Tick].[X_H]
WHERE [Symbol] = 'DONKEY'
AND CONVERT(Date, [utcDT]) = …Run Code Online (Sandbox Code Playgroud) 这个问题是从这里提出的优秀问题中提取出来的:
就我而言,我不关心该WHERE子句,而是关心加入具有类型列的事件表DATE
一个表有DATETIME2,另一个有DATE......所以我可以有效地JOIN使用aCAST( AS DATE)或者我可以使用“传统”范围查询(>=日期和<日期+1)。
我的问题是哪个更可取?这些DATETIME值几乎永远不会与谓词DATE值匹配。
我希望保持在 200 万行DATETIME和 5000行以下DATE(如果这个考虑有所不同)
我是否应该期望在JOIN使用该WHERE子句时具有相同的行为?我应该更喜欢哪个通过缩放来保持性能?答案是否随 MSSQL 2012 而改变?
我的通用用例是将我的事件表视为日历表
SELECT
events.columns
,SOME_AGGREGATIONS(tasks.column)
FROM
events
LEFT OUTER JOIN
tasks
--This appropriately states my intent clearer
ON CAST(tasks.datetimecolumn AS DATE) = events.datecolumn
--But is this more effective/scalable?
--ON tasks.datetimecolumn >= events.datecolumn
--AND tasks.datetimecolumn < DATEADD(day,1,events.datecolumn)
GROUP BY
events.columns
Run Code Online (Sandbox Code Playgroud) 我正在使用 SQL Server,我有两个表,table1并且table2. 两个表都有一个DATETIME表示为 的列dt。我不仅需要根据某些条件连接这些表,还要确保匹配的行具有相同的日期(此处不考虑时间)dt。
这是我当前使用的查询:
select *
From table1 a inner join table2 b
on a.id = b.a_id
and convert(date, a.dt) = convert(date, b.dt)
Run Code Online (Sandbox Code Playgroud)
该查询可以获取我需要的结果,但我担心它的性能,尤其是当表大小增加时。
我想知道是否有更高效的方法可以达到相同的结果?是否有技术或 SQL Server 功能可以帮助我优化此查询,尤其是日期比较部分?
任何意见或建议将不胜感激。先感谢您。
我有一个标题为reached_date的列。在我的查询中,该列的大部分值是2016-09-30 23:59:59.997。
然后我有一个 where 子句,内容如下:
WHERE achieved_date between '20160901' and '20160930'
Run Code Online (Sandbox Code Playgroud)
具有 2016-09-30 23:59:59.997 值的记录没有包含在我应该包含的结果中。我的意思是交易记录在 9 月 30 日。
如果这是一个奇怪的数据类型问题,有什么想法吗?
sSQL = "
SELECT ordID, ordName, ordDate, ordShipping, ordStateTax,
ordHandling, ordTotal, ordDiscount, ordPrivateStatus
FROM orders
WHERE (ordStatus = 7)
"
Run Code Online (Sandbox Code Playgroud)
我想将昨天收到的订单显示为我正在构建的每日报告脚本
我该怎么办?
SQL Server 2005
ordDate 有这种格式: 2015-01-28 14:58:49.000