我想咨询SQL Server OR短路
码:
DECLARE @tempTable table
(
id int
)
INSERT @tempTable(id) values(1)
DECLARE @id varchar(10)
SET @id = 'x'
SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully
SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int
Run Code Online (Sandbox Code Playgroud)
为什么?1 = 1且@ id ='x'为真.
SQL Server OR运算符:是否有短路功能?
谢谢
我有两张桌子:
CREATE TABLE `articles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(1000) DEFAULT NULL,
`last_updated` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `last_updated` (`last_updated`),
) ENGINE=InnoDB AUTO_INCREMENT=799681 DEFAULT CHARSET=utf8
CREATE TABLE `article_categories` (
`article_id` int(11) NOT NULL DEFAULT '0',
`category_id` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`article_id`,`category_id`),
KEY `category_id` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
Run Code Online (Sandbox Code Playgroud)
这是我的查询:
SELECT a.*
FROM
articles AS a,
article_categories AS c
WHERE
a.id = c.article_id
AND c.category_id = 78
AND a.comment_cnt > 0
AND a.deleted …Run Code Online (Sandbox Code Playgroud) 我想从字段中找到最高的AutoIncremented值.(它不会在我可以使用的插入后获取@@SCOPE_IDENTITY等)这两个查询中的哪一个会运行得更快或提供更好的性能.
Id是主要的关键和autoincrement领域Table1.这适用于Sql Server 2005.
SELECT MAX(Id) FROM Table1
SELECT TOP 1 Id FROM Table1 ORDER BY Id DESC
Run Code Online (Sandbox Code Playgroud)
[编辑]
在这种情况下,Id是我已定义聚簇索引的字段.
如果索引是ID DESC那么..
是的,如果
1. Id是聚簇索引+主键,那么知道如何影响性能会很好.
2. Id是聚簇索引而不是主键.
3. Id是非聚集索引ASC +主键.
4. Id是非聚集索引ASC而不是主键.
5. Id是非聚集索引DESC +主键.
6. Id是非聚集索引DESC而不是主键.
我只是AutoIncrement
希望它不是一个很高的命令!
在同一查询中应用条件之前应用Oracle START WITH ... CONNECT BY子句.因此,WHERE约束无助于优化.WHERECONNECT BY
例如,以下查询可能会执行全表扫描(忽略选择性dept_id):
SELECT * FROM employees
WHERE dept_id = 'SALE'
START WITH manager_id is null
CONNECT BY PRIOR employee_id = manager_id
Run Code Online (Sandbox Code Playgroud)
我尝试通过两种方式提高性能:
查询A:
SELECT * FROM employees
START WITH manager_id is null AND dept_id = 'SALE'
CONNECT BY PRIOR employee_id = manager_id
Run Code Online (Sandbox Code Playgroud)
查询B:
SELECT * FROM (
SELECT * FROM employees
WHERE dept_id = 'SALE'
)
START WITH manager_id is null
CONNECT BY PRIOR employee_id = manager_id …Run Code Online (Sandbox Code Playgroud) 我一直在争夺这一个.我有一个存储过程,它接受3个用于过滤的参数.如果传入特定值,我想对其进行过滤.如果传入-1,请全部给我.
我试过以下两种方式:
第一种方式:
SELECT field1, field2...etc
FROM my_view
WHERE
parm1 = CASE WHEN @PARM1= -1 THEN parm1 ELSE @PARM1 END
AND parm2 = CASE WHEN @PARM2 = -1 THEN parm2 ELSE @PARM2 END
AND parm3 = CASE WHEN @PARM3 = -1 THEN parm3 ELSE @PARM3 END
Run Code Online (Sandbox Code Playgroud)
第二种方式:
SELECT field1, field2...etc
FROM my_view
WHERE
(@PARM1 = -1 OR parm1 = @PARM1)
AND (@PARM2 = -1 OR parm2 = @PARM2)
AND (@PARM3 = -1 OR parm3 = @PARM3)
Run Code Online (Sandbox Code Playgroud)
我读到某处,第二种方式会短路,如果是真的话,永远不会评估第二种方式.我的DBA说它强制进行表扫描.我还没有验证这一点,但在某些情况下似乎运行速度较慢.
此视图选择的主表有大约150万条记录,并且视图继续加入大约15个其他表以收集大量其他信息.
这两种方法都很慢......把我从瞬间带到2-40秒的任何地方,这在我的情况下是完全不可接受的.
是否有更好的方法不涉及将其分解为特定vs …
以下两种方式完成条款的区别是什么?
SELECT * FROM table1 INNER JOIN table2 ON (
table2.col1 = table1.col2 AND
table2.member_id = 4
)
Run Code Online (Sandbox Code Playgroud)
我已将它们与基本查询进行比较,EXPLAIN EXTENDED并且没有看到差异.我想知道这里是否有人发现了一个更复杂/处理密集的环境的差异.
SELECT * FROM table1 INNER JOIN table2 ON (
table2.col1 = table1.col2
)
WHERE table2.member_id = 4
Run Code Online (Sandbox Code Playgroud) 我的SQL查询:
SELECT *
FROM updates_cats
WHERE uid =118697835834
ORDER BY created_date ASC
Run Code Online (Sandbox Code Playgroud)
目前指数:
index1(uid, created_date)
Run Code Online (Sandbox Code Playgroud)
EXPLAIN EXTENDED结果:
1 SIMPLE updates_cats ref index1 index1 8 const 2 100.00 Using where
Run Code Online (Sandbox Code Playgroud)
如何修复Extra字段使用哪里可以使用索引?
编辑:显示创建表:
CREATE TABLE `updates_cats` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`u_cat_id` bigint(20) NOT NULL DEFAULT '0',
`uid` bigint(20) NOT NULL,
`u_cat_name` text COLLATE utf8_unicode_ci NOT NULL,
`total_updates` int(11) unsigned NOT NULL DEFAULT '0',
`created_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `index1` (`uid`,`created_date`)
) ENGINE=MyISAM AUTO_INCREMENT=23522 …Run Code Online (Sandbox Code Playgroud) 它将如何有益的是使用Python/PHP非持久阵列存储6GB +数据超过800万分美元排在RAM中,而不是使用MySQL /的MongoDB /卡桑德拉/ BigTable的/ BigData(持久性数据库)数据库,当谈到速度,简单的查询执行/延迟?
例如,在1秒内找到800多万行中的一个名称:是否可能?有没有人有处理超过1-2亿行数据集的经验,并在1秒内获得简单搜索查询的结果?
是否有更好的,经过验证的方法来处理数十亿行?
在SQL Server 2014 DB中给出以下内容:
create table t
(
c1 int primary key,
c2 datetime2(7),
c3 nvarchar(20),
c4 as cast(dbo.toTimeZone(c2, c3, 'UTC') as date) persisted
);
create index i on t (c4);
declare @i int = 0;
while @i < 10000
begin
insert into t (c1, c2, c3) values
(@i, dateadd(day, @i, '1970-01-02 03:04:05:6'), 'Asia/Manila');
set @i = @i + 1;
end;
Run Code Online (Sandbox Code Playgroud)
toTimeZone是一个CLR UDF,它将datetime2时区转换为datetime2另一个时区.
当我运行以下查询时:
select c1
from t
where c4 >= '1970-01-02'
and c4 <= …Run Code Online (Sandbox Code Playgroud) sql-server performance query-optimization database-performance sql-server-2014
我在Mysql中运行了一个查询,如下所示:
EXPLAIN
SELECT *
FROM(
SELECT * # Select Number 2
FROM post
WHERE parentid = 13
ORDER BY time, id
LIMIT 1, 10
) post13_childs
JOIN post post13_childs_childs
ON post13_childs_childs.parentid = post13_childs.id
Run Code Online (Sandbox Code Playgroud)
结果是:
id |select_type |table |type |possible_keys |key |key_len |ref |rows |Extra
1 |PRIMARY |<derived2> |ALL | NULL | NULL |NULL |NULL |10 |
1 |PRIMARY |post13_childs_childs|ref |parentid |parentid |9 |post13_childs.id |10 |Using where
2 |DERIVED |post |ALL |parentid |parentid |9 | |153153 |Using where; Using filesort
Run Code Online (Sandbox Code Playgroud)
这意味着它使用了索引, …
sql ×5
mysql ×4
sql-server ×4
indexing ×2
performance ×2
t-sql ×2
bigdata ×1
case ×1
explain ×1
join ×1
mongodb ×1
optimization ×1
oracle ×1
python ×1
select ×1
where ×1
where-clause ×1