❶ sqlserver想實現動態列,求這些列各自數據所佔的比例,創建新列放各自比例
把你的列用行來實現
❷ 為什麼伺服器上sqlserver會占那麼多內存
SQLSERVER默認採用動態分配內存模式,只要有訪問操作,它就會首先嘗試申請內存,直到到設置的最大值,我曾經碰到過伺服器1G內存,Sqlserver分配了800多兆,但系統仍然正常工作。當然也可以在企業管理器,點伺服器->屬性->內存頁面上根據實際需要改為使用固定大小,但是一般不建議這么修改
❸ SQLServer表的大小與表占硬碟空間大小有什麼區別,應該怎麼去查這兩項性能
表的大小一般指表的行數,佔用硬碟空間大小就比較復雜了,可以有以下幾個參數:
分配空間,數據佔用空間及索引佔用空間。
執行
EXEC alltablecount
即可顯示當前資料庫所有表資源佔用情況。
執行前,請前建立以下表,和兩個存儲過程:
1、先建立表:HY_SPACE
CREATE TABLE [HY_SPACE] (
[name] [nvarchar] (128) COLLATE Chinese_PRC_CI_AS NULL ,
[rows] [char] (11) COLLATE Chinese_PRC_CI_AS NULL ,
[reserved] [varchar] (18) COLLATE Chinese_PRC_CI_AS NULL ,
[data] [varchar] (18) COLLATE Chinese_PRC_CI_AS NULL ,
[index_size] [varchar] (18) COLLATE Chinese_PRC_CI_AS NULL ,
[unused] [varchar] (18) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
2、建立統計存儲過程:
create procere HYspaceused
@objname nvarchar(776) = null,
@updateusage varchar(5) = false
as
declare @idint
declare @typecharacter(2)
declare@pagesint
declare @dbname sysname
declare @dbsize dec(15,0)
declare @logsize dec(15)
declare @bytesperpagedec(15,0)
declare @pagesperMBdec(15,0)
create table #spt_space
(
rowsint null,
reserveddec(15) null,
datadec(15) null,
indexpdec(15) null,
unuseddec(15) null
)
if @updateusage is not null
begin
select @updateusage=lower(@updateusage)
if @updateusage not in ('true','false')
begin
raiserror(15143,-1,-1,@updateusage)
return(1)
end
end
if @objname IS NOT NULL
begin
select @dbname = parsename(@objname, 3)
if @dbname is not null and @dbname <> db_name()
begin
raiserror(15250,-1,-1)
return (1)
end
if @dbname is null
select @dbname = db_name()
select @id = null
select @id = id, @type = xtype
from sysobjects
where id = object_id(@objname)
if @id is null
begin
raiserror(15009,-1,-1,@objname,@dbname)
return (1)
end
if not exists (select * from sysindexes
where @id = id and indid < 2)
if @type in ('P ','D ','R ','TR','C ','RF')
begin
raiserror(15234,-1,-1)
return (1)
end
else if @type = 'V '
begin
raiserror(15235,-1,-1)
return (1)
end
else if @type in ('PK','UQ')
begin
raiserror(15064,-1,-1)
return (1)
end
else if @type = 'F '
begin
raiserror(15275,-1,-1)
return (1)
end
end
if @updateusage = 'true'
begin
if @objname is null
dbcc updateusage(0) with no_infomsgs
else
dbcc updateusage(0,@objname) with no_infomsgs
print ' '
end
set nocount on
if @id is null
begin
select @dbsize = sum(convert(dec(15),size))
from dbo.sysfiles
where (status & 64 = 0)
select @logsize = sum(convert(dec(15),size))
from dbo.sysfiles
where (status & 64 <> 0)
select @bytesperpage = low
from master.dbo.spt_values
where number = 1
and type = 'E'
select @pagesperMB = 1048576 / @bytesperpage
select database_name = db_name(),
database_size =
ltrim(str((@dbsize + @logsize) / @pagesperMB,15,2) + ' MB'),
'unallocated space' =
ltrim(str((@dbsize -
(select sum(convert(dec(15),reserved))
from sysindexes
where indid in (0, 1, 255)
)) / @pagesperMB,15,2)+ ' MB')
print ' '
insert into #spt_space (reserved)
select sum(convert(dec(15),reserved))
from sysindexes
where indid in (0, 1, 255)
select @pages = sum(convert(dec(15),dpages))
from sysindexes
where indid < 2
select @pages = @pages + isnull(sum(convert(dec(15),used)), 0)
from sysindexes
where indid = 255
update #spt_space
set data = @pages
update #spt_space
set indexp = (select sum(convert(dec(15),used))
from sysindexes
where indid in (0, 1, 255))
- data
update #spt_space
set unused = reserved
- (select sum(convert(dec(15),used))
from sysindexes
where indid in (0, 1, 255))
select reserved = ltrim(str(reserved * d.low / 1024.,15,0) +
' ' + 'KB'),
data = ltrim(str(data * d.low / 1024.,15,0) +
' ' + 'KB'),
index_size = ltrim(str(indexp * d.low / 1024.,15,0) +
' ' + 'KB'),
unused = ltrim(str(unused * d.low / 1024.,15,0) +
' ' + 'KB')
from #spt_space, master.dbo.spt_values d
where d.number = 1
and d.type = 'E'
end
else
begin
insert into #spt_space (reserved)
select sum(reserved)
from sysindexes
where indid in (0, 1, 255)
and id = @id
select @pages = sum(dpages)
from sysindexes
where indid < 2
and id = @id
select @pages = @pages + isnull(sum(used), 0)
from sysindexes
where indid = 255
and id = @id
update #spt_space
set data = @pages
update #spt_space
set indexp = (select sum(used)
from sysindexes
where indid in (0, 1, 255)
and id = @id)
- data
update #spt_space
set unused = reserved
- (select sum(used)
from sysindexes
where indid in (0, 1, 255)
and id = @id)
update #spt_space
set rows = i.rows
from sysindexes i
where i.indid < 2
and i.id = @id
INSERT INTO HY_SPACE
select name = object_name(@id),
rows = convert(char(11), rows),
reserved = ltrim(str(reserved * d.low / 1024.,15,0) +
' ' + 'KB'),
data = ltrim(str(data * d.low / 1024.,15,0) +
' ' + 'KB'),
index_size = ltrim(str(indexp * d.low / 1024.,15,0) +
' ' + 'KB'),
unused = ltrim(str(unused * d.low / 1024.,15,0) +
' ' + 'KB')
from #spt_space, master.dbo.spt_values d
where d.number = 1
and d.type = 'E'
RETURN
end
return (0)
GO
3、主存儲過程
create procere alltablecount as
declare @name varchar(100)
TRUNCATE TABLE HY_SPACE
declare tablecur cursor for select name from sysobjects where xtype= 'u '
create table #tablecount(tablename varchar(100),reccount int)
open tablecur
fetch next from tablecur into @name
while @@fetch_status!=-1
begin
exec ('insert into #tablecount select tablename='''+@name+''',reccount=count(1) from '+@name+' ')
EXEC HYspaceused @NAME
fetch next from tablecur into @name
end
close tablecur
deallocate tablecur
select * from #tablecount order by reccount desc
select * from HY_SPACE
GO
❹ Sqlserver怎麼求一個數占總數的百分之幾
select 12/23 * 100 ||'%' from al;
mysql 伺服器支持 # 到該行結束、-- 到該行結束 以及 /* 行中間或多個行 */ 的注釋方格:
mysql> SELECT 1+1; # 這個注釋直到該行結束
mysql> SELECT 1+1; -- 這個注釋直到該行結束
mysql> SELECT 1 /* 這是一個在行中間的注釋 */ + 1;
mysql> SELECT 1+
/*
這是一個
多行注釋的形式
*/
1;
注意 -- (雙長劃) 注釋風格要求在兩個長劃後至少有一個空格!
盡管伺服器理解剛才描述的注釋句法,但 MySQL 客戶端的語法分析在 /* ... */ 注釋方式上還有所限止:
單引號和雙引號被用來標志一個被引用字元串的開始,即使是在一個注釋中。如果注釋中的引號沒有另一個引號與之配對,那和語法分析程序就不會認為注釋結束。如果你以互動式運行 mysql,你會產生困惑,因為提示符從 mysql> 變為 '> 或 ">。
一個分號被用於指出當前 SQL 語句的結束並且跟隨它的任何東西表示下一行的開始。
不論你是以互動式運行 mysql 還是將命令放在一個文件中,然後以 mysql < some-file 告訴 mysql 讀取它的輸入,這個限制均存在。
❺ sqlserver 2005如何某門課程查詢大於90分以上的人數占總中人數的比例
你演算法基本正確
就是不能這么寫,你看看下邊的寫法
selectcast(cast((a.count1+0.0)*100/b.count2asdecimal(18,2))asvarchar)+'%'[優秀率(%)]
from
(selectcount(1)count1fromgradewherecno='0001'andgrade>=90)a,
(selectcount(1)count2fromgradewherecno='0001')b
❻ sqlserver 2000怎麼計算累計百分比
--sql 2000
declare @tb table(row int identity(1,1),故障總成件 varchar(100),數量 int,佔比 float)
insert into @tb select * from tb
select 故障總成件,數量,佔比,累計百分比=(select sum(佔比) from @tb t2 where t2.row<=t1.row) from @tb t1
--sql 2005
with tc as(
select row=row_number()over(order by getdate()),* from tb
),
cte as(
select *,累計百分比=cast(佔比 as decimal(28,3)) from tc where row=1 union all
select t.row,t.故障總成件,t.數量,t.佔比,cast(c.累計百分比+t.佔比 as decimal(28,3)) from tc t join cte c on t.row=c.row+1
)
select * from cte
❼ SQLSERVER資料庫求每列不同數據所佔百分比
如果只有abc這三種數據的話,就應該這樣做:
先求出a的個數:select count(*) from table where name='a',
再求出總數據的個數:select count(*) from table
你可以先定義一個變數,那麼a所佔的比例就是:
declare @avg float
set @avg =select count(*) from table where name='a'/select count(*) from table
後面的依次類推。。。。
如果不止這三種數據的話,你可以先用group by先分一下組,然後再求比例。
❽ 為什麼SQLServer會佔用這么大的內存
簡單回答:
因為它的設計是為了提供最高效快速的數據服務。它會盡可能利用(佔用)電腦的內存、CPU資源來做數據服務。
1、SQL Server是資料庫系統,它的設計目標就是以當前設備硬體的最大的資源來為其它或自已提供最高效快速的數據查詢、存儲、運算支持。
2、所以,它在運行過程中,默認情況下,會佔用較大的內存,會用較高的CPU性能,因為它可不管你的想法是什麼,它的想法就是時刻准備著,查詢、存儲、運算數據。它會將它認為最常用的數據調入內存中,以加快查詢速度,會不停的想法兒優化演算法,優化物理存儲位置,以做到盡可能的最快的速度提供操作者想要的數據。
3、SQL Server對內存的佔用是可以調定與調整的,在起動 「企業管理器」或「SQL Server Management Studio」在裡面點擊樹狀結構的根目錄,點屬性,到裡面相關的參數處可設定資料庫的內存佔用。提示的是,過小的內存佔用會引發SQL Server的運行故障。
4、個人電腦,安裝它用於調試、編程學習、或某些特定軟體數據支持,不用時,可以去控制面版的「服務」中,關閉「SQLServer」相關服務,即可讓它不再佔用系統資源,但這並不是太方便,而且只適用於對電腦比較熟悉的朋友。
❾ SQL實現佔比
sqlserver寫法
創建表
createtabletest
(idint,
namevarchar(1))
insertintotestvalues(1,'a')
insertintotestvalues(2,'a')
insertintotestvalues(1,'a')
insertintotestvalues(1,'a')
insertintotestvalues(2,'a')
執行
selecta.id,a.count1,(a.count1+0.0)/b.count2
from
(selectid,count(*)count1fromtestgroupbyid)a,
(selectcount(*)count2fromtest)b
結果
❿ 如何釋放Sqlserver所佔得內存
sql server 在查詢大數據量的數據時,總會佔用大量的內存,並且居高不下,一不小心就會死機。
下面這個是我從網上找到的:
當你查詢數據的數據量比較大時,sqlserver會把查詢結果緩存在內存中,保證你下次查詢同樣的記錄時會很快得到結果,所以內存使用量會激增。
在你完成此次查詢後,sqlserver不會馬上釋放內存,數據會仍然放在內存中,這是sqlserver的優化策略,sqlserver會不斷地佔用你的系統內存,來加快sqlserver的運行速度,當你的系統中的其它服務也需要內存時,它才會自動釋放部分內存。一句話,sqlserver不會讓你的系統有閑置的內存,除非你設置sqlserver的最大內存使用量。這樣也沒什麼不好,如果你的系統很大,單獨給sqlserver一台機器,這樣會提高它的性能。
如果你只是開發用,要想讓sqlserver釋放內存,重啟sqlserver的服務就行了。如果不想讓sqlserver佔用太多內存,設置sqlserver的最大內存佔用量.
設置最大內存後效果好了不少!