精华内容
下载资源
问答
  • SQL Server中,如果我想授予一个用户klb拥有创建表的权限,但是我又不想授予其数据库角色db_ddladmin,因为这样会扩大其权限,那么授予下面权限可行吗?如下所示: USE AdventureWorks2014; GO GRANT CREATE ...
  • sql server 不能使用 create table ... as

    千次阅读 2019-07-12 10:27:41
    sql server中没有create table ... as这种语法,要将一个表复制到另一个表要用:select * into newtable from oldtable select column into newtable from oldtable group by column order by column --旧表中...

    在sql server中没有create table ... as这种语法,要将一个表复制到另一个表要用:select * into newtable from oldtable

    select column into newtable from oldtable group by column order by column    --旧表中合并重复度column列并按顺序复制到新表中

    执行这条sql语句后,会自动创建一个newtable表,在写上面的sql语句之前,不需要使用create table 创建一个新表

    展开全文
  • sql server支持create table as ...建表么

    千次阅读 2009-01-09 11:52:04
    sql server支持create table as ...建表么 楼主joneyzhou(我的确可以称得上是一个天才儿童)2005-09-27 12:43:17 在 MS-SQL Server / 基础类 提问 在oracle 中我可以这样间建表create table test as select * from ...

    sql server支持create table as ...建表么

    楼主joneyzhou(我的确可以称得上是一个天才儿童)2005-09-27 12:43:17 在 MS-SQL Server / 基础类 提问

    在oracle   中我可以这样间建表create   table   test   as   select   *   from   test1   where   1=2,但在sql   server中好像不行,有什么语句可以实现这样的功能么(不是建临时表)问题点数:20、回复次数:3Top

    1 楼vivianfdlpw()回复于 2005-09-27 12:56:48 得分 20

    select   *   into   test   from   test1   where   1=2Top

    2 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-09-27 13:06:51 得分 0

    select   *   into   test   from   test1   where   1=2Top

    3 楼wgsasd311(自强不息)回复于 2005-09-27 13:14:38 得分 0

    select   top   0   *   into   newtb   from   tbTop

    相关问题

    展开全文
  • SQL Server Table Spool优化

    千次阅读 2018-03-06 08:24:34
    本系列属于 SQL Server性能优化案例分享 专题 在执行计划中出现的Spool操作符,往往都具有明显的性能问题,也意味着数据库的设计、编码等可能存在问题,所以本文专门介绍一下这个操作符。 Spool介绍 Spool是...

    本系列属于 SQL Server性能优化案例分享 专题



        在执行计划中出现的Spool操作符,往往都具有明显的性能问题,也意味着数据库的设计、编码等可能存在问题,所以本文专门介绍一下这个操作符。


       

    Spool介绍

        Spool是内存或者磁盘上的缓存(cache)或临时表。SQL Server用这个结构来提升在执行过程中需要多次执行的复杂的子表达式的性能。注意几个次:一次运行中多次执行、复杂的子表达式。其目的是为了提升性能。

        比如下面的一个演示语句,使用TempDB来创建一个测试表:

    USE TempDB
    GO
    CREATE TABLE dbo.Orders (
    	OrderID INT NOT NULL
    	,CustomerId INT NOT NULL
    	,Total MONEY NOT NULL
    	,CONSTRAINT PK_Orders PRIMARY KEY CLUSTERED (OrderID)
    	)
    GO
    ;WITH N1 (C)AS (
    	SELECT 0	
    	UNION ALL	
    	SELECT 0
    	) -- 2 行
    ,N2 (C)AS (
    	SELECT 0
    	FROM N1 AS T1 CROSS JOIN N1 AS T2
    	) -- 4 行
    ,N3 (C) AS (
    	SELECT 0
    	FROM N2 AS T1
    	CROSS JOIN N2 AS T2
    	) -- 16 行
    ,N4 (C)AS (
    	SELECT 0
    	FROM N3 AS T1
    	CROSS JOIN N3 AS T2
    	) -- 256 行
    ,Nums (Num)
    AS (
    	SELECT row_number() OVER ( ORDER BY ( SELECT NULL ) )
    	FROM N4
    	)
    INSERT INTO dbo.Orders (OrderId ,CustomerId ,Total )
    SELECT Num,Num % 10 + 1 ,Num
    FROM Nums;
    

        然后打开实际执行并运行下面查询,返回订单信息及每个客户的总销售额。

    USE TempDB
    GO
    select OrderId, CustomerID, Total
    ,Sum(Total) over(partition by CustomerID) as [Total Customer Sales] 
    from dbo.Orders

        可以看到如下结果:


        在图中可以看到,SQL Server对Order 表进行了扫描,并且基于CustomerID进行排序。然后使用Table Spool对结果进行缓存。使得后续操作(比如计算总数)中可以直接访问这些缓存数据,同时由于缓存值已经排序,可以避免二次排序。

        如果检查执行计划中的3个Table Spool,如下图,可以看到输出列表是一样的。说明一个事情,虽然在执行计划中出现了3次Table Spool,但是它们实际上是相同的Spool/cache,SQL Server只是创建一次并一直使用而已。下图中只有“节点ID=1”的那个是第一个创建的Table Spool,也就是执行计划中最上方的那个,而右下角那两个均有“主节点ID=1”表明是引用节点ID=1的那个Table Spool。




        从技术上细分,spool操作符有两种:Eager Spool(本文第一张图)和Lazy Spool(上面演示案例),它们的区别只是在于填充数据的方式:

    • Eager Spool:在spool被调用的同时检索所有数据。
    • Lazy Spool:按需检索数据。

        其他不常见的Spool 操作符还有:Row Count Spool、Non-Clustered Index Spool。

    题外话:SQL Server还使用Spool来实现“Halloween Protection”,简单地说,就是准备要修改的数据的位置变动了。这种低概率事件在作者工作过程中也确实出现过,一般使用事务控制来避免。这个是一个计算机领域的问题,并非SQL Server独有,由IBM工程师首先发现,大部分成熟的RDBMS都已经很大程度地避免。至于SQL Server相关内容,可以详见MSDN博客:Halloween Protection

    下面来简要分析一下上面的执行计划,为了描述方便,这里按照执行计划顺序对操作符进行标号:


    First Step:

    Step 1:从Orders表中,通过聚集索引(因为表只有一个聚集索引)扫描,读取所有的OrderId, CustomerID, Total信息。

    Step 2:由于需要根据CustomeID进行分组并使用窗口函数计算(sum() over()),而且CustomerID并没有在聚集索引键上,所以需要进行额外排序。

    Step 3:Segment操作,把数据拆成多组,因为窗口函数需要对CustomerID进行分组。

    Step 4:Table Spool,并且是Lazy Spool,这个操作在TempDB上创建一个临时表,并把segment操作基于不同的组返回的数据存储到这个临时表中。


    Second Step:

    Step 1:复用前面生成的Table Spool。

    Step 2:对Table Spool的数据,按分组使用流聚合操作符汇总数据,本例中的Sum,按分组计算Total的值,并返回“一行”作为输出。

    Step 3:对上一步的结果集进行计算,如果对XML执行计划查询“Compute Scalar”关键字,可以看到它在进行一个case when操作:<ScalarOperator ScalarString="CASE WHEN [Expr1004]=(0) THEN NULL ELSE [Expr1005] END">

    Step 4:计算标量操作符得到的数据,使用嵌套循环操作符,与Third Step中的Table Spool再次匹配,返回符合条件的结果集。

    Step 5:把最终的两个结果集再次使用嵌套循环操作,一行一行地匹配。

     Spool 影响

        Spool的初衷是好的,但是它通常又涉及了worktable,使用“set statistics io on/off”命令包住需要运行的语句就可以发现。


        Worktable在OLTP系统中,意味着使用了低效的I/O操作,比如TempDB(简单来说就是磁盘读写)来运算。

        另外,对于Eager Spool,第一次从结果中查询到所需的数据并放入TempDB之后,后续使用直接从Spool中获取而不通过表上原有的索引,如果Spool数据集过大,是非常低效的。

        还有,由于spool实际上是复制一份数据的副本存储在TempDB中,所以空间问题可能会加重。


    优化Spool

        从上面一系列例子中,我们得知首先由于语句进行复杂运算,同时需要多次调用,引出了Spool以便优化,为了优化上面的语句(首先建议先记录下一些信息,比如Set Statistics IO 的信息),我们从执行计划着手,首先找开销最大的部分,即“sort”操作符。从说明上我们可以看到这个操作符是为了对CustomerID排序。从表定义可知这个表只有一个聚集索引。那么下面我们来对CustomerID加一个非聚集索引,由于SELECT中使用到了Total,所以把total加入Include列。




    CREATE INDEX IX_Orders_CustomerID on Orders(CustomerID) INCLUDE(total)

        再次执行语句,这次貌似不错,排序操作符不见了,但是依旧还存在spool,而且从IO统计来看,数值一样。感觉还是不够完美。


        但是在多次尝试之后,我发现很多方式反而不如这个高效,因此我用上面创建测试环境的语句再创建了一个orders1表,也 就是说我复制了一份环境,然后做对比:

    USE TempDB
    GO
    
    set statistics io on
    select OrderId, CustomerID, Total
    ,Sum(Total) over(partition by CustomerID) as [Total Customer Sales] 
    from dbo.Orders
    
    
    select OrderId, CustomerID, Total
    ,Sum(Total) over(partition by CustomerID) as [Total Customer Sales] 
    from dbo.Orders1
    set statistics io off
    

        打开执行计划,然后一次性执行上面语句,这种方式可以用于对比两个语句的开销情况,开销百分比小的,意味着在大部分情况下更佳。下面是本机的执行情况:


        可以看到,orders表也就是按照上面方式优化了的表,跟orders1表(原始环境)对比,分别是27%和73%,而I/O数值来看是一模一样的:


        那么有理由相信,即使存在spool操作,也并不一定是低效的。因为我通过改写语句成下面这种方式来去除了spool,但是放在一起执行时发现不如上面没改写仅调整索引的语句:

    set statistics io on
    select OrderId, CustomerID, Total,
    (select Sum(Total)  from orders b where a.CustomerId=b.CustomerId)--over(partition by CustomerID) as [Total Customer Sales] 
    from dbo.Orders a
    
    set statistics io off

        为了避免读者认为orders是调整过索引的写法,我再次使用orders1表,三个语句放在一次执行,注意这里orders1是原始环境:

    USE TempDB
    GO
    
    set statistics io on
    select OrderId, CustomerID, Total
    ,Sum(Total) over(partition by CustomerID) as [Total Customer Sales] 
    from dbo.Orders
    
    
    select OrderId, CustomerID, Total
    ,Sum(Total) over(partition by CustomerID) as [Total Customer Sales] 
    from dbo.Orders1
    
    select OrderId, CustomerID, Total,
    (select Sum(Total)  from orders1 b where a.CustomerId=b.CustomerId)--over(partition by CustomerID) as [Total Customer Sales] 
    from dbo.Orders1 a
    set statistics io off
    

    得到的结果:



    总结

        在这篇文章中,我得到几个结论:

    1. 不能仅靠单一“值”来判断,在I/O统计数值相等的情况下,可以考虑借用其他手段来评估优化的方案。

    2. 我一直跟很多人强调,改索引之前,先检查语句是否可以改写。上面我已经尝试了改写,但是目前就个人水平而言,还没有发现单纯通过改写就可以提高这个例子的方法。所以后面才考虑修改索引。

    3. 我以前看书的时候看过很多案例,窗口函数在很多环境下,确实极大地提高效率,所以建议SQL Server从业人员也可以优先考虑一下窗口函数。

    4. 大胆假设小心求证。

    另外,对于Spool的优化,通常确实是通过优化索引来减缓或去除。不过凡是无绝对,多看看具体问题最重要。

        


    展开全文
  • 打开sqlserver企业管理器,在表列表上选择一个(或多个,只是时间有差别)表,ctrl+c,然后到记事本里,ctrl+v,稍等……,create table语句就会出现,同样的方法也适用于view,function,proc等
    打开sqlserver企业管理器,在表列表上选择一个(或多个,只是时间有差别)表,ctrl+c,然后到记事本里,ctrl+v,稍等……,create table语句就会出现,同样的方法也适用于view,function,proc等
    
    展开全文
  • create database Study -- 创建数据库 on primary   (   name = 'Study_data' , -- 主数据文件的逻辑名   fileName = 'D:/data/Study_data.mdf' , -- 主数据文件的物理名   size = 10MB , -...
  • sqlserver 下想复制一张表的,想到oracle下直接create table xxx as select * from ....即可。 但是结果却是错误的,baidu一下发现。 sqlserver的语法是 : select * into tablenew from tableold
  • SQL ServerTable的知识框架

    千次阅读 2007-08-23 12:06:00
    以下这些内容是了解SQL Servertable必须掌握的,至于其中的各个知识点,我会在以后的文章中逐一进行详述!Table1. Create table:CREATE TABLE dbo.customer(cust_id int,cust_name char(12),cust_phone char(11...
  • SQL Server ALTER TABLE ADD列概述

    千次阅读 2020-07-24 14:39:54
    In this article, we will explore SQL Server ALTER TABLE ADD Column statements to add column(s) to an existing table. We will also understand the impact of adding a column with a default value and ...
  • http://searchsqlserver.techtarget.com/tip/0,289483,sid87_gci1312369,00.html?track=NL-417&ad=638703&asrc=EM_NLT_3593059&uid=6118215Robert Sheldon05.05.2008Prior to SQL Server 2005, you could define
  • SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的名称引用临时表: CREATE TABLE #MyTempTable (cola INT PRIMARY KEY) INSERT INTO #MyTempTable VALUES (1) 如果本地临时表由存储过程创建或由多个...
  • This is the third article in a series of learning the CREATE VIEW SQL statement. So far, I’d say that we’re comfortable and familiar with the syntax, and we’ve learned how to create and modify vie....
  • SqlServer数据库DROP TABLE IF EXISTS语句

    万次阅读 2018-08-17 11:11:46
    近日碰到SqlServer数据库版本不一致,执行建表脚本时DROP TABLE IF EXISTS语法的小问题,自己做个记录便于后续查看。 在SqlServer2016版本及更高版本,建表前判断表是否存在,可以使用: DROP TABLE IF EXISTS ...
  • 这个是因为在jboss启动的时候用到了hsql,在hsql的配置文件...CREATE_MESSAGE_TABLE = CREATE CACHED TABLE JMS_MESSAGES( MESSAGEID INTEGER NOT NULL, \  DESTINATION VARCHAR(255) NOT NULL, TXID INTEGER, TXOP CH
  • 有道友在群里问到他在sqlserver中创建表时出现如图的问题 直接能用sqlserver验证登录的同学请直接看文章后半段的解决方案 这里是我测试的过程: 我在学校学习sqlserver的时候一直用的是windows登陆,最开始我用这种...
  • sql sever不能用create table table1 as select * from table2;这是oracle中这样用,sql sever用例如:select * into Student_backup from Student;...
  • CREATE TABLE 时的 SQL UNIQUE 约束

    千次阅读 2018-04-03 13:10:13
    CREATE TABLE 时的 SQL UNIQUE 约束 下面的 SQL 在 "Persons" 表创建时在 "P_Id" 列上创建 UNIQUE 约束: MySQL: CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT ...
  • 在数据库test2中新建表FRUITS、SUPPLIERS,在新建之前,如果已经有同名的表存在则将其删除;USE test2 GO BEGIN TRY DROP TABLE FRUITS END TRY BEGIN CATCH END CATCH; BEGIN TRY DROP TABLE ...CREATE TABLE F
  • SQL Server 2008 alter table column type

    千次阅读 2012-12-05 01:48:09
    I ran into the issue twice when I tried to change table column type. I directly went to table design page and tried to change column type as I do many times on MySQL. But it didn't work on SQL Server
  • sqlserver 下想复制一张表的,想到oracle下直接create table xxx as select * from ....即可。 但是结果却是错误的,baidu一下发现。 sqlserver的语法是 : select * into tablenew from tableold
  • Access建表SQL语句Create Table设置自动增长列的关键字AUTOINCREMENT使用方法SQL AUTO INCREMENT 字段uto-increment 会在新记录插入表中时生成一个唯一的数字。AUTO INCREMENT 字段我们通常希望在每次插入新记录时,...
  • sql server 存储过程返回table

    千次阅读 2014-04-01 17:25:22
    CREATE PROCEDURE RETURN_TABLE_TEST AS  BEGIN  SELECT id,name,comment INTO #TEMP FROM table1 WHERE createtime>='2014-01-01'  SELECT * FROM #TEMP END -----------------------------------...
  • 通过更改、添加或删除列和约束,重新分配分区,或者启用或禁用约束和... Transact-SQL 语法约定 语法 ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name { ALTER COLUMN column_name {
  • Export table data sql scrpit on sql server 2008

    千次阅读 2012-12-12 00:38:09
    Since this is my first time working on sql server, I didn't know how to export data. Previously, I was silly to write the insert sql manually. It's time-consuming.This time, I have to insert a lot of
  • 第二章 SQL命令参考-CREATE TABLE AS

    千次阅读 2017-10-19 23:03:23
    CREATE TABLE AS 从查询的结果定义了一个新的表。 概要 CREATE [ [GLOBAL | LOCAL] {TEMPORARY |TEMP} ] TABLE table_name [,...])] [WITH ( storage_parameter=value [,...])] [ON COMMIT{PRESERVE ROWS | ...
  • T-SQLCREATE TABLE 语法

    千次阅读 2001-05-03 20:58:00
    CREATE TABLE创建新表。语法CREATE TABLE [ database_name.[ owner ] .| owner.] table_name ( { | column_name AS computed_column_expression | ::= [ CONSTRAINT constraint_name ] }
  • 刚开始学习MySQL时候,有时偷懒,会用SHOW CREATE TABLE 表名\G来复制表创建语句,可是当运行的时候总会因为"表名和列名上有单引号",提示语法错误不能运行。 问题列表: 1,为什么会出错呢? 2,有什么解决方法?...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 255,510
精华内容 102,204
关键字:

createserversqltable